From bf6d8a06cd11405925425d128490e8d47c57a91e 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, 19 Jul 2021 14:44:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D1=82=D0=BE=D0=BB=D0=BA=D0=BD=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 120.физика.js | 18 ----- 260.столкновения.js | 135 ++++++++++++++++++++++++++++++++ 700.пуск.js | 1 + 800.пример.json.js | 8 ++ index.html | 1 + 5 files changed, 145 insertions(+), 18 deletions(-) create mode 100644 260.столкновения.js diff --git a/120.физика.js b/120.физика.js index 97d6f38..8171eb7 100644 --- a/120.физика.js +++ b/120.физика.js @@ -8,24 +8,6 @@ }, создать: function() { мир.физика.движок = Matter.Engine.create(мир.физика.настройки); - - -Matter.Events.on(мир.физика.движок, "collisionActive", function(событие) { - var пары = событие.pairs; - var вывод = ""; - for (var номер in пары) - { - var пара = пары[номер]; - var имя1 = мир.объекты.имена[пара.bodyA.id]; - var имя2 = мир.объекты.имена[пара.bodyB.id]; - вывод += `${имя1} x ${имя2}, `; - -//console.debug("столкновение объектов", пара.bodyA.id, пара.bodyB.id); - } -document.getElementById("отладка").innerHTML = вывод; -}); - - }, обновить: function() { Matter.Engine.update(мир.физика.движок); diff --git a/260.столкновения.js b/260.столкновения.js new file mode 100644 index 0000000..6032635 --- /dev/null +++ b/260.столкновения.js @@ -0,0 +1,135 @@ +мир.столкновения = { + задано: {}, +}; + + +// // // // + + +мир.ключники.push(function(ключ, путь, значение){ + if (!путь[0].startsWith("столкновения")) + { + return; + } + + var действие = путь[1]; + var объект = путь.slice(2).join("."); + + if (!мир.столкновения.задано[действие]) + { + мир.столкновения.задано[действие] = {}; + } + мир.столкновения.задано[действие][объект] = значение; +}); + + +// // // // + + +мир.столкновения.создать = function() +{ + Matter.Events.on(мир.физика.движок, "collisionActive", мир.столкновения.обработать); +}; + + +// // // // + + +мир.столкновения.обработать = function(событие) +{ + var за = мир.столкновения.задано; + +var вывод = ""; + for (var действие in за) + { + var имя1 = за[действие]["0"]; + var имя2 = за[действие]["1"]; + if (!имя1 || !имя2) + { + continue; + } + + var пары = событие.pairs; + for (var номер in пары) + { + var пара = пары[номер]; + var п1 = мир.объекты.имена[пара.bodyA.id]; + var п2 = мир.объекты.имена[пара.bodyB.id]; + + if ( + !((имя1 == п1) && (имя2 == п2)) && + !((имя1 == п2) && (имя2 == п1)) + ) { + continue; + } + +вывод += `${имя1} x ${имя2}, `; +console.debug("столкновение ожидаемых объектов", пара.bodyA.id, пара.bodyB.id); + } + } +document.getElementById("отладка").innerHTML = вывод; +}; + + +// // // // + + +/* +мир.слежение.элемент = function(задано) +{ + var id = null; + var изображение = задано["изображение"]; + if (изображение) + { + id = мир.изображения.элементы[изображение].id; + } + return document.getElementById(id); +}; + + +// // // // + + +мир.слежение.обновитьЭлемент = function(элемент, тело, задано, умолчание, формула) +{ + if (!элемент || !тело) + { + return; + } + var скорость = задано.скорость ? задано.скорость : умолчание.скорость; + var смещениеX = задано["смещение.0"] ? задано["смещение.0"] : умолчание.смещение[0]; + var смещениеY = задано["смещение.1"] ? задано["смещение.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 = тело.position.x + смещениеX; + var y1 = тело.position.y + смещениеY; + // Более точная настройка. + // Сейчас лишь для камеры. + if (формула) + { + var итог = формула(x1, y1); + x1 = итог[0]; + y1 = итог[1]; + } + // Плавно. + 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`; +}; +*/ diff --git a/700.пуск.js b/700.пуск.js index aa1bbe1..474beb6 100644 --- a/700.пуск.js +++ b/700.пуск.js @@ -9,4 +9,5 @@ // Запустить. мир.физика.создать(); +мир.столкновения.создать(); мир.обновить(); diff --git a/800.пример.json.js b/800.пример.json.js index e42aa78..bf7a7bc 100644 --- a/800.пример.json.js +++ b/800.пример.json.js @@ -314,4 +314,12 @@ скорость: 0.1, }, }, + столкновения: { + подкинутьСтрелу: ["кирпич", "сенсор"], + }, + действия: { + подкинутьСтрелу: [ + () => { console.debug("НАДО подкинуть стрелу"); }, + ], + }, }); diff --git a/index.html b/index.html index f956c46..036880d 100644 --- a/index.html +++ b/index.html @@ -37,6 +37,7 @@ +