Просмотр полной версии : [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.
Как сделать правильнее я уже написал во втором посте
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;
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.