2015-11-27 7 views
0

У меня есть анимация бейсболиста, где игрок бьет битой, у меня есть 90 кадров в этой анимации и на спрайте для мяча. Я добавил круговое физическое тело к мячу. Как сделать, что такое концепция, получить столкновение только с мячом и битой, а не между телом игрока и мячом? Бат на каждом изображении вместе с игроком. Я использую Cocos2d-x и Chipmunk, но я могу легко переключиться на Box2d, если эта проблема разрешима.Как получить столкновение между летучей мышью игрока и мячом и проигнорировать тело игрока

ответ

0

Что вы ищете, это способ различать столкновения в вашем физическом мире. При использовании 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 и возврата из функции. Это должно сделать трюк. Это то, что я использую для обработки или игнорирования конкретных типов конфликтов.

Надеюсь, это поможет.