【问题标题】:Collision detection in cocos2dx Using Box2D or chipmunkcocos2dx 中的碰撞检测使用 Box2D 或花栗鼠
【发布时间】:2015-11-23 06:52:09
【问题描述】:

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

【问题讨论】:

    标签: cocos2d-x box2d collision chipmunk


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是 Box2D 的答案。

      1. 为您要触发的每个对象创建一个主体定义。使用下面的一些代码。确保更改形状以适合您的需要。我在代码中将像素与米的比例设置为 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. 在您希望子弹移动的位置将速度应用于身体 def。

        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());
        }
        

      我希望这会有所帮助。这就是我用来实现您正在寻找的功能的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多