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