diff --git a/3.3/проигрыватель/160.Слежение.js b/3.3/проигрыватель/160.Слежение.js new file mode 100644 index 0000000..8a14c11 --- /dev/null +++ b/3.3/проигрыватель/160.Слежение.js @@ -0,0 +1,91 @@ +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.создать(); +}; diff --git a/3.3/проигрыватель/700.Игра.js b/3.3/проигрыватель/700.Игра.js index 0e56a4c..d165066 100644 --- a/3.3/проигрыватель/700.Игра.js +++ b/3.3/проигрыватель/700.Игра.js @@ -6,12 +6,16 @@ function Игра() мир.события = new События(); мир.состояние = new Состояние(); мир.состояние.обработчик = (к, п, з) => { this.обработатьКлюч(к, п, з) }; + мир.физика = new Физика(); + мир.изображения = new Изображения(корень), + мир.тела = new Тела(мир.события, мир.физика.движок.world); + мир.слежение = new Слежение(мир.события, мир.изображения, мир.тела); this.ключники = [ new Заголовок(), - new Изображения(корень), + мир.изображения, + мир.тела, + мир.слежение, ]; - мир.физика = new Физика(); - мир.тела = new Тела(мир.события, мир.физика.движок.world); var z64 = мир.параметрыЗапуска()["z64"]; this.исполнитьКод(z64); @@ -31,6 +35,7 @@ function Игра() this.обновить = function() { мир.физика.обновить(); + мир.слежение.обновить(); var тут = this; requestAnimationFrame(function() { diff --git a/3.3/проигрыватель/index.html b/3.3/проигрыватель/index.html index 0556def..67c26df 100644 --- a/3.3/проигрыватель/index.html +++ b/3.3/проигрыватель/index.html @@ -6,6 +6,9 @@