PDA

Просмотр полной версии : [Nape] Как привязать графику к Nape?


neonoviiwolf
13.06.2015, 18:27
Добрый день!
Помогите решить проблему, решил в приложении вместо Box2D использовать Nape (тормозит коробка). Поиск гугл выдаёт, что нужно писать:
var box = new Body(BodyType.DYNAMIC);
var movic:MovieClip = new MovieClip(); //тут какой-то мувик с графикой
//.....................
box.graphic = movic;

так вот, похоже в новой редакции Nape нету graphic, тогда что же использовать? Могу конечно костыль написать, но это только ещё большие трудности потянет

caseyryan
13.06.2015, 18:40
А зачем вообще это делать?
Нейп должен существовать отдельно, а графика отдельно. Создается какой-то класс, к примеру Box, в нем будет создаваться физическая модель этой коробки и графическое представление, что-то типа такого:

var boxBody:Body = new Body(BodyType.DYNAMIC);
//... тут создаем все шейпы для коробки
_space.bodies.add(boxBody);

var boxView:DisplayObject = какая-то картинка или спрайт, или еще что-то
addChild(boxView);
// ну а потом просто ставим свой объект туда же, где находится физической тело в нейпе
private function onEnterFrame(e:Event):void {
this.x = boxBody.position.x;
this.y = boxBody.position.y;
}



п.с. но если уж по каким-то причинам надо что-то привязать к нейповскому телу, то у него есть свойство userData
например можно ему имя задать, чтобы при проверке столкновений определить что это такое, ну или еще какое-то свойство привязать

boxBody.userData.title = "blabla";
boxBody.userData.image = boxView; // сама эта картинка, естественно, никуда двигаться не будет

neonoviiwolf
13.06.2015, 19:31
Спасибо, я как раз этот вариант и рассматривал, только после бокса выглядит как костыль

хотя вот думаю, создать класс, который расширяет класс Body и в него закидывать нужный мувик, тем самым удаляя объект Body со сцены, удалялся и мувик с ним (у меня в игрушке много стрельбы и столкновений, постоянно будет что-то убираться со сцены

Добавлено через 2 минуты
под this понимается boxView?

this.x = boxBody.position.x;
this.y = boxBody.position.y;

caseyryan
13.06.2015, 21:31
тем самым удаляя объект Body со сцены, удалялся и мувик с ним
Объект Body никогда и ни при каких условиях невозможно добавить на сцену. Это исключительно математическая модель и никакого графического представления не имеет, соответственно и ни в каком контейнере находиться не может.

под this понимается boxView?
Под this понимается экземпляр того класса, в котором все это создано. Если бы имелся в виду boxView, то и писать бы надо было boxView.x = ...

neonoviiwolf
13.06.2015, 21:58
Объект Body никогда и ни при каких условиях невозможно добавить на сцену. Это исключительно математическая модель и никакого графического представления не имеет, соответственно и ни в каком контейнере находиться не может.
ок, я имел в виду space, понятно, ещё вопрос, я буду пулы делать, так вот, придётся писать два массива, один будет содержать графику, второй мат модели nape?

caseyryan
13.06.2015, 22:05
ок, я имел в виду space
space - то же самое) Вообще в нейпе нет ничего, что можно добавить на сцену, кроме DebugDraw.
Как сделать правильнее я уже написал во втором посте

illuzor
14.06.2015, 21:08
nape полностью абстрагирован от графики и это хорошо.
Каждому физическому объекту можно задать любые данные в userData. Я добавляю дисплейОбджекты в userData.graphics.
Через space есть доступ ко всем телам (Body). При апдейте нужно пройтись циклом по списку тел и их userData.graphics и применить соответствующие параметры:

public function update():void {
space.step(1 /30);

var bodies:BodyList = space.bodies;
for (var i:int = 0; i < bodies.length; i++) {
var body:Body = bodies.at(i);
if (body.userData.graphics != null) {
var graphics:DisplayObject = body.userData.graphics;
graphics.x = body.position.x;
graphics.y = body.position.y ;
graphics.rotation = body.rotation; // nape использует радианы. В случае с displayList нужно перевести их в градусы.
}
}
}

ShockWave512
15.06.2015, 10:37
В движке Citrus все эти вопросы увязаны.
http://citrusengine.com/

AlexCooper
18.06.2015, 18:48
private function onFrame(event:Event):void
{
_space.step(1 / stage.frameRate);
_space.liveBodies.foreach(updateGraphics);
}

private function updateGraphics(body:Body):void
{
var image:Image = body.userData.graphic as Image; // or other DO
image.x = body.position.x;
image.y = body.position.y;
image.rotation = body.rotation;
}