|
|
@@ -5,6 +5,7 @@ function Слежение(события, изображения, тела) |
|
|
|
this.умолчание = { |
|
|
|
смещение: [0, 0], |
|
|
|
скорость: 1, |
|
|
|
предел: 0, |
|
|
|
}; |
|
|
|
this.задано = {}; |
|
|
|
события.подписать(this); |
|
|
@@ -15,8 +16,7 @@ function Слежение(события, изображения, тела) |
|
|
|
for (var имя in this.задано) |
|
|
|
{ |
|
|
|
var за = this.задано[имя]; |
|
|
|
var изо = изображения.элементы[за.изображение]; |
|
|
|
this.расположитьЭлемент(изо, за); |
|
|
|
this.расположитьИзображение(за); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
@@ -36,7 +36,7 @@ function Слежение(события, изображения, тела) |
|
|
|
this.задано[имя][свойство] = значение; |
|
|
|
}; |
|
|
|
|
|
|
|
this.расположитьЭлемент = function(элемент, за) |
|
|
|
this.расположитьИзображение = function(за) |
|
|
|
{ |
|
|
|
var тело = тела.тела[за.тело]; |
|
|
|
if (!тело) |
|
|
@@ -44,12 +44,14 @@ function Слежение(события, изображения, тела) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
var элемент = изображения.элементы[за.изображение]; |
|
|
|
var ум = this.умолчание; |
|
|
|
|
|
|
|
// Параметры. |
|
|
|
var скорость = за.скорость ? за.скорость : ум.скорость; |
|
|
|
var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0]; |
|
|
|
var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1]; |
|
|
|
var предел = за.предел ? за.предел : ум.предел; |
|
|
|
|
|
|
|
// Текущая позиция. |
|
|
|
var x0 = 0; |
|
|
@@ -66,22 +68,26 @@ function Слежение(события, изображения, тела) |
|
|
|
// Целевая позиция. |
|
|
|
var x1 = тело.position.x + смещениеX; |
|
|
|
var y1 = тело.position.y + смещениеY; |
|
|
|
// Radians -> Degrees. |
|
|
|
var угол = тело.angle * 180 / Math.PI; |
|
|
|
|
|
|
|
// Устанавливаемая плавно позиция. |
|
|
|
var x = this.lerp(x0, x1, скорость); |
|
|
|
var y = this.lerp(y0, y1, скорость); |
|
|
|
var x = this.lerp(x0, x1, скорость, предел); |
|
|
|
var y = this.lerp(y0, y1, скорость, предел); |
|
|
|
|
|
|
|
элемент.dataset.слежениеX = x; |
|
|
|
элемент.dataset.слежениеY = y; |
|
|
|
элемент.style.left = `${x}px`; |
|
|
|
элемент.style.top = `${y}px`; |
|
|
|
изображения.обновитьРасположение(за.изображение, x, y, угол); |
|
|
|
}; |
|
|
|
|
|
|
|
this.lerp = function(v0, v1, t) { |
|
|
|
// Убираем мельтешение. |
|
|
|
var delta = Math.abs(v0 - v1); |
|
|
|
if (delta < 1) { |
|
|
|
return v0; |
|
|
|
this.lerp = function(v0, v1, t, предел) { |
|
|
|
// Убираем мельтешение в случае наличия предела. |
|
|
|
if (предел) |
|
|
|
{ |
|
|
|
var delta = Math.abs(v0 - v1); |
|
|
|
if (delta < предел) { |
|
|
|
return v0; |
|
|
|
} |
|
|
|
} |
|
|
|
return v0 * (1 - t) + v1 * t; |
|
|
|
}; |
|
|
|