如何在球员和球之间发生碰撞并忽略球员的身体

时间:2015-11-27 20:47:02

标签: cocos2d-x box2d game-physics chipmunk

我有棒球运动员动画,其中玩家用蝙蝠击打,我在那个动画中有90帧,在球上有精灵。我在球上添加了圆形物理身体。如何制作,什么是概念,只与球和蝙蝠发生碰撞,而不是在球员的身体和球之间发生碰撞? 蝙蝠与玩家一起在每个图像上。 我正在使用Cocos2d-x和Chipmunk,但如果这个问题可以解决,我可以轻松切换到Box2d。

1 个答案:

答案 0 :(得分: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进行检查并返回该函数。这应该可以解决问题。这是我用来处理或忽略特定类型的碰撞。

我希望这会有所帮助。