Java 从ArrayList中删除特定索引对象并将其从后台删除

Java 从ArrayList中删除特定索引对象并将其从后台删除,java,javafx,game-development,Java,Javafx,Game Development,我试图在我的游戏中实现一个生命计数器,但遇到了一些问题。生命由一个图像表示,因此当玩家失去生命时,一个图像被移除。我已经设法做到这一点,但它是在一个低效的方式(如果语句链等),我正在寻找一种方法来做得更好。我添加了一个ArrayList,当玩家死亡时,在某个索引处会丢失一条生命(并删除图像),我已经实现了它,但我认为我在某个地方出错了,因为我得到了一个“长度为0的索引超出边界”的异常。这是我得到的相关代码: 创建5个生命对象并将其添加到背景中 background.addLife(新生活(“文件

我试图在我的游戏中实现一个生命计数器,但遇到了一些问题。生命由一个图像表示,因此当玩家失去生命时,一个图像被移除。我已经设法做到这一点,但它是在一个低效的方式(如果语句链等),我正在寻找一种方法来做得更好。我添加了一个ArrayList,当玩家死亡时,在某个索引处会丢失一条生命(并删除图像),我已经实现了它,但我认为我在某个地方出错了,因为我得到了一个“长度为0的索引超出边界”的异常。这是我得到的相关代码:

创建5个生命对象并将其添加到背景中

background.addLife(新生活(“文件:resources/frogLife.png”,30,5,5));
addLife(新生活(“文件:resources/frogLife.png”,30,40,5));
addLife(新生活(“文件:resources/frogLife.png”,30,75,5));
addLife(新生活(“文件:resources/frogLife.png”,30110,5));
addLife(新生活(“文件:resources/frogLife.png”,30145,5));
下面是一个计时器,如果动物死亡,它应该得到最右边的生命图像对象的索引,将其从背景中移除,从ArrayList中移除,并减少生命数

else if (animal.getDeathStatus() == true)
{
  life = life.getLifeFromIndex(numOfLives);
  background.removeLife(life);
  life.removeLife(numOfLives);
  numOfLives--;
}
lives类,创建此类型的对象时,应将其添加到ArrayList中

public void Lives extends ImageView
{
    ArrayList<Lives> Lives = new ArrayList<Lives>();

    public Lives(String imageLink, int size, int xpos, int ypos)
    {
        setImage(new Image(imageLink, size,size, true, true));
        setX(xpos);
        setY(ypos);
        Lives.add(this);
    }

    public Lives getLifeFromIndex(int index)
    {
        return Lives.get(index);
    }

    public void removeLife(int index)
    {
        Lives.remove(index);
    }
}
公共视图
{
ArrayList Lives=新的ArrayList();
公共生活(字符串imageLink、int size、int xpos、int ypos)
{
setImage(新图像(imageLink,size,size,true,true));
setX(xpos);
setY(ypos);
加上(这个);
}
公共生活getLifeFromIndex(int索引)
{
返回生命。获取(索引);
}
公共void removeLife(int索引)
{
删除(索引);
}
}

如果在实际删除之前添加.isEmpty()检查是否有要删除的内容,该怎么办?这将防止超出列表的范围。

我会做不同的事情<代码>寿命至
寿命
。Life.setImage。然后在主代码中创建ArrayList。然后删除一个life
life-life=lifes.get(lifes.size()-1);背景。删除(生活);生命。移除(生命)类似的内容。@Sedrick在这行
background.addLife(newlifes(“file:resources/frogLife.png”,30,5,5))中创建元素时,我不需要将每个元素分别添加到ArrayList中?每个
生命
对象有1个
生命
列表。(请使用适当的java命名约定,并使用以小写字母btw开头的变量名。)删除索引0处的索引以外的任何索引将导致异常,对同一实例调用
removeLife
方法两次也会导致异常。。。我想你应该创建一个单独的类来管理生活。为此向
ImageView
添加额外逻辑似乎是不必要的。使用
HBox
您也可以简单地执行
HBox.getChildren().remove(0)
只要HBox中有子对象,这也会影响定位。你在后台添加生命的方式是不合逻辑的,会导致问题。@Sedrick为什么?这与使用计数器并没有什么不同,我只是添加了一个图像来代替计数器,每次生命损失时,屏幕上就会删除一个图像。我已经成功地使用了您的第一个建议,使用
Life=lifes.get(lifes.size()-1)等等,谢谢你,好吧,我在
生命
类中添加了一个名为
checkIfEmpty
的方法,并将Else if语句改为this
animal.getDeathStatus()==true&&life.checkIfEmpty()==false
,所以现在它不会崩溃,但实际上也不会删除任何内容