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
Java 在libgdx中迭代ArrayList的问题_Java_Arrays_Loops_Libgdx - Fatal编程技术网

Java 在libgdx中迭代ArrayList的问题

Java 在libgdx中迭代ArrayList的问题,java,arrays,loops,libgdx,Java,Arrays,Loops,Libgdx,我正在libgdx中重新制作导弹指挥系统 我有3个数组列表:子弹,导弹,和房屋。 我一直在尝试遍历列表,以检测导弹和房屋,以及导弹和子弹之间的碰撞,但到目前为止,我得到了这个非常广泛的错误消息: Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at java.base/jdk.internal.util.Preco

我正在libgdx中重新制作导弹指挥系统

我有3个数组列表:
子弹
导弹
,和
房屋
。 我一直在尝试遍历列表,以检测
导弹
房屋
,以及
导弹
子弹
之间的碰撞,但到目前为止,我得到了这个非常广泛的错误消息:

Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:458)
    at com.mygdx.game.Screen.MCGameScreen.render(MCGameScreen.java:112)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
我尝试遍历列表的每一种方法都存在相同的问题,这些列表导致(可能是
导弹
)数组列表检查由于碰撞而已删除的位置上的内容。我不想“重用”数组中的对象,我更喜欢删除它们

这是创建新导弹的代码,并将其添加到
导弹
阵列中,每2秒创建一个新导弹,在屏幕顶部给定一个随机位置,并添加到
导弹

timer += delta;

        if(timer >= 2) {
            Sprite temp = new Sprite(missile);
            temp.setPosition((float) (Math.random() * Gdx.graphics.getWidth() - temp.getWidth()), Gdx.graphics.getHeight());
            missiles.add(temp);
            timer = 0;
        }
这是创建新子弹并将其添加到
子弹
阵列的代码,每次按下空格键时,都会创建一个新子弹,设置到坦克位置的中心,并添加到
子弹

if(keycode == Input.Keys.SPACE) {
            Sprite temp = new Sprite(bullet);
            temp.setPosition(tank.getX() + tank.getWidth()/2 - temp.getWidth()/2, tank.getY() + tank.getHeight());
            bullets.add(temp);
        }
这是我在创建要添加到列表的
temp
变量以及ArrayList本身时使用的预设精灵的初始化

bullet = new Sprite(new Texture("bullet.png"));
bullets = new ArrayList<>();

missile = new Sprite(new Texture("missile.png"));
missiles = new ArrayList<>();

