Files
MYPOM/6.0/игра/180.Объекты.js

171 lines
5.5 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.умолчание = {
пр: [0, 0, 40, 20],
};
this.задано = {};
события.подписать(this);
};
// Ключи и события.
this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "объекты")
{
return;
}
let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
let производноеИмя = `объекты-${имя}`;
if (свойство.startsWith("пр."))
{
let пр = this.пр(имя);
this.обновитьПозициюРазмер(производноеИмя, пр);
this.обновитьСлежение(производноеИмя, пр);
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
this.обновитьИзображение(производноеИмя, пр, вид, анимация);
}
else if (свойство == "физика")
{
this.обновитьФизику(производноеИмя, значение);
}
else if (
свойство == "вид" ||
свойство == "анимация"
) {
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
this.обновитьИзображение(производноеИмя, null, вид, анимация);
}
};
this.обработатьСобытие = function(событие)
{
let в = "виды/";
let а = "анимации/";
if (событие.startsWith(в))
{
let вид = событие.substring(в.length);
this.обновитьОбъектыВида(вид);
}
else if (событие.startsWith(а))
{
let анимация = событие.substring(а.length);
this.обновитьОбъектыАнимации(анимация);
}
};
this.обновитьОбъектыАнимации = function(анимация)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let зан = за["анимация"];
if (зан && зан == анимация)
{
this.обновитьВидАнимацию(имя);
}
}
};
this.обновитьОбъектыВида = function(вид)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let зви = за["вид"];
if (зви && зви == вид)
{
this.обновитьВидАнимацию(имя);
}
}
};
this.обновитьВидАнимацию = function(имя)
{
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
let производноеИмя = `объекты-${имя}`;
this.обновитьИзображение(производноеИмя, null, вид, анимация);
};
this.обновитьИзображение = function(имя, пр, вид, анимация)
{
var описание = {
вид: вид,
анимация: анимация,
};
if (пр)
{
описание["пр"] = пр;
}
состояние.разобрать({
изображения: {
[имя]: описание,
},
});
};
this.обновитьПозициюРазмер = function(имя, пр)
{
состояние.разобрать({
тела: {
[имя]: {
пр: пр,
},
},
});
};
this.обновитьСлежение = function(имя, пр)
{
состояние.разобрать({
слежение: {
[имя]: {
изображение: имя,
тело: имя,
смещение: [-пр[2] / 2, -пр[3] / 2],
},
},
});
};
this.обновитьФизику = function(имя, значение)
{
состояние.разобрать({
тела: {
[имя]: {
физика: значение,
},
},
});
};
this.пр = function(имя)
{
let за = this.задано[имя];
let пр = this.умолчание.пр;
return [
за["пр.0"] ? за["пр.0"] : пр[0],
за["пр.1"] ? за["пр.1"] : пр[1],
за["пр.2"] ? за["пр.2"] : пр[2],
за["пр.3"] ? за["пр.3"] : пр[3],
];
};
// Конструктор.
this.создать();
};