function Сцена(состояние, события, тела, адресИгры) { this.создать = function() { this.умолчание = { скорость: [1, 1], }; this.задано = {}; this.сцены = null; события.подписать(this); }; this.загрузитьСцену = function(имя) { let z64 = this.сцены[имя]; window.location = адресИгры + z64; }; this.загрузитьОглавление = function(адрес) { var тут = this; var запрос = new XMLHttpRequest(); запрос.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { тут.разобратьОглавление(this.responseText); } else { console.error("Не удалось загрузить оглавление сцен:", this.status); } } } запрос.open("GET", адрес); запрос.send(); }; this.обновить = function() { this.переместитьИгрока(); }; this.обработатьКлюч = function(ключ, путь, значение) { if (путь[0] != "сцена") { return; } var свойство = путь.slice(1).join("."); this.задано[свойство] = значение; if (свойство == "оглавление") { this.загрузитьОглавление(значение); } }; this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель) { var тип = this.задано["тип"]; var игрок = this.задано["игрок"]; var цель = this.задано["цель"]; if (!тип || !игрок || !цель || тип != "указать и нажать") { return; } var тело = тела.тела[цель]; if (!тело) { return; } var пр = [ тело.bounds.min.x, тело.bounds.min.y, тело.bounds.max.x - тело.bounds.min.x, тело.bounds.max.y - тело.bounds.min.y, ] let ширина = пр[2]; пр[0] = x - ширина; состояние.разобрать({ тела: { [цель]: { пр: пр, }, }, }); }; this.обработатьСобытие = function(событие) { let мышь = "мышь/нажатие/"; let сцена = "сцена/"; if (событие.startsWith(мышь)) { let значения = событие.substring(мышь.length).split("/"); let x = Number(значения[0]); let y = Number(значения[1]); let указатель = значения[2]; this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель); } else if (событие.startsWith(сцена)) { let название = событие.substring(сцена.length); this.загрузитьСцену(название); } }; this.переместитьИгрока = function() { let тип = this.задано["тип"]; let игрок = this.задано["игрок"]; let цель = this.задано["цель"]; let скоростьX = this.задано["скорость.0"]; if (!тип || !игрок || !цель || !скоростьX || тип != "указать и нажать") { return; } let телоЦели = тела.тела[цель]; let телоИгрока = тела.тела[игрок]; if (!телоЦели || !телоИгрока) { return; } let игрокX = телоИгрока.position.x; let цельX = телоЦели.position.x; let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x; let расстояние = цельX - игрокX; if (Math.abs(расстояние) < ширина / 2) { return; } let направление = расстояние > 0 ? 1 : -1; Matter.Sleeping.set(телоИгрока, false); Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 }); }; this.разобратьОглавление = function(содержимое) { let код = "this.сцены = " + содержимое; eval(код); }; // Конструктор. this.создать(); };