cocos2dx中的碰撞检测使用Box2D或chipmunk

时间:2015-11-23 06:52:09

标签: cocos2d-x box2d collision chipmunk

我正在制作一个游戏,其中多个角色互相射击并且在击中火焰时他们将使用不同的动画,例如:爆炸,弹跳,模糊等等。现在,我被卡住的事情是,当火正在旅行时,我们如何检查它与其他物体相交?我的意思是仅在目标角色上运行动画。

2 个答案:

答案 0 :(得分:0)

您可以保存想要检查向量的对象,并在场景中安排检查是否发生碰撞的更新。

答案 1 :(得分:0)

这是 Box2D 的答案。

  1. 为您要触发的每个对象创建一个body def。使用下面的一些代码。确保更改形状以适合您的需要。我的代码中的像素与仪表比率设置为32.0。

    b2BodyDef bulletDef;
    bulletDef.type = b2_dynamicBody;
    bulletDef.position.Set(startPositionX / Pixel_To_Meter_Ratio,
                           startPositionY / Pixel_To_Meter_Ratio);
    
    auto b2PolygonShape bulletShape;
    bulletShape.SetAsBox(bulletWidth / Pixel_To_Meter_Ratio,
                         bulletHeight / Pixel_To_Meter_Ratio);
    
    auto bulletBody = physicsWorld->CreateBody(bulletDef)
    
  2. 在您希望子弹前进的位置对身体施加速度。

    bulletBody->ApplyLinearImpulse(b2Vec(bulletDirectionX, 
                                   bulletDirectionY),  
                                   physicsBody->GetPosition(), 
                                   true);
    
  3. 将联系人侦听器添加到继承自b2ContactListener的物理世界

    // Node that manages the physics world from box2d
    class PhysicsNode : public b2ContactListener
    {
     void BeginContact(b2Contact* contact);
    }
    
    // register this listener with the box2d world
    auto physicsWorld = new b2World(b2Vec2(0, -9.8f));
    physicsWorld ->SetContactListener(this);
    
  4. 实现BeginContact函数并在那里处理碰撞。

    void PhysicsNode::BeginContact(b2Contact* contact)
    { 
        // Get the physics bodies
        auto objectOne = contact->GetFixtureA()->GetBody();
        auto objectTwo = contact->GetFixtureB()->GetBody();
    
        // Cast to the type you set as your user data
        auto collidableOne = static_cast<Collidable*>(objectOne->GetUserData());
        auto collidableTwo = static_cast<Collidable*>(objectTwo->GetUserData());
    
        // Handle your collisions. Apply blur/explode/whatever you need
        collidableOne->handleCollision(collidableTwo->isReactableCollision());
        collidableTwo->handleCollision(collidableOne->isReactableCollision());
    }
    
  5. 我希望这会有所帮助。这就是我用来实现您正在寻找的功能。