diff --git a/3.3/проигрыватель/140.Тела.js b/3.3/проигрыватель/140.Тела.js new file mode 100644 index 0000000..0936569 --- /dev/null +++ b/3.3/проигрыватель/140.Тела.js @@ -0,0 +1,124 @@ +function Тела(события, физмир) +{ + this.создать = function() + { + this.умолчание = { + x: 0, + y: 0, + ширина: 40, + высота: 20, + угол: 0, + часть: false, + физика: { + isStatic: true, + }, + }; + + this.задано = {}; + this.тела = {}; + this.имена = {}; + события.подписать(this); + }; + + this.именаЧастей = function(за) + { + var имена = []; + for (var ключ in за) + { + if (ключ.startsWith("части")) + { + имена.push(за[ключ]); + } + } + return имена; + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + if (путь[0] != "тела") + { + return; + } + + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + if (!this.задано[имя]) + { + this.задано[имя] = {}; + } + this.задано[имя][свойство] = значение; + + this.пересоздатьТело(имя); + }; + + this.пересоздатьТело = function(имя) { + // Удаляем старое тело. + if (имя in this.тела) + { + var тело = this.тела[имя]; + delete this.имена[тело.id]; + // Всегда удаляем из мира: и составные, и несоставные тела. + Matter.Composite.remove(физмир, тело); + } + + var за = this.задано[имя]; + var ум = this.умолчание; + 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 тело = null; + // Создаём новое составное тело. + if (за["части.0"]) + { + параметры["parts"] = this.телаЧастей(this.именаЧастей(за)); + тело = Matter.Body.create(параметры); + } + // Создаём новое несоставное тело. + // Вполне может быть частью другого составного тела. + else + { + тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры); + } + this.тела[имя] = тело; + this.имена[тело.id] = имя; + + // Добавляем тело в физический мир, если оно не является частью другого составного тела. + var часть = за.часть ? за.часть : ум.часть; + if (!часть) + { + Matter.Composite.add(физмир, тело); + } + }; + + this.телаЧастей = function(имена) + { + var тела = []; + for (var н in имена) + { + var имя = имена[н]; + var тело = this.тела[имя]; + тела.push(тело); + } + return тела; + }; + + // Конструктор. + this.создать(); +} + diff --git a/3.3/проигрыватель/700.Игра.js b/3.3/проигрыватель/700.Игра.js index ba58beb..0e56a4c 100644 --- a/3.3/проигрыватель/700.Игра.js +++ b/3.3/проигрыватель/700.Игра.js @@ -11,6 +11,7 @@ function Игра() new Изображения(корень), ]; мир.физика = new Физика(); + мир.тела = new Тела(мир.события, мир.физика.движок.world); var z64 = мир.параметрыЗапуска()["z64"]; this.исполнитьКод(z64); diff --git a/3.3/проигрыватель/index.html b/3.3/проигрыватель/index.html index d1cd8c2..0556def 100644 --- a/3.3/проигрыватель/index.html +++ b/3.3/проигрыватель/index.html @@ -23,6 +23,7 @@ +