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

92 lines
2.9 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,
};
this.задано = {};
события.подписать(this);
};
this.обновить = function()
{
for (var имя in this.задано)
{
var за = this.задано[имя];
var изо = изображения.элементы[за.изображение];
this.расположитьЭлемент(изо, за);
}
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "слежение")
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.расположитьЭлемент = function(элемент, за)
{
var тело = тела.тела[за.тело];
if (!тело)
{
return;
}
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;
// Устанавливаемая плавно позиция.
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`;
};
this.lerp = function(v0, v1, t) {
// Убираем мельтешение.
var delta = Math.abs(v0 - v1);
if (delta < 1) {
return v0;
}
return v0 * (1 - t) + v1 * t;
};
// Конструктор.
this.создать();
};