function Тела(физмир) { this.создать = function() { this.умолчание = { x: 0, y: 0, ширина: 40, высота: 20, угол: 0, часть: false, физика: { isStatic: true, }, }; this.задано = {}; this.тела = {}; this.имена = {}; }; this.обработатьКлюч = function(ключ, путь, значение) { 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 (за.части) { параметры["parts"] = 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.создать(); }