我要在物体碰到某个点时摆脱它

时间:2019-04-30 11:08:14

标签: java javafx

我正在做一个游戏,我有一个计时器循环,在计时器中我有一些功能可以让花朵产生。一旦花朵达到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();
    }
}
}

3 个答案:

答案 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岁呢?