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