Files
MYPOM/6.0/игра/gr/400.grСцена.js

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