|
- function Тела(события, физика, физмир)
- {
- this.создать = function()
- {
- this.умолчание = {
- пр: [0, 0, 40, 20],
- части: [],
- часть: false,
- };
-
- 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(событие)
- {
- let префикс = "физика/";
- if (событие.startsWith(префикс))
- {
- let физ = событие.substring(префикс.length);
- this.пересоздатьТелаФизики(физ);
- }
- };
-
- this.пересоздатьТелаФизики = function(физ)
- {
- for (let имя in this.задано)
- {
- let заданнаяФизика = this.задано[имя]["физика"];
- if (заданнаяФизика && заданнаяФизика == физ)
- {
- this.пересоздатьТело(имя);
- }
- }
- };
-
- this.пересоздатьТело = function(имя)
- {
- // Удаляем старое тело.
- if (имя in this.тела)
- {
- var тело = this.тела[имя];
- delete this.имена[тело.id];
- // Всегда удаляем из мира: и составные, и несоставные тела.
- Matter.Composite.remove(физмир, тело);
- }
-
- var за = this.задано[имя];
- var ум = this.умолчание;
- let пр = this.пр(имя);
- // Переводим x,y из левого верхнего угла в центр.
- пр[0] = пр[0] + пр[2] / 2.0;
- пр[1] = пр[1] + пр[3] / 2.0;
- // Параметры тела.
- var параметры = {};
- if (за.физика)
- {
- let заф = физика.задано[за.физика];
- for (let параметр in заф)
- {
- мир.задатьПолныйКлюч(параметры, параметр, заф[параметр]);
- }
- }
-
- var тело = null;
- // Создаём новое составное тело.
- if (за["части.0"])
- {
- параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
- тело = Matter.Body.create(параметры);
- }
- // Создаём новое несоставное тело.
- // Вполне может быть частью другого составного тела.
- else
- {
- тело = Matter.Bodies.rectangle(пр[0], пр[1], пр[2], пр[3], параметры);
- }
- this.тела[имя] = тело;
- this.имена[тело.id] = имя;
-
- // Добавляем тело в физический мир, если оно не является частью другого составного тела.
- var часть = за.часть ? за.часть : ум.часть;
- if (!часть)
- {
- Matter.Composite.add(физмир, тело);
- }
- };
-
- this.пр = function(имя)
- {
- let за = this.задано[имя];
- let пр = this.умолчание.пр;
- return [
- за["пр.0"] ? за["пр.0"] : пр[0],
- за["пр.1"] ? за["пр.1"] : пр[1],
- за["пр.2"] ? за["пр.2"] : пр[2],
- за["пр.3"] ? за["пр.3"] : пр[3],
- ];
- };
-
- this.телаЧастей = function(имена)
- {
- var тела = [];
- for (var н in имена)
- {
- var имя = имена[н];
- var тело = this.тела[имя];
- тела.push(тело);
- }
- return тела;
- };
-
- // Конструктор.
- this.создать();
- }
|