|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- function Тела(физмир)
- {
- this.создать = function()
- {
- this.умолчание = {
- пр: [0, 0, 40, 20],
- части: [],
- часть: false,
- };
-
- 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.умолчание;
- let пр = this.пр(имя);
- // Переводим x,y из левого верхнего угла в центр.
- пр[0] = пр[0] + пр[2] / 2.0;
- пр[1] = пр[1] + пр[3] / 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(пр[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.создать();
- }
-
|