LIBGDX使用2个阵列和2个迭代器进行碰撞检测,仅检测第一个对象的碰撞

时间:2015-03-24 21:49:32

标签: arrays iterator libgdx collision

我在网上搜索了几个小时的高低,但无法找到这个确切问题的例子。如果你正在阅读这种恐惧,那么答案就在下面。

如果使用2个libgdx数组和迭代器来检查两种对象类型的边界矩形之间的碰撞,则可能会遇到以下问题:

第二个迭代器仅检测第一个数组中第一个对象的冲突。这方面的一个例子是:

  • 你有一系列敌人物品和一系列子弹物体。
  • 子弹飞过所有敌人,除了第一个产生的敌人。
  • 然而,子弹在越界时会被删除。
  • 一旦第一个敌人被击中,你就可以只击中下一个产生的敌人。
  • 您的代码如下所示:

    Iterator<Enemy> iterEn = arrayEnemies.getIterator();
    Iterator<Bullet> iterBul = arrayBullets.getIterator();
    while (iterEn.hasNext){
    Enemy e = iterEn.next();
    while (iterBul.hasNext(){
        Bullet b = iterBul.next();
        if (b.isOutOfBounds)iterBul.remove();
        if (b.getRectangle().overlaps(e.getRectangle()){ 
            iterBul.remove();
            iterEn.remove();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

如果声明两个迭代器并希望在另一个迭代器中使用一个迭代器,则会发生以下情况:

  1. 两个迭代器都是初始化的,其hasNext()布尔值为true。
  2. 敌人迭代器开始与第一个敌人的第一次迭代 敌人阵列中的物体。
  3. Enemy迭代器调用第二个迭代器,然后调用它 遍历所有项目符号以检查与项目的冲突 敌人的对象。
  4. 完成此操作后,Bullet iterator hasNext()设置为false。
  5. Enemy迭代器的下一次迭代然后调用Bullet迭代器 检查冲突,但hasNext()仍为false,因此它会跳过 检查项目符号数组中的任何项目符号。
  6. 解决方案:在Enemy迭代器的迭代循环中初始化项目符号迭代器

    Iterator<Enemy> iterEn = arrayEnemies.getIterator();
    
    while (iterEn.hasNext){
       Enemy e = iterEn.next();
    
        //initialise the bullet iterator each time here
        Iterator<Bullet> iterBul = arrayBullets.getIterator();
    
        while (iterBul.hasNext(){
            Bullet b = iterBul.next();
            if (b.isOutOfBounds)iterBul.remove();
            if (b.getRectangle().overlaps(e.getRectangle()){ 
                iterBul.remove();
                iterEn.remove();
            }
        }
    }