|
@@ -1,168 +1,106 @@ |
|
|
мир.объекты = { |
|
|
|
|
|
умолчание: { |
|
|
|
|
|
x: 0, |
|
|
|
|
|
y: 0, |
|
|
|
|
|
ширина: 40, |
|
|
|
|
|
высота: 20, |
|
|
|
|
|
физика: { |
|
|
|
|
|
isStatic: true, |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
задано: {}, |
|
|
|
|
|
тела: {}, |
|
|
|
|
|
имена: {}, |
|
|
|
|
|
элементы: {}, |
|
|
|
|
|
свойстваТела: ["x", "y", "ширина", "высота", "физика"], |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // // // |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
мир.ключники.push(function(ключ, путь, значение){ |
|
|
|
|
|
if (!ключ.startsWith("объекты")) |
|
|
|
|
|
|
|
|
function Тела(физмир) |
|
|
|
|
|
{ |
|
|
|
|
|
this.создать = function() |
|
|
{ |
|
|
{ |
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var имя = путь[1]; |
|
|
|
|
|
var свойство = путь[2]; |
|
|
|
|
|
|
|
|
|
|
|
if (!(имя in мир.объекты.задано)) |
|
|
|
|
|
|
|
|
this.умолчание = { |
|
|
|
|
|
x: 0, |
|
|
|
|
|
y: 0, |
|
|
|
|
|
ширина: 40, |
|
|
|
|
|
высота: 20, |
|
|
|
|
|
угол: 0, |
|
|
|
|
|
часть: false, |
|
|
|
|
|
физика: { |
|
|
|
|
|
isStatic: true, |
|
|
|
|
|
}, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
this.задано = {}; |
|
|
|
|
|
this.тела = {}; |
|
|
|
|
|
this.имена = {}; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
this.обработатьКлюч = function(ключ, путь, значение) |
|
|
{ |
|
|
{ |
|
|
мир.объекты.задано[имя] = {}; |
|
|
|
|
|
} |
|
|
|
|
|
var свойствоПуть = путь.slice(2).join("."); |
|
|
|
|
|
мир.объекты.задано[имя][свойствоПуть] = значение; |
|
|
|
|
|
|
|
|
|
|
|
мир.объекты.пересоздатьТело(имя, свойство); |
|
|
|
|
|
мир.объекты.обновитьЭлемент(имя, свойство, значение); |
|
|
|
|
|
мир.объекты.обновитьВидЭлемента(путь, имя, свойство, значение); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // // // |
|
|
|
|
|
|
|
|
var имя = путь[1]; |
|
|
|
|
|
var свойство = путь.slice(2).join("."); |
|
|
|
|
|
if (!this.задано[имя]) |
|
|
|
|
|
{ |
|
|
|
|
|
this.задано[имя] = {}; |
|
|
|
|
|
} |
|
|
|
|
|
this.задано[имя][свойство] = значение; |
|
|
|
|
|
|
|
|
|
|
|
this.пересоздатьТело(имя); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
мир.объекты.обновить = function() |
|
|
|
|
|
{ |
|
|
|
|
|
for (var имя in мир.объекты.тела) |
|
|
|
|
|
{ |
|
|
|
|
|
var тело = мир.объекты.тела[имя]; |
|
|
|
|
|
var элемент = мир.объекты.элементы[имя]; |
|
|
|
|
|
if (!тело || !элемент) |
|
|
|
|
|
|
|
|
this.пересоздатьТело = function(имя) { |
|
|
|
|
|
// Удаляем старое тело. |
|
|
|
|
|
if (имя in this.тела) |
|
|
{ |
|
|
{ |
|
|
continue; |
|
|
|
|
|
|
|
|
var тело = this.тела[имя]; |
|
|
|
|
|
delete this.имена[тело.id]; |
|
|
|
|
|
// Всегда удаляем из мира: |
|
|
|
|
|
// * тело не часть; |
|
|
|
|
|
// * тело было не частью, а потом стало частью. |
|
|
|
|
|
Matter.Composite.remove(физмир, тело); |
|
|
} |
|
|
} |
|
|
var засинхрили = мир.синхронизироватьЭлементТело(элемент, тело); |
|
|
|
|
|
|
|
|
|
|
|
// Учесть значения transform из JSON-JS. |
|
|
|
|
|
if (засинхрили) |
|
|
|
|
|
|
|
|
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 за) |
|
|
{ |
|
|
{ |
|
|
var transform = мир.объекты.задано[имя]["вид.transform"]; |
|
|
|
|
|
if (transform) |
|
|
|
|
|
|
|
|
if (путь.startsWith("физика")) |
|
|
{ |
|
|
{ |
|
|
элемент.style.transform += transform; |
|
|
|
|
|
|
|
|
var свойство = путь.slice(7); |
|
|
|
|
|
мир.задать(параметры, свойство, за[путь]); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // // // |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
мир.объекты.пересоздатьТело = function(имя, свойство) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!мир.объекты.свойстваТела.includes(свойство)) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Удалить физическое тело. |
|
|
|
|
|
if (имя in мир.объекты.тела) |
|
|
|
|
|
{ |
|
|
|
|
|
var тело = мир.объекты.тела[имя]; |
|
|
|
|
|
Matter.Composite.remove(мир.физика.движок.world, тело); |
|
|
|
|
|
delete мир.объекты.имена[тело.id]; |
|
|
|
|
|
} |
|
|
|
|
|
// Пересоздать физическое тело. |
|
|
|
|
|
var за = мир.объекты.задано[имя]; |
|
|
|
|
|
var ум = мир.объекты.умолчание; |
|
|
|
|
|
|
|
|
|
|
|
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 тело = null; |
|
|
|
|
|
// Создаём новое составное тело. |
|
|
|
|
|
if (за.части) |
|
|
{ |
|
|
{ |
|
|
var свойство = путь.slice(7); |
|
|
|
|
|
мир.задать(физика, свойство, за[путь]); |
|
|
|
|
|
|
|
|
параметры["parts"] = this.телаЧастей(за.части); |
|
|
|
|
|
тело = Matter.Body.create(параметры); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var тело = Matter.Bodies.rectangle(x, y, ширина, высота, физика); |
|
|
|
|
|
Matter.Composite.add(мир.физика.движок.world, тело); |
|
|
|
|
|
мир.объекты.тела[имя] = тело; |
|
|
|
|
|
мир.объекты.имена[тело.id] = имя; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // // // |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Создаём новое несоставное тело. |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры); |
|
|
|
|
|
} |
|
|
|
|
|
this.тела[имя] = тело; |
|
|
|
|
|
this.имена[тело.id] = имя; |
|
|
|
|
|
|
|
|
мир.объекты.обновитьЭлемент = function(имя, свойство, значение) |
|
|
|
|
|
{ |
|
|
|
|
|
var за = мир.объекты.задано[имя]; |
|
|
|
|
|
var ум = мир.объекты.умолчание; |
|
|
|
|
|
|
|
|
// Добавляем в физический мир, если не часть другого составного мира. |
|
|
|
|
|
var часть = за.часть ? за.часть : ум.часть; |
|
|
|
|
|
if (!часть) |
|
|
|
|
|
{ |
|
|
|
|
|
Matter.Composite.add(физмир, тело); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
if (!(имя in мир.объекты.элементы)) |
|
|
|
|
|
|
|
|
this.телаЧастей = function(имена) |
|
|
{ |
|
|
{ |
|
|
var элемент = document.createElement("div"); |
|
|
|
|
|
элемент.id = `объекты-${имя}`; |
|
|
|
|
|
элемент.style.position = "absolute"; |
|
|
|
|
|
элемент.style.display = "block"; |
|
|
|
|
|
элемент.style.transformOrigin = "center"; |
|
|
|
|
|
document.getElementById("корень").appendChild(элемент); |
|
|
|
|
|
мир.объекты.элементы[имя] = элемент; |
|
|
|
|
|
// Свойства по умолчанию. |
|
|
|
|
|
элемент.style.width = `${ум.ширина}px`; |
|
|
|
|
|
элемент.style.height = `${ум.высота}px`; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var элемент = мир.объекты.элементы[имя]; |
|
|
|
|
|
|
|
|
var тела = []; |
|
|
|
|
|
for (var н in имена) |
|
|
|
|
|
{ |
|
|
|
|
|
var имя = имена[н]; |
|
|
|
|
|
var тело = this.тела[имя]; |
|
|
|
|
|
тела.push(тело); |
|
|
|
|
|
} |
|
|
|
|
|
return тела; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
if (свойство == "ширина") |
|
|
|
|
|
{ |
|
|
|
|
|
var ширина = за["ширина"] ? за["ширина"] : ум["ширина"]; |
|
|
|
|
|
элемент.style.width = `${ширина}px`; |
|
|
|
|
|
} |
|
|
|
|
|
else if (свойство == "высота") |
|
|
|
|
|
{ |
|
|
|
|
|
var высота = за["высота"] ? за["высота"] : ум["высота"]; |
|
|
|
|
|
элемент.style.height = `${высота}px`; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// Конструктор. |
|
|
|
|
|
this.создать(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // // // |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
мир.объекты.обновитьВидЭлемента = function(путь, имя, свойство, значение) |
|
|
|
|
|
{ |
|
|
|
|
|
if (свойство != "вид") |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var элемент = мир.объекты.элементы[имя]; |
|
|
|
|
|
var параметр = путь[3]; |
|
|
|
|
|
элемент.style.setProperty(параметр, значение); |
|
|
|
|
|
} |
|
|
|