Files
mjs/350.слежение.js

115 lines
3.7 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.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};
this.обновить = function()
{
for (var имя in this.задано)
{
var за = this.задано[имя];
if (имя == "камера")
{
this.расположитьЭлемент(корень, за, this.расположениеКамеры);
}
else
{
/**///console.debug("слежение.обновить эл", имя);
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;
/**///console.debug("x0/y0:", x0, y0, "x1/y1:", x1, y1);
// Преобразование целевой позиции.
// Сейчас лишь для камеры.
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.создать();
};