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 ответа
Если CategoryBitmask одного тела и с ContactTestBitmask другого тела с результатом не равен нулю, событие контакта будет отправлено, в противном случае событие контакта не будет отправлено.
Когда CategoryBitmask одного тела и CollisionBitmask другого тела с результатом не равен нулю, они будут объединены, в противном случае это не так.
Следует заметить, что по умолчанию значение CategoryBitmask равно 0xFFFFFFFF, значение ContactTestBitmask равно 0x00000000, а значение CollisionBitmask равно 0xFFFFFFFF, что означает, что все тела будут сталкиваться друг с другом, но без отправки события контакта по умолчанию.
Соблюдайте вышеуказанное ВТОРОЕ и третье замечание. Установите биты соответственно в вашей игре.
заставить статичное тело делать
pinkBall->setDynamic(ложь); // Нет необходимости устанавливать гравитацию false здесь. Теперь розовый шар становится статичным с эффектом невесомости
bool IngameScene::onContactBallsBegin(PhysicsContact& contact)
Этот метод должен возвращать bool. Ваш ничего не возвращает. Уверен, что компилятор жалуется на это. Не уверен, что C++ по умолчанию, он может даже вернуть мусор.
Верните true, если хотите, чтобы тела сталкивались, верните false, если они должны проходить друг через друга.