我想在物体达到某个点时摆脱它

我正在制作一个游戏,我有计时器循环,并且在计时器中我有一些允许花生成的功能。一旦花朵达到 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();

    }

}

}


喵喵时光机
浏览 97回答 3
3回答

aluckdog

你有一个清单DeadFlowers,但你从来没有add()什么东西。因此你的循环for(GameObject obj : DeadFlowers) {&nbsp; &nbsp; ((SpawnFlowers)obj).removeFlowers();&nbsp; &nbsp; DeadFlowers.remove(obj);}永远不会跑。你可以例如做public void grow() {&nbsp; &nbsp; age+=1;&nbsp; &nbsp; if(age == 300) {&nbsp; &nbsp; &nbsp; &nbsp; delegate = new DeadFlower(gc, x, y);&nbsp; &nbsp; &nbsp; &nbsp; DeadFlowers.add(delegate);&nbsp; &nbsp; }&nbsp; &nbsp; delegate.update();}我不确定你想用这种方法实现什么。如果这只是重新绘制的代码,您可能想要删除条件。public void removeFlowers() {&nbsp; &nbsp; if (age == 400) {&nbsp; &nbsp; &nbsp; &nbsp; delegate.update();&nbsp; &nbsp; }}

料青山看我应如是

最喜欢的是,您的实际问题在这里:&nbsp;for(GameObject obj : DeadFlowers) {&nbsp; &nbsp;((SpawnFlowers)obj).removeFlowers();&nbsp; &nbsp;DeadFlowers.remove(obj);&nbsp;}&nbsp;当花 300 岁时,您将花变成了 DeadFlower。我假设您还将新的 DeadFlower 对象添加到您的死花列表中。在下一个游戏循环中,上面的代码调用 checks: is the age 400, if so ... do nothing。接下来,您的代码将从死花列表中删除该死花对象!换句话说:当花朵达到 300 时,您将其变成一朵死花。之后,您从死花列表中删除那朵死花。因此,该列表将始终立即清空。长话短说:你的整个逻辑都搞砸了。您必须退后一步并清楚地概述(首先为自己)您拥有哪些存储桶,以及您希望如何处理它们。如:if (age == 400) {&nbsp; &nbsp; delegate.update();}此代码对 400 案例没有任何特定的作用。将其与 300 案例进行比较。在那里你至少创建了一个新对象。有什么变化。但是在 400 的情况下,你会更新。那应该怎么办?!除此之外:您似乎在该类的构造函数中隐式地将死花添加到该列表中。超级坏主意。保存死花列表的类应该是唯一将新花添加到该列表或删除的地方。我假设您的 DeadFlowers 类知道该列表,并将新实例添加到该列表中。那是大错特错。还有一件小事:ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>();最好是List<GameObject> deadFlowers = new ArrayList<>();. 左边不需要表示具体类型(ArrayList),右边也不需要使用泛型。当然,这DeadFlowers违反了 java 命名约定(应该以小写开头)。

有只小跳蛙

如果我没记错的话,在你的花死了之后,你的年龄似乎并没有改变 那么为什么要到 400 岁呢?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java