house = new Sprite(new Texture("house.png"));
houses = new ArrayList<>();
bullet=新精灵(新纹理(“bullet.png”);
项目符号=新的ArrayList();
飞弹=新精灵(新纹理(“飞弹.png”);
导弹=新阵列列表();
house=新精灵(新纹理(“house.png”);
houses=新阵列列表();
这是我第一次尝试检查碰撞,我也用同样的环移动导弹和子弹

        for(int i = bullets.size()-1; i >= 0; i--) {
            bullets.get(i).translateY(bulletSpeed);
            if(bullets.get(i).getY() >= Gdx.graphics.getHeight() + bullet.getHeight()) {
                bullets.remove(i);
            }
            for(int j = missiles.size()-1; j >= 0; j--) {
                if(missiles.get(j).getBoundingRectangle().overlaps(bullets.get(i).getBoundingRectangle())) {
                    missiles.remove(j);
                    bullets.remove(i);
                }
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            missiles.get(i).translateY(missileSpeed);
            if(missiles.get(i).getY() <= 0) {
                missiles.remove(i);
            }
            for(int j = houses.size()-1; j >= 0; j--) {
                if(houses.get(j).getBoundingRectangle().overlaps(missiles.get(i).getBoundingRectangle())) {
                    houses.remove(j);
                    missiles.remove(i);
                }
            }
        }
for(int i=bullets.size()-1;i>=0;i--){
bullets.get(i).translateY(bulletSpeed);
if(bullet.get(i).getY()>=Gdx.graphics.getHeight()+bullet.getHeight()){
删除(i);
}
对于(int j=employments.size()-1;j>=0;j--){
if(hills.get(j).getBoundingRectangle()重叠(子弹.get(i).getBoundingRectangle())){
导弹。移除(j);
删除(i);
}
}
}
对于(int i=smilations.size()-1;i>=0;i--){
导弹.get(i).translateY(导弹速度);
if(i.get(i).getY()=0;j--){
if(houses.get(j).getBoundingRectangle().overlaps(himmets.get(i).getBoundingRectangle())){
房屋。拆除(j);
导弹。移除(i);
}
}
}
这是我尝试过的第二种方法,我将所有内容分割成单独的循环,以防数组的索引即使在被删除后仍在循环中使用

        for(int i = bullets.size()-1; i >= 0; i--) {
            bullets.get(i).translateY(bulletSpeed);
            if(bullets.get(i).getY() >= Gdx.graphics.getHeight() + bullet.getHeight()) {
                bullets.remove(i);
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            missiles.get(i).translateY(missileSpeed);
            if(missiles.get(i).getY() <= 0) {
                missiles.remove(i);
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            for(int j = bullets.size()-1; j >= 0; j--) {
                if(missiles.get(i).getBoundingRectangle().overlaps(bullets.get(j).getBoundingRectangle())) {
                    missiles.remove(i);
                    bullets.remove(j);
                }
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            for(int j = houses.size()-1; j >= 0; j--) {
                if(missiles.get(i).getBoundingRectangle().overlaps(houses.get(j).getBoundingRectangle())) {
                    missiles.remove(i);
                    houses.remove(j);
                }
            }
        }
for(int i=bullets.size()-1;i>=0;i--){
bullets.get(i).translateY(bulletSpeed);
if(bullet.get(i).getY()>=Gdx.graphics.getHeight()+bullet.getHeight()){
删除(i);
}
}
对于(int i=smilations.size()-1;i>=0;i--){
导弹.get(i).translateY(导弹速度);
if(i.get(i).getY()=0;i--){
对于(int j=bullets.size()-1;j>=0;j--){
if(hills.get(i).getBoundingRectangle()重叠(子弹.get(j).getBoundingRectangle())){
导弹。移除(i);
删除(j);
}
}
}
对于(int i=smilations.size()-1;i>=0;i--){
对于(int j=houses.size()-1;j>=0;j--){
if(hills.get(i).getBoundingRectangle().重叠(houses.get(j).getBoundingRectangle())){
导弹。移除(i);
房屋。拆除(j);
}
}
}
我也尝试过这个变体,使用增强的for循环

        for(Sprite missile: missiles) {
            missile.translateY(missileSpeed);
            if(missile.getY() <= 0) {
                missiles.remove(missiles.indexOf(missile));
            }
        }

        for(Sprite bullet: bullets) {
            bullet.translateY(bulletSpeed);
            if(bullet.getY() >= Gdx.graphics.getHeight() + bullet.getHeight()) {
                bullets.remove(bullets.indexOf(bullet));
            }
        }

        for(Sprite missile: missiles) {
            for(Sprite bullet: bullets) {
                if(missile.getBoundingRectangle().overlaps(bullet.getBoundingRectangle())) {
                    missiles.remove(missiles.indexOf(missile));
                    bullets.remove(bullets.indexOf(bullet));
                }
            }
        }
for(精灵导弹:导弹){
导弹速度;
if(employee.getY()=Gdx.graphics.getHeight()+bullet.getHeight()){
项目符号。删除(项目符号。索引(项目符号));
}
}
用于(精灵导弹:导弹){
用于(精灵子弹:子弹){
if(smail.getBoundingRectangle().overlaps(bullet.getBoundingRectangle())){
导弹。移除(导弹。索引(导弹));
项目符号。删除(项目符号。索引(项目符号));
}
}
}

如果您需要我遗漏的任何详细信息,请告诉我!

我回到我的答案,在那里我将每个操作拆分为它自己的for循环:

        for(int i = bullets.size()-1; i >= 0; i--) {
            bullets.get(i).translateY(bulletSpeed);
        }

        for(int i = bullets.size()-1; i >= 0; i--) {
            if(bullets.get(i).getY() >= Gdx.graphics.getHeight() + bullet.getHeight()) {
                bullets.remove(i);
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            missiles.get(i).translateY(missileSpeed);
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            if(missiles.get(i).getY() <= 0) {
                missiles.remove(i);
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            for(int j = bullets.size()-1; j >= 0; j--) {
                if(missiles.get(i).getBoundingRectangle().overlaps(bullets.get(j).getBoundingRectangle())) {
                    bullets.remove(j);
                    missiles.remove(i);
                    break;
                }
            }
        }

        for(int i = missiles.size()-1; i >= 0; i--) {
            for(int j = houses.size()-1; j >= 0; j--) {
                if(missiles.get(i).getBoundingRectangle().overlaps(houses.get(j).getBoundingRectangle())) {
                    houses.remove(j);
                    missiles.remove(i);
                    break;
                }
            }
        }

for(int i=bullets.size()-1;i>=0;i--){
bullets.get(i).translateY(bulletSpeed);
}
对于(int i=bullets.size()-1;i>=0;i--){
if(bullet.get(i).getY()>=Gdx.graphics.getHeight()+bullet.getHeight()){
删除(i);
}
}
对于(int i=smilations.size()-1;i>=0;i--){
导弹.get(i).translateY(导弹速度);
}
对于(int i=smilations.size()-1;i>=0;i--){
if(i.get(i).getY()=0;i--){
对于(int j=bullets.size()-1;j>=0;j--){
if(hills.get(i).getBoundingRectangle()重叠(子弹.get(j).getBoundingRectangle())){
删除(j);
导弹。移除(i);
打破
}
}
}
对于(int i=smilations.size()-1;i>=0;i--){
对于(int j=houses.size()-1;j>=0;j--){
if(hills.get(i).getBoundingRectangle().重叠(houses.get(j).getBoundingRectangle())){
房屋。拆除(j);
导弹。移除(i);
打破
}
}
}
`iterator()` 
    for(int i = bullets.size()-1; i >= 0; i--) {
        bullets.get(i).translateY(bulletSpeed);
        if(bullets.get(i).getY() >= Gdx.graphics.getHeight() + bullet.getHeight()) {
            bullets.remove(i);
        }
        for(int j = missiles.size()-1; j >= 0; j--) {
            if(missiles.get(j).getBoundingRectangle().overlaps(bullets.get(i).getBoundingRectangle())) {
                missiles.remove(j);
                bullets.remove(i);
            }
        }
    }
    for(int i = missiles.size()-1; i >= 0; i--) {
        for(int j = bullets.size()-1; j >= 0; j--) {
            if(missiles.get(i).getBoundingRectangle().overlaps(bullets.get(j).getBoundingRectangle())) {
                missiles.remove(i);
                bullets.remove(j);
            }
        }
    }
for(int i = missiles.size()-1; i >= 0; i--) {
    for(int j = bullets.size()-1; j >= 0; j--) {
        if(missiles.get(i).getBoundingRectangle().overlaps(bullets.get(j).getBoundingRectangle())) {
            missiles.remove(i);
            bullets.remove(j);
            break;
        }
    }
}
    for(Iterator<Sprite> iterator = missiles.iterator(); iterator.hasNext();) {
        Sprite missile = iterator.next()
        missile.translateY(missileSpeed);
        if(missile.getY() <= 0) {
            iterator.remove();
        }
    }