
Вариант редактора уровней с использованием Flash IDE и экспортом в XML
Для примера нам понадобится любой объект, пусть это будет балка. Создадим для нее компонент и парочку параметров:


Для получения всех параметров нашего компонента на слое physics в виде xml напишем небольшой JSFL скрипт, скрипт достаточно прост но я на всякий случай снабдил его небольшими пояснениями:
И в результате получаем:
Ну а потом уже можно подцеплять результат в виде xml и парсить получившийся уровень в движок.


Для получения всех параметров нашего компонента на слое physics в виде xml напишем небольшой JSFL скрипт, скрипт достаточно прост но я на всякий случай снабдил его небольшими пояснениями:
var doc = fl.getDocumentDOM();//текущий документ
var selection = doc.selection;//получаем текущее выделение
var layout = <level />;//создаем родительскую ноду
var elementsNum = selection.length;//счетчик вложенных элементов
for(var i = 0 ; i < elementsNum ; i++){
//если объект на слое physics
if(selection[i].layer.name == "physics")
{
layout.appendChild(<phys_object />);//создаем для него ноду
layout.phys_object[i].@type = selection[i].layer.name;
if(selection[i].parameters) {
var j = 0;
var p = null;
while(j < selection[i].parameters.length && !p) {
if(selection[i].parameters[j].name == "name") {
layout.phys_object[i].@name = selection[i].parameters[j].value;
}
else if(selection[i].parameters[j].name == "density") {
layout.phys_object[i].@density = selection[i].parameters[j].value;
}
else if(selection[i].parameters[j].name == "elasticity") {
layout.phys_object[i].@elasticity = selection[i].parameters[j].value;
}
j++;
}
}
layout.phys_object[i].@x = selection[i].x;
layout.phys_object[i].@y = selection[i].y;
layout.phys_object[i].@rotation = Math.round(selection[i].rotation);
//получаем реальную длину и ширину объекта с учетом его поворота
var r = selection[i].rotation * Math.PI/180;
var c = Math.abs( Math.cos( r ) );
var s = Math.abs( Math.sin( r ) );
var denominator = (c*c - s*s);
var w = (selection[i].width * c - selection[i].height * s) / denominator;
var h = (selection[i].height * c - selection[i].width * s) / denominator;
layout.phys_object[i].@width = Math.round(w);
layout.phys_object[i].@height = Math.round(h);
}
}
fl.trace(layout);//выводим xml в трейс
И в результате получаем:
<level>
<phys_object type="physics" name="balk01" density="1" elasticity="0" x="136.6" y="53.05" rotation="179" width="122" height="39"/>
</level>
Ну а потом уже можно подцеплять результат в виде xml и парсить получившийся уровень в движок.
- +7
- MXPain
Комментарии (23)
Я например не пойму, вот мы парсим теги и встречаем тег <phys_object>, создаем физ. обьект, но откуда мы знаем, какой спрайт прицепить к нему? Или анализировать имя на вхождение в него ключевых слов типа: balk, box и т.д.?
В таком случае лучше строить по набору точек, а не прямоугольниками. Скорее всего просто не обращаете внимание на то как тела ведут себя на таких стыках, когда это два разных шейпа.
А строить по точкам — только нажить себе геморрой на будущее потратив кучу времени. И начнутся проблемы с производительностью, когда нужно будет отключать тела не входящие в камеру и когда эти фигуры будут разбиваться на слишком много полигонов.
Главное нормально расставлять прямоугольники и помех почти не будет. (то что выше, я просто набросал за минуту)
А вот в зомботроне уже приходилось кружочками стыковать:
Не совсем верно, обычно для коллижена используется GJK,V-Clip и прочие алгоритмы, которые работают с выпуклыми многоугольники. Невыпуклые, разумеется, предварительно разбиваются на несколько выпуклых, и в частном случае могут получится треугольники, конечно.
*многоугольниками
Кстати вот и пример. Зомботрон тоже сделан из кучи тел, на ноуте подтормаживает. Представьте тормоза которые будут при монолитных фигурах физики.
Вот небольшое обсуждение.
Claymore, ты сейчас издеваешься?:) Кто ж будет делать такие физ тела по 5px и гонять на такой скорости?
Я не спорю, что проблемы есть. Но попробуй построить в нэйпе прямоугольники хотя бы по 50-100px шириной и прокатиться по ним со скоростью обычного персонажа. На глаз даже и не заметишь этих скачков. А уж как утверждал FlashRush, что еще и проваливаться на середину, так этого вообще нету.
И вообще давайте закроем эту тему, т.к. изначально я объяснял человеку «Почему не нужно на каждый физ объект отдельный спрайт».