169 lines
5.5 KiB
JavaScript
169 lines
5.5 KiB
JavaScript
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.задано[имя]["вид"];
|
||
let анимация = this.задано[имя]["анимация"];
|
||
this.обновитьИзображение(производноеИмя, пр, вид, анимация);
|
||
}
|
||
};
|
||
|
||
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.задано[имя]["анимация"];
|
||
let производноеИмя = `объекты-${имя}`;
|
||
this.обновитьИзображение(производноеИмя, пр, вид, анимация);
|
||
};
|
||
|
||
this.обновитьИзображение = function(имя, пр, вид, анимация)
|
||
{
|
||
состояние.разобрать({
|
||
изображения: {
|
||
[имя]: {
|
||
пр: пр,
|
||
вид: вид,
|
||
анимация: анимация,
|
||
},
|
||
},
|
||
});
|
||
};
|
||
|
||
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.создать();
|
||
};
|