Files
mjs/150.тела.js

131 lines
4.2 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.умолчание = {
x: 0,
y: 0,
ширина: 40,
высота: 20,
угол: 0,
часть: false,
физика: {
isStatic: true,
},
};
this.задано = {};
this.тела = {};
this.имена = {};
};
this.обработатьКлюч = function(ключ, путь, значение)
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
this.пересоздатьТело(имя);
};
this.пересоздатьТело = function(имя) {
// Удаляем старое тело.
if (имя in this.тела)
{
var тело = this.тела[имя];
delete this.имена[тело.id];
// Всегда удаляем из мира:
// * тело не часть;
// * тело было не частью, а потом стало частью.
Matter.Composite.remove(физмир, тело);
}
var за = this.задано[имя];
var ум = this.умолчание;
var x = (за.x != null) ? за.x : ум.x;
var y = (за.y != null) ? за.y : ум.y;
var ширина = за.ширина ? за.ширина : ум.ширина;
var высота = за.высота ? за.высота : ум.высота;
// Переводим x,y из левого верхнего угла в центр.
x = x + ширина / 2.0;
y = y + высота / 2.0;
// Параметры тела.
var параметры = {};
Object.assign(параметры, ум.физика);
for (var путь in за)
{
if (путь.startsWith("физика"))
{
var свойство = путь.slice(7);
мир.задать(параметры, свойство, за[путь]);
}
}
var тело = null;
// Создаём новое составное тело.
if (за["части.0"])
{
параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
тело = Matter.Body.create(параметры);
}
// Создаём новое несоставное тело.
else
{
тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
}
this.тела[имя] = тело;
this.имена[тело.id] = имя;
// Добавляем в физический мир, если не часть другого составного мира.
var часть = за.часть ? за.часть : ум.часть;
if (!часть)
{
Matter.Composite.add(физмир, тело);
}
};
this.именаЧастей = function(за)
{
var имена = [];
for (var ключ in за)
{
if (ключ.startsWith("части"))
{
имена.push(за[ключ]);
}
}
return имена;
};
this.телаЧастей = function(имена)
{
var тела = [];
for (var н in имена)
{
var имя = имена[н];
var тело = this.тела[имя];
тела.push(тело);
}
return тела;
};
this.отладить = function()
{
console.debug("Тела.отладить. НАЧАЛО");
for (var имя in this.тела)
{
var тело = this.тела[имя];
console.debug("тело имя/id/позиция:", имя, тело.id, тело.position);
}
console.debug("Тела.отладить. КОНЕЦ");
};
// Конструктор.
this.создать();
}