|
|
@@ -0,0 +1,112 @@ |
|
|
|
function Слежение(корень, изображения, тела, объекты) |
|
|
|
{ |
|
|
|
this.создать = function() |
|
|
|
{ |
|
|
|
this.умолчание = { |
|
|
|
смещение: [0, 0], |
|
|
|
скорость: 1, |
|
|
|
}; |
|
|
|
this.задано = {}; |
|
|
|
}; |
|
|
|
|
|
|
|
this.обработатьКлюч = function(ключ, путь, значение) |
|
|
|
{ |
|
|
|
var имя = путь[1]; |
|
|
|
var свойство = путь.slice(2).join("."); |
|
|
|
if (!this.задано[имя]) |
|
|
|
{ |
|
|
|
this.задано[имя] = {}; |
|
|
|
} |
|
|
|
this.задано[имя][свойство] = значение; |
|
|
|
}; |
|
|
|
|
|
|
|
this.обновить = function() |
|
|
|
{ |
|
|
|
for (var имя in this.задано) |
|
|
|
{ |
|
|
|
var за = this.задано[имя]; |
|
|
|
if (имя == "камера") |
|
|
|
{ |
|
|
|
this.расположитьЭлемент(корень, за, this.расположениеКамеры); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var изо = изображения.элементы[за["изображение"]]; |
|
|
|
this.расположитьЭлемент(изо, за); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
this.расположитьЭлемент = function(элемент, за, формула) |
|
|
|
{ |
|
|
|
var тело = null; |
|
|
|
if (за["объект"]) |
|
|
|
{ |
|
|
|
тело = объекты.тела[за["объект"]]; |
|
|
|
} |
|
|
|
else if (за["тело"]) |
|
|
|
{ |
|
|
|
тело = тела.тела[за["тело"]]; |
|
|
|
} |
|
|
|
|
|
|
|
var ум = this.умолчание; |
|
|
|
|
|
|
|
// Параметры. |
|
|
|
var скорость = за.скорость ? за.скорость : ум.скорость; |
|
|
|
var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0]; |
|
|
|
var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1]; |
|
|
|
|
|
|
|
// Текущая позиция. |
|
|
|
var x0 = 0; |
|
|
|
if (элемент.dataset.слежениеX) |
|
|
|
{ |
|
|
|
x0 = элемент.dataset.слежениеX; |
|
|
|
} |
|
|
|
var y0 = 0; |
|
|
|
if (элемент.dataset.слежениеY) |
|
|
|
{ |
|
|
|
y0 = элемент.dataset.слежениеY; |
|
|
|
} |
|
|
|
|
|
|
|
// Целевая позиция. |
|
|
|
var x1 = тело.position.x + смещениеX; |
|
|
|
var y1 = тело.position.y + смещениеY; |
|
|
|
|
|
|
|
// Преобразование целевой позиции. |
|
|
|
// Сейчас лишь для камеры. |
|
|
|
if (формула) |
|
|
|
{ |
|
|
|
var итог = формула(x1, y1); |
|
|
|
x1 = итог[0]; |
|
|
|
y1 = итог[1]; |
|
|
|
} |
|
|
|
|
|
|
|
// Устанавливаемая плавно позиция. |
|
|
|
var x = this.lerp(x0, x1, скорость); |
|
|
|
var y = this.lerp(y0, y1, скорость); |
|
|
|
|
|
|
|
элемент.dataset.слежениеX = x; |
|
|
|
элемент.dataset.слежениеY = y; |
|
|
|
элемент.style.transform = `translate(${x}px, ${y}px)`; |
|
|
|
}; |
|
|
|
|
|
|
|
this.расположениеКамеры = function(x, y) |
|
|
|
{ |
|
|
|
return [ |
|
|
|
window.innerWidth / 2 - x, |
|
|
|
window.innerHeight / 2 - y, |
|
|
|
]; |
|
|
|
}; |
|
|
|
|
|
|
|
this.lerp = function(v0, v1, t) { |
|
|
|
// Убираем мельтешение. |
|
|
|
var delta = Math.abs(v0 - v1); |
|
|
|
if (delta < 1) { |
|
|
|
return v0; |
|
|
|
} |
|
|
|
return v0 * (1 - t) + v1 * t; |
|
|
|
}; |
|
|
|
|
|
|
|
// Конструктор. |
|
|
|
this.создать(); |
|
|
|
}; |