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.создать(); }