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 @@