function Объекты(состояние, события) { this.создать = function() { this.умолчание = { пр: [0, 0, 40, 20], }; this.задано = {}; события.подписать(this); }; // Ключи и события. this.обработатьКлюч = function(ключ, путь, значение) { if (путь[0] != "объекты") { return; } let имя = путь[1]; let свойство = путь.slice(2).join("."); if (!this.задано[имя]) { this.задано[имя] = {}; } this.задано[имя][свойство] = значение; let производноеИмя = `объекты-${имя}`; if (свойство.startsWith("пр.")) { let пр = this.пр(имя); this.обновитьПозициюРазмер(производноеИмя, пр); this.обновитьСлежение(производноеИмя, пр); let вид = this.задано[имя]["вид"]; let анимация = this.задано[имя]["анимация"]; this.обновитьИзображение(производноеИмя, пр, вид, анимация); } else if (свойство == "физика") { this.обновитьФизику(производноеИмя, значение); } else if ( свойство == "вид" || свойство == "анимация" ) { let вид = this.задано[имя]["вид"]; let анимация = this.задано[имя]["анимация"]; this.обновитьИзображение(производноеИмя, null, вид, анимация); } }; this.обработатьСобытие = function(событие) { let в = "виды/"; let а = "анимации/"; if (событие.startsWith(в)) { let вид = событие.substring(в.length); this.обновитьОбъектыВида(вид); } else if (событие.startsWith(а)) { let анимация = событие.substring(а.length); this.обновитьОбъектыАнимации(анимация); } }; this.обновитьОбъектыАнимации = function(анимация) { for (let имя in this.задано) { let за = this.задано[имя]; let зан = за["анимация"]; if (зан && зан == анимация) { this.обновитьВидАнимацию(имя); } } }; this.обновитьОбъектыВида = function(вид) { for (let имя in this.задано) { let за = this.задано[имя]; let зви = за["вид"]; if (зви && зви == вид) { this.обновитьВидАнимацию(имя); } } }; this.обновитьВидАнимацию = function(имя) { let вид = this.задано[имя]["вид"]; let анимация = this.задано[имя]["анимация"]; let производноеИмя = `объекты-${имя}`; this.обновитьИзображение(производноеИмя, null, вид, анимация); }; this.обновитьИзображение = function(имя, пр, вид, анимация) { var описание = { вид: вид, анимация: анимация, }; if (пр) { описание["пр"] = пр; } состояние.разобрать({ изображения: { [имя]: описание, }, }); }; this.обновитьПозициюРазмер = function(имя, пр) { состояние.разобрать({ тела: { [имя]: { пр: пр, }, }, }); }; this.обновитьСлежение = function(имя, пр) { состояние.разобрать({ слежение: { [имя]: { изображение: имя, тело: имя, смещение: [-пр[2] / 2, -пр[3] / 2], }, }, }); }; this.обновитьФизику = function(имя, значение) { состояние.разобрать({ тела: { [имя]: { физика: значение, }, }, }); }; this.пр = function(имя) { let за = this.задано[имя]; let пр = this.умолчание.пр; return [ за["пр.0"] ? за["пр.0"] : пр[0], за["пр.1"] ? за["пр.1"] : пр[1], за["пр.2"] ? за["пр.2"] : пр[2], за["пр.3"] ? за["пр.3"] : пр[3], ]; }; // Конструктор. this.создать(); };