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