【问题标题】:How to get collision between bat of player and ball and ignore player's body如何在球员的球棒和球之间发生碰撞并忽略球员的身体
【发布时间】:2015-11-27 20:47:01
【问题描述】:

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

【问题讨论】:

    标签: cocos2d-x box2d game-physics chipmunk


    【解决方案1】:

    您正在寻找的是一种区分物理世界中碰撞的方法。使用 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 并从函数中返回。这应该可以解决问题。我用它来处理或忽略特定类型的碰撞。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多