Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Система координат при создании шейпа тела (http://www.flasher.ru/forum/showthread.php?t=202220)

PainKiller 03.07.2013 12:28

Система координат при создании шейпа тела
 
Вложений: 1
Подскажите пожалуйста такую вещь - по какому принципу при создании шейпа ему задаются координаты? Я при создании круглого тела задаю координаты шейпа таким образом
Код AS3:

circleShape.SetLocalPosition(new b2Vec2(0, 0));

но эти координаты оказываются не равны 0 локальной координатной системы создаваемого объекта. Это видно на прикрепленной картинке - красная точка добавлена в координаты 0, 0. В итоге координаты тел, не совпадают у меня с их изображениями. Я понимаю что вопрос скорее всего тупой, но у меня уже ни одна гипотеза не работает, а в доках объяснения этому я не нашел.

P.S. Игрушка на старлинге если что.

PainKiller 12.07.2013 11:30

Да. чуть было не забыл отписать о решении проблемы, может кому то пригодится, а то тут на форуме на эту тему полный глушняк. В общем оказалось, что и Box2D и Nape локальные координаты преобразуют в глобальные и все расчеты ведут в них. Соответственно (0,0) локальных координат астероида, преобразовывался в глобальные координаты и в результате получалось такое вот смещение из за верхней панельки (почему честно говоря немного не понимаю, все таки при преобразовании координаты должны быть идентичны и так всегда и было ??). Сначала я решил эту проблему такой вот поправкой
Код AS3:

circleShape.SetLocalPosition(new b2Vec2(radius / Level.worldScale, (radius + 135) / Level.worldScale)); //135 высота панели свеху

однако обнаружил что при таком раскладе, бокс2Д воспринимает объект как увеличившийся на 135 пикс., и при приобретении вращательного момента астероиды начинали крутиться по орбите вокруг точки.
В итоге локальную позицию я задал так:
Код AS3:

circleShape.SetLocalPosition(new b2Vec2(radius / Level.worldScale, radius / Level.worldScale));

а в апдейте я вношу такую поправку:
Код AS3:

override public function update():void
                {
                        x = body.GetPosition().x * Level.worldScale;
                        y = body.GetPosition().y * Level.worldScale - 145; //поправка на высоту панели + полоска жизни
                        inner.rotation = body.GetAngle();
 
 
                }

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


Часовой пояс GMT +4, время: 18:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.