我正在做一个游戏,我有一个计时器循环,在计时器中我有一些功能可以让花朵产生。一旦花朵达到300岁的年龄,它们就会变成枯萎的花朵并且图像发生变化,但是一旦花朵达到400岁的年龄,我就希望它们消失了,但是我不知道我要去哪里出错了所以。
AnimationTimer timer = new AnimationTimer() {
ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>();
@Override
public void handle(long now) {
// TODO Auto-generated method stub
gc.drawImage(img1, 0, 0, canvas.getWidth(), canvas.getHeight());
if(count++>60) {
flowers.add(new SpawnFlowers(gc, rnd.nextInt(600), rnd.nextInt(550)));
count = 1;
}
for(GameObject obj : Hive) {
obj.update();
}
for(GameObject obj : flowers) {
((SpawnFlowers)obj).grow();
}
for(GameObject obj : DeadFlowers) {
((SpawnFlowers)obj).removeFlowers();
DeadFlowers.remove(obj);
}
for(GameObject obj : characterList) {
obj.update();
}
}
};
我的鲜花班:
class SpawnFlowers extends GameObject implements FlowerIF {
FlowerIF delegate;
int age= 0;
public SpawnFlowers(GraphicsContext gc, double x, double y) {
super(gc, x, y);
img = new Image("/res/rose.png");
update();
delegate = this;
// TODO Auto-generated constructor stub
}
public void grow() {
age+=1;
if(age == 300)
delegate = new DeadFlower(gc, x, y);
delegate.update();
}
public void removeFlowers() {
if (age == 400) {
delegate.update();
}
}
}
答案 0 :(得分:2)
您有一个列表DeadFlowers
,但您从来没有add()
。
因此循环
for(GameObject obj : DeadFlowers) {
((SpawnFlowers)obj).removeFlowers();
DeadFlowers.remove(obj);
}
将永远不会运行。
您可以例如
public void grow() {
age+=1;
if(age == 300) {
delegate = new DeadFlower(gc, x, y);
DeadFlowers.add(delegate);
}
delegate.update();
}
我不太确定您想用这种方法实现什么。如果这只是要重画的代码,则可能要删除条件。
public void removeFlowers() {
if (age == 400) {
delegate.update();
}
}
答案 1 :(得分:1)
最像是您的实际问题在这里:
for(GameObject obj : DeadFlowers) {
((SpawnFlowers)obj).removeFlowers();
DeadFlowers.remove(obj);
}
您将花朵变成了300岁的DeadFlower。我假设,您还将该新的DeadFlower对象添加到了死花列表中。在下一个游戏循环中,上面的代码调用检查:年龄为400岁,如果是……则不执行任何操作。接下来,您的代码将从死花列表中删除该死花对象!
换句话说:当花朵达到300时,您将其变成一朵枯萎的花朵。之后,您从死花列表中删除该死花。因此,该列表将始终被立即清空。
长话短说:您的整个逻辑已经搞砸了。您必须退后一步,并首先(为您自己)清楚地概述拥有的存储桶以及如何处理它们。如:
if (age == 400) {
delegate.update();
}
此代码对这400种情况没有任何具体说明。将其与300例进行比较。在那里至少创建一个 new 对象。有些变化。但是在400情况下,您可以进行更新。那应该怎么办?!
除此之外:似乎您正在将死花隐式添加到该类的构造函数中的列表中。超级坏主意。 保存死花列表的类应该是唯一添加或删除新花的地方。我假设您的DeadFlowers类知道该列表,并将新实例添加到该列表。那是死错误。
还有一件小事:ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>();
最好是List<GameObject> deadFlowers = new ArrayList<>();
。无需在左侧表示特定类型(ArrayList),也无需在右侧使用通用类型。当然,DeadFlowers
违反了Java命名约定(应该以小写开头)。
答案 2 :(得分:0)
如果我没记错的话,在你的花朵死了之后,看来你没有改变年龄,那为什么要达到400岁呢?