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