From 08e8c370523e1c58443bbee387058ff110bd08ae 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, 16 Aug 2021 15:09:45 +0300 Subject: [PATCH] =?UTF-8?q?-=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 130.изображения.js | 6 +- 150.тела.js | 168 ++++++++++++++++++++++++++++++++++ 320.игрок.js | 4 +- 700.пуск.js | 12 ++- 800.пример.json.js | 19 ++-- 5 files changed, 191 insertions(+), 18 deletions(-) create mode 100644 150.тела.js diff --git a/130.изображения.js b/130.изображения.js index 5b18737..c178eb0 100644 --- a/130.изображения.js +++ b/130.изображения.js @@ -71,7 +71,7 @@ function Изображения(корень) var x = за.x ? за.x : ум.x; var y = за.y ? за.y : ум.y; var угол = за.угол ? за.угол : ум.угол; - this.обновитьРасположение(x, y, угол); + this.обновитьРасположение(имя, x, y, угол); } else if (свойство.startsWith("вид")) { @@ -80,8 +80,10 @@ function Изображения(корень) } }; - this.обновитьРасположение = function(x, y, угол) + this.обновитьРасположение = function(имя, x, y, угол) { + var за = this.задано[имя]; + var эл = this.элементы[имя]; var transform = `translate(${x}px, ${y}px) rotate(${угол}deg) `; if (за["вид.transform"]) { diff --git a/150.тела.js b/150.тела.js new file mode 100644 index 0000000..b456e7c --- /dev/null +++ b/150.тела.js @@ -0,0 +1,168 @@ +мир.объекты = { + умолчание: { + x: 0, + y: 0, + ширина: 40, + высота: 20, + физика: { + isStatic: true, + }, + }, + задано: {}, + тела: {}, + имена: {}, + элементы: {}, + свойстваТела: ["x", "y", "ширина", "высота", "физика"], +}; + + +// // // // + + +мир.ключники.push(function(ключ, путь, значение){ + if (!ключ.startsWith("объекты")) + { + return; + } + + var имя = путь[1]; + var свойство = путь[2]; + + if (!(имя in мир.объекты.задано)) + { + мир.объекты.задано[имя] = {}; + } + var свойствоПуть = путь.slice(2).join("."); + мир.объекты.задано[имя][свойствоПуть] = значение; + + мир.объекты.пересоздатьТело(имя, свойство); + мир.объекты.обновитьЭлемент(имя, свойство, значение); + мир.объекты.обновитьВидЭлемента(путь, имя, свойство, значение); +}); + + +// // // // + + +мир.объекты.обновить = function() +{ + for (var имя in мир.объекты.тела) + { + var тело = мир.объекты.тела[имя]; + var элемент = мир.объекты.элементы[имя]; + if (!тело || !элемент) + { + continue; + } + var засинхрили = мир.синхронизироватьЭлементТело(элемент, тело); + + // Учесть значения transform из JSON-JS. + if (засинхрили) + { + var transform = мир.объекты.задано[имя]["вид.transform"]; + if (transform) + { + элемент.style.transform += transform; + } + } + } +}; + + +// // // // + + +мир.объекты.пересоздатьТело = function(имя, свойство) +{ + if (!мир.объекты.свойстваТела.includes(свойство)) + { + return; + } + + // Удалить физическое тело. + if (имя in мир.объекты.тела) + { + var тело = мир.объекты.тела[имя]; + Matter.Composite.remove(мир.физика.движок.world, тело); + delete мир.объекты.имена[тело.id]; + } + // Пересоздать физическое тело. + var за = мир.объекты.задано[имя]; + var ум = мир.объекты.умолчание; + + var x = за.x != null ? за.x : ум.x; + var y = за.y != null ? за.y : ум.y; + var ширина = за.ширина ? за.ширина : ум.ширина; + var высота = за.высота ? за.высота : ум.высота; + // Переводим x,y из левого-верхнего угла в центр. + x = x + ширина / 2.0; + y = y + высота / 2.0; + var физика = {}; + Object.assign(физика, ум.физика); + for (var путь in за) + { + if (путь.startsWith("физика")) + { + var свойство = путь.slice(7); + мир.задать(физика, свойство, за[путь]); + } + } + + var тело = Matter.Bodies.rectangle(x, y, ширина, высота, физика); + Matter.Composite.add(мир.физика.движок.world, тело); + мир.объекты.тела[имя] = тело; + мир.объекты.имена[тело.id] = имя; +}; + + +// // // // + + +мир.объекты.обновитьЭлемент = function(имя, свойство, значение) +{ + var за = мир.объекты.задано[имя]; + var ум = мир.объекты.умолчание; + + if (!(имя in мир.объекты.элементы)) + { + var элемент = document.createElement("div"); + элемент.id = `объекты-${имя}`; + элемент.style.position = "absolute"; + элемент.style.display = "block"; + элемент.style.transformOrigin = "center"; + document.getElementById("корень").appendChild(элемент); + мир.объекты.элементы[имя] = элемент; + // Свойства по умолчанию. + элемент.style.width = `${ум.ширина}px`; + элемент.style.height = `${ум.высота}px`; + } + + var элемент = мир.объекты.элементы[имя]; + + if (свойство == "ширина") + { + var ширина = за["ширина"] ? за["ширина"] : ум["ширина"]; + элемент.style.width = `${ширина}px`; + } + else if (свойство == "высота") + { + var высота = за["высота"] ? за["высота"] : ум["высота"]; + элемент.style.height = `${высота}px`; + } +} + + +// // // // + + +мир.объекты.обновитьВидЭлемента = function(путь, имя, свойство, значение) +{ + if (свойство != "вид") + { + return; + } + + var элемент = мир.объекты.элементы[имя]; + var параметр = путь[3]; + элемент.style.setProperty(параметр, значение); +} diff --git a/320.игрок.js b/320.игрок.js index 43a4c0f..670234f 100644 --- a/320.игрок.js +++ b/320.игрок.js @@ -30,8 +30,7 @@ мир.игрок.обновить = function() { - /**///мир.игрок.тело = мир.объекты.тела[мир.игрок.задано.объект]; - мир.игрок.тело = мир.рт.тело; + мир.игрок.тело = мир.объекты.тела[мир.игрок.задано.объект]; if (!мир.игрок.тело) { return; @@ -50,7 +49,6 @@ var к = [ мир.игрок.задано["клавиши.0"], мир.игрок.задано["клавиши.1"], - //мир.игрок.задано["клавиши.2"], ]; var влево = (мир.ввод.клавиши[к[0]] == true); var вправо = (мир.ввод.клавиши[к[1]] == true); diff --git a/700.пуск.js b/700.пуск.js index 23731f3..bf79e70 100644 --- a/700.пуск.js +++ b/700.пуск.js @@ -2,14 +2,15 @@ function Пуск() { this.запустить = function() { + мир.физика.создать(); var корень = document.getElementById("корень"); мир.изображения = new Изображения(корень); - мир.физика.создать(); + //мир.тела = new Тела(); мир.столкновения.создать(); мир.звуки = new Звуки(мир.ключники, мир.события); мир.движение = new Движение(мир.ключники); - /**/мир.ограничитель = new Ограничитель(); - /**/мир.рт = new РучноеТело(мир.события); + /**///мир.ограничитель = new Ограничитель(); + /**///мир.рт = new РучноеТело(мир.события); this.настроитьОбработкуКлючей(); this.обновить(); @@ -27,9 +28,10 @@ function Пуск() this.обновить = function() { - /**/мир.ограничитель.обновить(); - /**/мир.рт.обновить(); + /**///мир.ограничитель.обновить(); + /**///мир.рт.обновить(); мир.физика.обновить(); + //мир.тела.обновить(); мир.объекты.обновить(); мир.игрок.обновить(); мир.слежение.обновить(); diff --git a/800.пример.json.js b/800.пример.json.js index 9e333a7..ba036b4 100644 --- a/800.пример.json.js +++ b/800.пример.json.js @@ -110,7 +110,12 @@ background: "url(р/отладка/основа.jpg)", //display: "none", }, + физика: { + isStatic: false, + inertia: Infinity, + }, }, + /* сенсорИгрока: { x: 170, y: 350, @@ -132,32 +137,28 @@ inertia: Infinity, }, }, + */ }, игрок: { - объект: "рт", - //объект: "кирпич", + объект: "кирпич", скорость: [5, 12.5], клавиши: ["ArrowLeft", "ArrowRight", "ArrowUp"], }, слежение: { - /* колобок: { объект: "кирпич", изображение: "колобок", смещение: [-35, -60], скорость: 1, }, - */ камера: { - объект: "рт", - //объект: "кирпич", + объект: "кирпич", скорость: 0.1, }, }, маскиПрыжков: { игрок: { - объект: "рт", - //объект: "кирпич", + объект: "кирпич", скорость: -1, маски: [1, 1|2], }, @@ -502,6 +503,7 @@ console.debug("событие", событие); объекты: ["кирпич", "паук1"], событие: "игрокПаук1", }, + /* проверкаСенсораИгрокаРТ: { объекты: ["рт", "паук1"], событие: "игрокПаукРТ", @@ -514,6 +516,7 @@ console.debug("событие", событие); объекты: ["рт2", "паук1"], событие: "игрокПаукРТ2", }, + */ }, движение: { паук1: {