Cocos2d-x 3.2 Физический движок: Физические тела контактируют не точно

Я новичок в Cocos2d-x 3.2 Physic Engine (как сказал Cocos2d-x, этот движок основан на Chipmuk). Я сделал образец игры Popcap «Стрельба по яйцам». При обнаружении контакта 2 яиц я столкнулся с проблемой: динамическое «яйцо», кажется, переходит в статическое «яйцо», когда возникает событие контакта. Я поставил для яиц:

  • Масса: 10.f
  • PHYSICSSHAPE_MATERIAL_DEFAULT
  • applyImpulse около (0,900)

Это изображение:

введите здесь описание изображения

Обнаружение события касания мяча

auto contactBallListener = EventListenerPhysicsContact::create();
contactBallListener->onContactBegin = CC_CALLBACK_1(IngameScene::onContactBallsBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactBallListener, this);
.....
bool IngameScene::onContactBallsBegin(PhysicsContact& contact)
{
   auto objA = contact.getShapeA()->getBody()->getNode();
   auto objB = contact.getShapeB()->getBody()->getNode();
}

Физическая установка

if (group == BallGroupTarget) {
    //Green ball
    body->setCategoryBitmask(0xFFFFFFF0);
    body->setContactTestBitmask(0x0000000F);
    body->setCollisionBitmask(0xFFFFFFFF);
} else if (group == BallGroupShooting){
    //Pink ball
    body->setContactTestBitmask(0xFFFFFFFF);
    body->setGravityEnable(false);
}

Можете ли вы помочь мне решить эту проблему?

Большое спасибо!


person Mục Đồng    schedule 07.11.2014    source источник
comment
пожалуйста, добавьте к вашему вопросу настройку физики и код обнаружения столкновений   -  person LearnCocos2D    schedule 07.11.2014


Ответы (2)


С www.cocos2d-x.org

Когда CategoryBitmask одного тела и с ContactTestBitmask другого тела с результатом не равным нулю, будет отправлено событие контакта, иначе событие контакта не будет отправлено.

Когда CategoryBitmask одного тела и с CollisionBitmask другого тела с результатом не равным нулю, они будут коллизированы, иначе - нет.

Обратите внимание, что по умолчанию значение CategoryBitmask равно 0xFFFFFFFF, значение ContactTestBitmask равно 0x00000000, а значение CollisionBitmask равно 0xFFFFFFFF, что означает, что все тела будут сталкиваться друг с другом, но по умолчанию событие контакта не будет отправлено.

Обратите внимание на приведенный выше ВТОРОЙ и третий пункт. Установите соответствующие биты в вашей игре.

сделать статичное тело сделать

pinkBall-›setDynamic(false); // Здесь нет необходимости устанавливать гравитацию false. Теперь розовый шар становится статичным с эффектом невесомости.

person SaffronState    schedule 12.11.2014

bool IngameScene::onContactBallsBegin(PhysicsContact& contact)

Этот метод должен возвращать логическое значение. Ваш ничего не возвращает. Уверен, что компилятор жалуется на это. Не уверен, что С++ по умолчанию, он может даже вернуть мусор.

Верните true, если вы хотите, чтобы тела столкнулись, верните false, если они должны проходить друг через друга.

person LearnCocos2D    schedule 11.11.2014