|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- function Тела(события, физмир)
- {
- this.создать = function()
- {
- this.умолчание = {
- x: 0,
- y: 0,
- ширина: 40,
- высота: 20,
- часть: 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.создать();
- }
-
|