|
- 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.создать();
- };
|