Тела Box2d не совпадают с анимацией после перемещения CCLayer - PullRequest
0 голосов
/ 11 февраля 2012

Я разрабатываю игру в стиле сверху вниз, где пользователь может управлять несколькими персонажами одновременно. Эти персонажи могут двигаться в любом направлении. Существуют статические тела (стены, здания), в которые персонажи могут столкнуться, используя Box2d для обнаружения столкновений. Пользователь может перемещать камеру, проводя пальцем по экрану. Это переместит CCLayer и любые содержащие CCSprite объекты, которые я добавил в слой.

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

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

1 Ответ

0 голосов
/ 12 февраля 2012

Мой подход был немного неудачным. Я не использую Box2D для чего-либо другого, кроме обнаружения столкновений, поэтому я не должен был использовать его для перемещения своих спрайтов по экрану. Я обновил свой код, чтобы cocos2d обрабатывал расположение моих спрайтов, а затем я обновил положения тела box2d на основе местоположения спрайта.

Вот урок, который я нашел полезным: http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

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

CCSprite *sprite = (CCSprite*)b->GetUserData();
CGPoint pos = [gameLayer convertToWorldSpace:[sprite position]];
b2Vec2 b2Position = b2Vec2(pos.x/PTM_RATIO, pos.y/PTM_RATIO);
float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(sprite.rotation);
b->SetTransform(b2Position, b2Angle);

Метод convertToWorldSpace:(CGPoint)point берет местоположение спрайта и преобразует его местоположение в мировое пространство, основываясь на том, как вы перемещаете положение CCLayer по экрану.

Я надеюсь, что кто-то еще посчитает это полезным!

...