191 строка
6.4 KiB
JavaScript
191 строка
6.4 KiB
JavaScript
function grСцена(состояние, состояниЯ, события, тела, адресИгры)
|
|
{
|
|
this.создать = function()
|
|
{
|
|
this.задано = {};
|
|
this.сцены = null;
|
|
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(идёт, направление)
|
|
{
|
|
let стоятьЛ = this.задано["игрок.стоять.0"];
|
|
let стоятьП = this.задано["игрок.стоять.1"];
|
|
let идтиЛ = this.задано["игрок.идти.0"];
|
|
let идтиП = this.задано["игрок.идти.1"];
|
|
if (!стоятьЛ || !стоятьП || !идтиЛ || !идтиП)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var название = идтиЛ;
|
|
if (идёт && направление > 0)
|
|
{
|
|
название = идтиП;
|
|
}
|
|
else if (!идёт && направление < 0)
|
|
{
|
|
название = стоятьЛ;
|
|
}
|
|
else if (!идёт && направление > 0)
|
|
{
|
|
название = стоятьП;
|
|
}
|
|
|
|
if (this.состояниеИгрока != название)
|
|
{
|
|
состояниЯ.применить(название);
|
|
this.состояниеИгрока = название;
|
|
}
|
|
};
|
|
|
|
this.обновить = function()
|
|
{
|
|
this.переместитьИгрока();
|
|
};
|
|
|
|
this.обработатьКлюч = function(ключ, путь, значение)
|
|
{
|
|
if (!ключ.startsWith("gr.сцена"))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var свойство = путь.slice(2).join(".");
|
|
this.задано[свойство] = значение;
|
|
if (свойство == "оглавление")
|
|
{
|
|
this.загрузитьОглавление(значение);
|
|
}
|
|
};
|
|
|
|
this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель)
|
|
{
|
|
let цель = this.задано["цель"];
|
|
if (!this.типИгрыУказатьИНажать() || !цель)
|
|
{
|
|
return;
|
|
}
|
|
let тело = тела.тела[цель];
|
|
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 скоростьX = this.задано["игрок.скорость.0"];
|
|
if (!this.типИгрыУказатьИНажать() || !цель || !объект || !скоростьX)
|
|
{
|
|
return;
|
|
}
|
|
|
|
let игрок = `объекты-${объект}`;
|
|
let телоЦели = тела.тела[цель];
|
|
let телоИгрока = тела.тела[игрок];
|
|
if (!телоЦели || !телоИгрока)
|
|
{
|
|
return;
|
|
}
|
|
|
|
let игрокX = телоИгрока.position.x;
|
|
let цельX = телоЦели.position.x;
|
|
let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x;
|
|
let расстояние = цельX - игрокX;
|
|
let направление = расстояние > 0 ? 1 : -1;
|
|
|
|
if (Math.abs(расстояние) < ширина / 2)
|
|
{
|
|
this.задатьСостояниеИгрока(false, направление);
|
|
return;
|
|
}
|
|
|
|
this.задатьСостояниеИгрока(true, направление);
|
|
Matter.Sleeping.set(телоИгрока, false);
|
|
Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 });
|
|
};
|
|
|
|
this.разобратьОглавление = function(содержимое)
|
|
{
|
|
let код = "this.сцены = " + содержимое;
|
|
eval(код);
|
|
};
|
|
|
|
this.типИгрыУказатьИНажать = function()
|
|
{
|
|
var тип = this.задано["тип"];
|
|
return тип && тип == "указать и нажать";
|
|
};
|
|
|
|
// Конструктор.
|
|
this.создать();
|
|
};
|