2012-01-21 230 views
2

我正在开发2D侧滚动Android游戏,使用AndEngine及其BOX2D扩展。BOX2D - 与Monster碰撞

我的球员身上,用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(); 
       } 

但每次我在怪物的“头”跳时间(所以基本上我与脚传感器触摸它)死亡的行动被执行。因为两个联系人都被联系人监听者注意到,所以如果我将脚传感器设置得更高,它就会更有效地突出玩家身体(玩家身体是玩家的精灵纹理的确切形状),所以看起来好像玩家和怪物之间没有接触在所有。

在此先感谢您的任何提示如何正确处理它。

回答

1

我认为最简单的方法就是让您的“脚”感应器成为一个坚固的夹具。也让球员的身材更小。您实际上可以制作3个固定装置的球员:头部,身体,脚部。碰撞还是会被处理以正确的方式,但如果你碰怪物,双脚也没有办法去触摸他的身体,因为固体夹具的

+0

非常感谢,事实上,它是最简单的方法,我遇到了与玩家身体有关的一些问题,但最终它仍然有效。我刚刚添加了第三个称为'down'的固定夹具 - 所以现在有2个固定夹具和一个传感器(脚传感器) – Matim

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

希望它有帮助。

+0

谢谢你的回答,我也会检查这个解决方案。 – Matim