BOX2D - 与Monster的正确碰撞

时间:2012-01-21 13:54:59

标签: java android box2d andengine

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

我有玩家身体,有2个传感器用于“脚”和“头部”所以我可能确切地知道玩家的哪一侧接触到不同的物体等。这里的图像显示它是如何工作的:

enter image description here

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我认为最简单的方法是让你的'脚'传感器成为一个坚固的装置。也让球员的体型更小。你实际上可以制作3个固体装置的玩家:头部,身体,脚部。碰撞仍将以正确的方式处理,但如果你用脚触摸怪物,由于固体夹具无法用身体触碰他

答案 1 :(得分:0)

在您的更新方法上检查此类联系人:

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中做类似的事情。

希望它有所帮助。