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

110 lines
3.6 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);
};
this.обновить = function()
{
this.переместитьИгрока();
};
this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "сцена")
{
return;
}
var свойство = путь.slice(1).join(".");
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 префикс = "мышь/нажатие/";
if (событие.startsWith(префикс))
{
let значения = событие.substring(префикс.length).split("/");
let x = Number(значения[0]);
let y = Number(значения[1]);
let указатель = значения[2];
this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель);
}
};
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.создать();
};