Files
MYPOM/6.0/игра/160.Слежение.js

120 lines
4.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.обновить = function()
{
for (var имя in this.задано)
{
this.расположитьИзображение(имя);
}
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "слежение")
{
return;
}
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.расположитьИзображение = function(имя)
{
let за = this.задано[имя];
let тело = тела.тела[за.тело];
let элемент = изображения.элементы[за.изображение];
if (!тело || !элемент)
{
return;
}
let ум = 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, скорость, предел);
// Ничего не делаем, если разница ничтожна.
let ничтожно = 0.00001;
if (
элемент.dataset.слежениеX != null &&
элемент.dataset.слежениеY != null &&
элемент.dataset.слежениеУгол != null &&
Math.abs(элемент.dataset.слежениеX - x) < ничтожно &&
Math.abs(элемент.dataset.слежениеY - y) < ничтожно &&
Math.abs(элемент.dataset.слежениеУгол - угол) < ничтожно
) {
return;
}
// Иначе применяем новые значения.
элемент.dataset.слежениеX = x;
элемент.dataset.слежениеY = y;
элемент.dataset.слежениеУгол = угол;
var описание = {
пр: [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.создать();
};