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