У меня есть анимация бейсболиста, где игрок бьет битой, у меня есть 90 кадров в этой анимации и на спрайте для мяча. Я добавил круговое физическое тело к мячу. Как сделать, что такое концепция, получить столкновение только с мячом и битой, а не между телом игрока и мячом? Бат на каждом изображении вместе с игроком. Я использую Cocos2d-x и Chipmunk, но я могу легко переключиться на Box2d, если эта проблема разрешима.Как получить столкновение между летучей мышью игрока и мячом и проигнорировать тело игрока
ответ
Что вы ищете, это способ различать столкновения в вашем физическом мире. При использовании box2D вы можете установить пользовательские данные для физического тела. Когда происходит столкновение, вы можете получить два тела, которые сталкиваются и получить информацию о пользователе, установленную на нем. Затем соответствующим образом обработайте столкновение.
Псевдо-код ниже, чтобы создать тело:
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(tileNode->getPositionX()/Pixel_To_Meter_Ratio,
tileNode->getPositionY()/ Pixel_To_Meter_Ratio);
auto b2CircleShape ballShape;
ballShape->m_radius = ballSize/PTM_RATIO; // Pixel to meter ration is 32.0 in my project
auto ballBody= physicsWorld->CreateBody(ballBodyDef);
// This will be used later on when you want to have different reactions for different collisions.
ballBody->SetUserData("BallBody");
Используя подобный код выше создать битое тело (не будет ставить все ниже код).
...
auto batBody = physicsWorld->CreateBody(batBodyDef);
batBody->setUserData("BatBody");
При выполнении чека в контактном слушателя вы можете игнорировать все столкновения, которые имеют пользовательские данные, которые не соответствуют BallBody и BatBody. Что-то вроде ниже в вашем обработчике столкновений.
auto objectOne = contact->GetFixtureA()->GetBody();
auto objectTwo = contact->GetFixtureB()->GetBody();
auto objectOneUserData = (objectOne->GetUserData());
auto objectTwoUserData = (objectTwo->GetUserData());
ли ваши чеки на выше USERDATA и возврата из функции. Это должно сделать трюк. Это то, что я использую для обработки или игнорирования конкретных типов конфликтов.
Надеюсь, это поможет.