From 9857f7ff063a5368aba7322b54cbe2ed3b2a77d6 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: Mon, 12 Jul 2021 15:07:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D0=B7=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D1=87=D0=B8=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 240.слежения.js | 112 +++++++++++++++++++++++++++++++++++++-- 700.пуск.js | 2 +- 800.пример.json.js | 4 +- 3 files changed, 111 insertions(+), 7 deletions(-) diff --git a/240.слежения.js b/240.слежения.js index 6c19e0a..30dd185 100644 --- a/240.слежения.js +++ b/240.слежения.js @@ -1,6 +1,10 @@ -мир.камера = { +мир.слежения = { + умолчание: { + смещение: [0, 0], + скорость: 1, + }, задано: {}, - обновить: обновитьКамеру, + обновить: обновитьСлежения, }; @@ -8,19 +12,117 @@ мир.ключники.push(function(ключ, путь, значение){ - if (!ключ.startsWith("камера")) + if (!путь[0].startsWith("слежения")) { return; } - var свойство = путь.slice(1).join("."); - мир.камера.задано[свойство] = значение; + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + + if (!мир.слежения.задано[имя]) + { + мир.слежения.задано[имя] = {}; + } + мир.слежения.задано[имя][свойство] = значение; +console.debug("слежения.задано имя/свойство", имя, свойство); }); // // // // +function обновитьСлежения() +{ + var за = мир.слежения.задано; + var ум = мир.слежения.умолчание; + if (!ум) + { + return; + } + + for (var имя in за) + { + var эл = null; + if (имя == "камера") + { + эл = document.getElementById("корень"); + } + else + { + эл = элементСлежения(за[имя]); + } + var тело = null; + var имяТела = за[имя]["объект"]; + if (имяТела) + { + тело = мир.объекты.тела[имяТела]; + } + обновитьЭлемент(эл, тело, за[имя], ум); + } +} + + +// // // // + + +function элементСлежения(задано) +{ + var id = null; + var изображение = задано["изображение"]; + if (изображение) + { + id = мир.изображения.элементы[изображение].id; + } + return document.getElementById(id); +} + + +// // // // + + +function обновитьЭлемент(элемент, тело, задано, умолчание) +{ + if (!элемент || !тело) + { + return; + } +console.debug("обновитьЭлемент", элемент, тело, задано, умолчание); + var скорость = задано.скорость ? задано.скорость : умолчание.скорость; + var смещениеX = задано.смещение ? задано.смещение[0] : умолание.смещение[0]; + var смещениеY = задано.смещение ? задано.смещение[1] : умолание.смещение[1]; + + // Сейчас. + var x0 = 0; + if (элемент.style.left.endsWith("px")) + { + x0 = элемент.style.left.slice(0, -2); + } + var y0 = 0; + if (элемент.style.top.endsWith("px")) + { + y0 = элемент.style.top.slice(0, -2); + } + // Цель. + //var x1 = window.innerWidth / 2 - тело.position.x; + //var y1 = window.innerHeight / 2 - тело.position.y; + var x1 = тело.position.x + смещениеX; + var y1 = тело.position.y + смещениеY; + // Плавно. + function lerp(v0, v1, t) { + return v0 * (1 - t) + v1 * t; + } + var x = lerp(x0, x1, скорость); + var y = lerp(y0, y1, скорость); + + корень.style.left = `${x}px`; + корень.style.top = `${y}px`; +} + + +// // // // + + function обновитьКамеру() { var объект = мир.камера.задано.объект; diff --git a/700.пуск.js b/700.пуск.js index c0a07e4..5e4d662 100644 --- a/700.пуск.js +++ b/700.пуск.js @@ -3,7 +3,7 @@ мир.физика.обновить(); мир.объекты.обновить(); мир.игрок.обновить(); - мир.камера.обновить(); + мир.слежения.обновить(); requestAnimationFrame(мир.обновить); }; diff --git a/800.пример.json.js b/800.пример.json.js index 84f57da..380556f 100644 --- a/800.пример.json.js +++ b/800.пример.json.js @@ -113,13 +113,15 @@ }, */ слежения: { + /* камера: { объект: "кирпич", скорость: 0.1, }, + */ колобок: { объект: "кирпич", - изоражение: "колобок", + изображение: "колобок", смещение: [0, 0], скорость: 1, },