function Слежение(события, изображения, тела) { this.создать = function() { this.умолчание = { смещение: [0, 0], скорость: 1, предел: 0, }; this.задано = {}; события.подписать(this); }; this.обновить = function() { for (var имя in this.задано) { var за = this.задано[имя]; this.расположитьИзображение(за); } }; this.обработатьКлюч = function(ключ, путь, значение) { if (путь[0] != "слежение") { return; } var имя = путь[1]; var свойство = путь.slice(2).join("."); if (!this.задано[имя]) { this.задано[имя] = {}; } this.задано[имя][свойство] = значение; }; this.расположитьИзображение = function(за) { var тело = тела.тела[за.тело]; if (!тело) { return; } var элемент = изображения.элементы[за.изображение]; var ум = 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, скорость, предел); элемент.dataset.слежениеX = x; элемент.dataset.слежениеY = y; изображения.обновитьРасположение(за.изображение, 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.создать(); };