From 6c8ecdf0dc79d41cc5a06db6782178fb47e70e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BA=D0=BE?= Date: Thu, 19 Aug 2021 16:41:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5=20=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 350.слежение.js | 112 ++++++++++++++++++++++++++++++++++++++++ 700.пуск.js | 11 +++- index.html | 2 +- 3 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 350.слежение.js diff --git a/350.слежение.js b/350.слежение.js new file mode 100644 index 0000000..f44f5fc --- /dev/null +++ b/350.слежение.js @@ -0,0 +1,112 @@ +function Слежение(корень, изображения, тела, объекты) +{ + this.создать = function() + { + this.умолчание = { + смещение: [0, 0], + скорость: 1, + }; + this.задано = {}; + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + if (!this.задано[имя]) + { + this.задано[имя] = {}; + } + this.задано[имя][свойство] = значение; + }; + + this.обновить = function() + { + for (var имя in this.задано) + { + var за = this.задано[имя]; + if (имя == "камера") + { + this.расположитьЭлемент(корень, за, this.расположениеКамеры); + } + else + { + var изо = изображения.элементы[за["изображение"]]; + this.расположитьЭлемент(изо, за); + } + } + }; + + this.расположитьЭлемент = function(элемент, за, формула) + { + var тело = null; + if (за["объект"]) + { + тело = объекты.тела[за["объект"]]; + } + else if (за["тело"]) + { + тело = тела.тела[за["тело"]]; + } + + 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; + + // Преобразование целевой позиции. + // Сейчас лишь для камеры. + if (формула) + { + var итог = формула(x1, y1); + x1 = итог[0]; + y1 = итог[1]; + } + + // Устанавливаемая плавно позиция. + var x = this.lerp(x0, x1, скорость); + var y = this.lerp(y0, y1, скорость); + + элемент.dataset.слежениеX = x; + элемент.dataset.слежениеY = y; + элемент.style.transform = `translate(${x}px, ${y}px)`; + }; + + this.расположениеКамеры = function(x, y) + { + return [ + window.innerWidth / 2 - x, + window.innerHeight / 2 - y, + ]; + }; + + 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/700.пуск.js b/700.пуск.js index 6ad15d3..955b58f 100644 --- a/700.пуск.js +++ b/700.пуск.js @@ -2,10 +2,12 @@ function Пуск() { this.запустить = function() { - мир.физика.создать(); var корень = document.getElementById("корень"); + + мир.физика.создать(); мир.изображения = new Изображения(корень); мир.тела = new Тела(мир.физика.движок.world); + мир.слежение = new Слежение(корень, мир.изображения, мир.тела, мир.объекты); мир.столкновения.создать(); мир.звуки = new Звуки(мир.ключники, мир.события); мир.движение = new Движение(мир.ключники); @@ -20,10 +22,15 @@ function Пуск() if (путь[0] == "изображения") { мир.изображения.обработатьКлюч(ключ, путь, значение); - } else if (путь[0] == "тела") + } + else if (путь[0] == "тела") { мир.тела.обработатьКлюч(ключ, путь, значение); } + else if (путь[0] == "слежение") + { + мир.слежение.обработатьКлюч(ключ, путь, значение); + } }); }; diff --git a/index.html b/index.html index bf6552f..afdd858 100644 --- a/index.html +++ b/index.html @@ -76,7 +76,7 @@ - +