Box2D Связаться со слушателем? - PullRequest
1 голос
/ 23 октября 2011

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

Нужно ли мне иметь определенный класс только для этого прослушивателя контактов или это может быть просто несколько основных строк кода в моем классе CCScene?

Может кто-нибудь предложить какое-то понимание этого вопроса?

Спасибо !!!

1 Ответ

3 голосов
/ 16 января 2012

Вы должны реализовать новый класс для столкновения или, скажем, контактный слушатель, основываясь на некоторых критериях, как тэг №.У меня есть пример для вас.

// ContactListener.h

#import "Box2D.h"

class ContactListener : public b2ContactListener 
{
private: 
    void BeginContact(b2Contact* contact);
    void EndContact(b2Contact* contact);
};

// ContactListener.mm

#import "ContactListener.h"
#import "cocos2d.h"
#import "BodyNode.h"
#import "GameScene.h"

void ContactListener::BeginContact(b2Contact* contact)
{
    b2Body* bodyA = contact->GetFixtureA()->GetBody();
    b2Body* bodyB = contact->GetFixtureB()->GetBody();
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL)
    {
        BodyNode* bNodeA = (BodyNode*)bodyA->GetUserData();
        BodyNode* bNodeB = (BodyNode*)bodyB->GetUserData();

        if ((bNodeA.tag == GameSceneNodeTagBall && bNodeB.tag == GameSceneNodeTagHole) || 
            (bNodeA.tag == GameSceneNodeTagHole && bNodeB.tag == GameSceneNodeTagBall)) 
        {
            switch (bNodeA.tag) {
                case GameSceneNodeTagBall:
                    if ([bNodeA isKindOfClass:[Ball class]]) {
                        Ball* ball = (Ball*)bNodeA;
                        ball.sprite.visible = NO;
                        [[GameScene sharedGameScene] gameOver];
                    }
                    break;
                case GameSceneNodeTagHole:
                    if ([bNodeB isKindOfClass:[Ball class]]) {
                        Ball* ball = (Ball*)bNodeB;
                        ball.sprite.visible = NO;
                        [[GameScene sharedGameScene] gameOver];
                    }
                    break;

                default:
                    break;
            }
        }
    }
}

Это пример столкновения шара и отверстия.Вы можете использовать это согласно вашему требованию.

Надеюсь, это поможет вам.

Спасибо!

, чтобы проверить столкновение только один раз:

// ContactListener.mm

    #import "ContactListener.h"
    #import "cocos2d.h"
    #import "BodyNode.h"
    #import "GameScene.h"

    void ContactListener::BeginContact(b2Contact* contact)
    {
        b2Body* bodyA = contact->GetFixtureA()->GetBody();
        b2Body* bodyB = contact->GetFixtureB()->GetBody();
        if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL)
        {
            BodyNode* bNodeA = (BodyNode*)bodyA->GetUserData();
            BodyNode* bNodeB = (BodyNode*)bodyB->GetUserData();

            if ((bNodeA.tag == GameSceneNodeTagBall && bNodeB.tag == GameSceneNodeTagHole) || 
                (bNodeA.tag == GameSceneNodeTagHole && bNodeB.tag == GameSceneNodeTagBall)) 
            {
                switch (bNodeA.tag) {
                    case GameSceneNodeTagBall:
                        if ([bNodeA isKindOfClass:[Ball class]] && isBallCollision == NO) {
                            Ball* ball = (Ball*)bNodeA;
                            ball.sprite.visible = NO;
                            isBallCollision = YES;
                            [[GameScene sharedGameScene] gameOver];
                        }
                        break;
                    case GameSceneNodeTagHole:
                        if ([bNodeB isKindOfClass:[Ball class]] && isBallCollision == NO) {
                            Ball* ball = (Ball*)bNodeB;
                            ball.sprite.visible = NO;
                            isBallCollision = YES;
                            [[GameScene sharedGameScene] gameOver];
                        }
                        break;

                    default:
                           isBallCollision = NO;
                        break;
                }
            }
        }
    }
...