Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays LIBGDX冲突检测使用2个数组和2个迭代器仅检测第一个对象的冲突_Arrays_Iterator_Libgdx_Collision - Fatal编程技术网

Arrays LIBGDX冲突检测使用2个数组和2个迭代器仅检测第一个对象的冲突

Arrays LIBGDX冲突检测使用2个数组和2个迭代器仅检测第一个对象的冲突,arrays,iterator,libgdx,collision,Arrays,Iterator,Libgdx,Collision,我在互联网上到处搜索了好几个小时,但找不到这个确切问题的例子。如果你没有读到这种恐惧,答案如下 如果使用2个libgdx数组和迭代器检查两种对象类型的边界矩形之间的冲突,可能会遇到以下问题: 第二个迭代器仅检测第一个数组中第一个对象的冲突。这方面的一个例子是: 你有一个敌人目标阵列和一个子弹目标阵列。 子弹正穿过所有敌人,除了第一颗子弹。 但是,当项目符号超出边界时,它们将被删除。 一旦第一个敌人被击中,你只能击中下一个产生的敌人。 您的代码如下所示: Iterator<Enemy>

我在互联网上到处搜索了好几个小时,但找不到这个确切问题的例子。如果你没有读到这种恐惧,答案如下

如果使用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();
        }
    }
}

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

这两个迭代器都以其hasNext布尔值为true进行初始化。 敌人迭代器使用第一个敌人开始第一次迭代 对象在敌人数组中。 敌人的迭代器调用第二个迭代器,然后 遍历所有项目符号以检查是否与 敌人的目标。 完成此操作后,项目符号迭代器hasNext被设置为false。 敌方迭代器的下一次迭代调用子弹迭代器 检查碰撞,但hasNext仍然为false,因此它将跳过 正在检查子弹阵列中的任何子弹。 解决方案:在敌人迭代器的迭代循环中初始化子弹迭代器

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