Files
MYPOM/3.3/проигрыватель/160.Слежение.js

98 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function Слежение(события, изображения, тела)
{
this.создать = function()
{
this.умолчание = {
смещение: [0, 0],
скорость: 1,
предел: 0,
};
this.задано = {};
события.подписать(this);
};
this.обновить = function()
{
for (var имя in this.задано)
{
var за = this.задано[имя];
this.расположитьИзображение(за);
}
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "слежение")
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.расположитьИзображение = function(за)
{
var тело = тела.тела[за.тело];
if (!тело)
{
return;
}
var элемент = изображения.элементы[за.изображение];
var ум = this.умолчание;
// Параметры.
var скорость = за.скорость ? за.скорость : ум.скорость;
var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
var предел = за.предел ? за.предел : ум.предел;
// Текущая позиция.
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;
// Radians -> Degrees.
var угол = тело.angle * 180 / Math.PI;
// Устанавливаемая плавно позиция.
var x = this.lerp(x0, x1, скорость, предел);
var y = this.lerp(y0, y1, скорость, предел);
элемент.dataset.слежениеX = x;
элемент.dataset.слежениеY = y;
изображения.обновитьРасположение(за.изображение, x, y, угол);
};
this.lerp = function(v0, v1, t, предел) {
// Убираем мельтешение в случае наличия предела.
if (предел)
{
var delta = Math.abs(v0 - v1);
if (delta < предел) {
return v0;
}
}
return v0 * (1 - t) + v1 * t;
};
// Конструктор.
this.создать();
};