我正在使用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();
}
但每次我跳到怪物的“头部”(所以基本上我用脚传感器触摸它)就会执行死亡动作。因为接触式听众会注意到这两个接触,所以如果我将脚传感器设置得更高,从玩家身体突出更多(玩家身体是玩家精灵纹理的精确形状),它就会起作用,所以看起来玩家和怪物之间没有接触一点都不。
提前感谢您提供正确处理的任何提示。
答案 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中做类似的事情。
希望它有所帮助。