LibGDX:arrays中的子弹和敌人之间的联合

我正在写一个“Gau刑”风格的游戏。 到目前为止,我已经成功地检测到我的玩家对象和我的幽灵敌人物体之间的碰撞,当他们碰撞时,他们耗尽了玩家的能量。

鬼魂存储在一个ArrayList中。 我现在有玩家可以触发的子弹,这些子弹从Player类实例化,并添加到另一个称为子弹的ArrayList。

我通常在地图上点缀着大约50个鬼魂。

ArrayList<Ghost> ghosts = new ArrayList<Ghost>(); ArrayList<Bullet> bullets = new ArrayList<Bullet>(); 

鬼怪和子弹在生成/发射时被添加到这些列表中

我试图按照下面的方法实现一个方法,试图确定一个鬼的边界矩和一个子弹的边界矩是否重叠,如下所示:

 /** * Check if a ghost has been hit by a bullet */ public void checkGhostsHit() { Iterator<Ghost> iterEn = ghosts.iterator(); while ( iterEn.hasNext() ){ Ghost g = iterEn.next(); //initialise the bullet iterator each time here Iterator<Bullet> iterBul = Player.bullets.iterator(); while ( iterBul.hasNext() ) { Bullet b = iterBul.next(); if ( b.getBoundingRect().overlaps( g.getBoundingRect() ) ) { Gdx.app.log("Enemy", " Hit"); iterBul.remove(); iterEn.remove(); } } } } 

这个方法是从我的主要渲染循环中调用的,但是我不能为了爱或金钱而工作。 我已经尝试了上述方法的各种forms,包括“For”循环等。

我在正确的地方进行检查吗? 如果子弹类实例iteself检查碰撞,或者是上述方法是正确的想法。

正如你可以告诉我这是一个小白菜,我仍然努力工作,应该由特定的游戏类进行的活动。

我猜这里的问题是所谓的隧道

当一个对象在一个更新循环中移动到远处时会发生隧道,因此碰撞永远不会被检测到,因为它会“跳过”另一个对象。

有几种方法可以解决这个问题:

  • 连续碰撞检测:不是在当前位置检查重叠,而是使用从最后到当前位置的方式作为边界框。 这样做,即使你不会在新的位置碰撞,也可以检测到碰撞。
  • 修正更新时间:使用delta作为更新时间,而不是使用delta作为更新时间,你可以使用一个固定的时间(比如说1/60秒)并使用accumulator -approch(在这里查看代码)。 这确保更新具有固定的时间,所以对象可以在一个更新循环中行进的方式是有限的。 此外,逻辑的计算通常需要较less的时间,所以你可以执行多次/渲染循环没有问题。