我有棒球运动员动画,其中玩家用蝙蝠击打,我在那个动画中有90帧,在球上有精灵。我在球上添加了圆形物理身体。如何制作,什么是概念,只与球和蝙蝠发生碰撞,而不是在球员的身体和球之间发生碰撞? 蝙蝠与玩家一起在每个图像上。 我正在使用Cocos2d-x和Chipmunk,但如果这个问题可以解决,我可以轻松切换到Box2d。
答案 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进行检查并返回该函数。这应该可以解决问题。这是我用来处理或忽略特定类型的碰撞。
我希望这会有所帮助。