Files
MYPOM/4.1/игра/200.Сцена.js

155 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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