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

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

  • Масса: 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);
}

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

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

2 ответа

С www.cocos2d-x.org

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

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

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

Соблюдайте вышеуказанное ВТОРОЕ и третье замечание. Установите биты соответственно в вашей игре.

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

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

bool IngameScene::onContactBallsBegin(PhysicsContact& contact)

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

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

Другие вопросы по тегам