【问题标题】:BOX2D - proper collisions with MonsterBOX2D - 与怪物的正确碰撞
【发布时间】:2012-01-21 13:54:58
【问题描述】:

我正在使用 AndEngine 及其 BOX2D 扩展开发 2D Side scroll Android 游戏。

我有玩家的身体,有 2 个用于“脚”和“头”的传感器,所以我可以准确地知道玩家的哪一侧触摸了不同的物体等。下面的图片展示了它是如何工作的:

它适用于检查玩家当前是否用脚接触地面,例如他可以跳跃等。现在我正在尝试实现与怪物身体接触后执行的动作。

在我的接触传感器中,我正在检查

                if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("foot"))
                {
                    jump();
                }

                if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("player"))
                {
                    GameManager.playSound(lostSound);
                    handleDie();
                }

但是每次我跳到怪物的“头”上(所以基本上我是用脚传感器触摸它)时,就会执行死亡动作。因为接触侦听器会注意到两个接触,所以如果我将脚传感器设置得更高,从玩家身体突出更多(玩家身体是玩家精灵纹理的确切形状),所以看起来玩家和怪物之间没有接触完全没有。

提前感谢您提供如何正确处理它的任何提示。

【问题讨论】:

    标签: java android box2d andengine


    【解决方案1】:

    我认为最简单的方法是让您的“脚”传感器成为坚固的固定装置。也让玩家的身体更小。您实际上可以制作 3 个固定装置的播放器:头部、身体、脚部。碰撞仍然会以正确的方式处理,但如果你用脚接触怪物,由于固定装置,你无法用身体接触它

    【讨论】:

    • 谢谢,它确实有效,事实上这是最简单的方法,我遇到了一些与播放器身体有关的问题,但最终它有效。我刚刚添加了第三个名为“向下”的实心夹具 - 所以现在有 2 个实心夹具和一个传感器(英尺传感器)
    【解决方案2】:

    在您的更新方法上检查这样的联系人:

    for (b2ContactEdge* ce = feet->GetContactList(); ce; ce = ce->next)
    {
    
         const b2Body* bodyA = c->GetFixtureA()->GetBody();
         const b2Body* bodyB = c->GetFixtureB()->GetBody();
         //if one of them is a monster, mark him for being ignored this frame.
    }
    
    for (b2ContactEdge* ce = player->GetContactList(); ce; ce = ce->next)
    {
         const b2Body* bodyA = c->GetFixtureA()->GetBody();
         const b2Body* bodyB = c->GetFixtureB()->GetBody();
         //if the monster is ignored, jump(), else die() 
    }
    

    您可能还应该检查怪物是否在玩家下方。

    这是 C++,但你应该能够在 Java 中做类似的事情。

    希望对你有帮助。

    【讨论】:

    • 谢谢你的回答,我也会检查这个解决方案。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多