Java 在libgdx中迭代ArrayList的问题
我正在libgdx中重新制作导弹指挥系统 我有3个数组列表: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
子弹
,导弹
,和房屋
。
我一直在尝试遍历列表,以检测导弹
和房屋
,以及导弹
和子弹
之间的碰撞,但到目前为止,我得到了这个非常广泛的错误消息:
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();
}
}