Cocos2dx Collision: запущено onContactBegin, но условие проверки столкновения всегда терпит неудачу - PullRequest
0 голосов
/ 16 марта 2020

У меня есть 3 объекта в игре. Падающий шар, движущиеся вверх шаги, монеты

Теперь нет проблем с игровым процессом, мне нужны шаги и место для столкновения мячей, чтобы добавить звуковые эффекты. Теперь onContactBegin запускается дважды для столкновения мяча и шагов. Как только контакт начинается, onContactBegin срабатывает, также как только он теряет контакт, затем onContactBegin запускается снова. Теперь первый

if ((contact.getShapeA () -> getCategoryBitmask () &

внутри onContactBegin всегда терпит неудачу ... так почему бы не выполнить условие условия ... что что-то не так с моим кодом?

Вот код:

#define COL_MASK_BLANK        0x00000000
#define COL_MASK_BALL         0x00000001
#define COL_MASK_STAGE        0x00000002
#define COL_MASK_COIN         0x00000004

    ball->addComponent(PhysicsBody::createCircle(ball->getContentSize().width*0.5f, PhysicsMaterial(10.0f,0.1,0.1)));
    ball->getPhysicsBody()->setGravityEnable(true);
    ball->getPhysicsBody()->setRotationEnable(false);
    ball->getPhysicsBody()->setDynamic(true);
    ball->getPhysicsBody()->setTag(BALL_BODYS_TAG);    
    ball->getPhysicsBody()->setCategoryBitmask(COL_MASK_BALL);
    ball->getPhysicsBody()->setCollisionBitmask(COL_MASK_STAGE);
    ball->getPhysicsBody()->setContactTestBitmask(0xFFFFFFFF);

    steps->addComponent(PhysicsBody::createBox(steps->getContentSize(), PhysicsMaterial(100.0f,0.1,0.1)));
    steps->getPhysicsBody()->setGravityEnable(false);
    steps->getPhysicsBody()->setTag(STEPS_BODYS_TAG);
    steps->getPhysicsBody()->setDynamic(false);
    steps->getPhysicsBody()->setCategoryBitmask(COL_MASK_STAGE);
    steps->getPhysicsBody()->setCollisionBitmask(COL_MASK_BALL+COL_MASK_COIN);
    steps->getPhysicsBody()->setContactTestBitmask(0xFFFFFFFF);

    coin->addComponent(PhysicsBody::createCircle(coin->getContentSize().width*0.5f, PhysicsMaterial(10.0f,0.1,0.1)));
    coin->getPhysicsBody()->setGravityEnable(true);
    coin->getPhysicsBody()->setTag(COIN_BODYS_TAG);
    coin->getPhysicsBody()->setCategoryBitmask(COL_MASK_COIN);
    coin->getPhysicsBody()->setCollisionBitmask(COL_MASK_BALL+COL_MASK_STAGE);
    coin->getPhysicsBody()->setContactTestBitmask(COL_MASK_BALL+COL_MASK_STAGE);
    coin->getPhysicsBody()->setDynamic(true);

onContactBegin Код:

bool GBGameScene::onContactBegin(cocos2d::PhysicsContact& contact)
{
    if ((contact.getShapeA()->getCategoryBitmask() & contact.getShapeB()->getCollisionBitmask()) == 0
        || (contact.getShapeB()->getCategoryBitmask() & contact.getShapeA()->getCollisionBitmask()) == 0)
    {
       //printf("Contact Done\n");

        PhysicsBody* bodyA = contact.getShapeA()->getBody();
        PhysicsBody* bodyB = contact.getShapeB()->getBody();

        if(bodyA->getTag() == BALL_BODYS_TAG || bodyB->getTag() == BALL_BODYS_TAG)
        {
            if(bodyA->getTag() == STEPS_BODYS_TAG || bodyB->getTag() == STEPS_BODYS_TAG)
            {
                if(bodyA->getTag() == STEPS_BODYS_TAG)
                {
                    GBSteps *steps = (GBSteps *) bodyA->getNode();
                    GBGravityBall *graBall = (GBGravityBall*) bodyB->getNode();

                    printf(“Here Controll not coming\n”);
                 }
                else
                {
                    GBSteps *steps = (GBSteps *) bodyB->getNode();
                    GBGravityBall *graBall = (GBGravityBall*) bodyA->getNode();

                    printf(”Here Controll not coming\n”);

                }
            }
            if(bodyA->getTag() == COIN_BODYS_TAG || bodyB->getTag() == COIN_BODYS_TAG)
            {
                if(bodyA->getTag() == COIN_BODYS_TAG)
                {
                     GBCoin *coins = (GBCoin*) bodyA->getNode();
                     coins->removeFromParentAndCleanup(true);
                    printf(”Here Controll coming: Working Fine\n”);

                }
                else
                {
                    GBCoin *coins = (GBCoin*) bodyB->getNode();
                    coins->removeFromParentAndCleanup(true);
                    printf(”Here Controll coming: Working Fine\n”);

                }
            }
        }
    }
    return true;
}

Почему бы элементу управления не прийти к месту обнаружения шаров и шагов?

...