为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2022-11-02 09:59:22
我正在制作一个游戏,我有计时器循环,并且在计时器中我有一些允许花生成的功能。一旦花朵达到 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 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

你有一个清单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();

    }

}


查看完整回答
反对 回复 2022-11-02
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

最喜欢的是,您的实际问题在这里:


 for(GameObject obj : DeadFlowers) {

   ((SpawnFlowers)obj).removeFlowers();

   DeadFlowers.remove(obj);

 } 

当花 300 岁时,您将花变成了 DeadFlower。我假设您还将新的 DeadFlower 对象添加到您的死花列表中。在下一个游戏循环中,上面的代码调用 checks: is the age 400, if so ... do nothing。接下来,您的代码将从死花列表中删除该死花对象!


换句话说:当花朵达到 300 时,您将其变成一朵死花。之后,您从死花列表中删除那朵死花。因此,该列表将始终立即清空。


长话短说:你的整个逻辑都搞砸了。您必须退后一步并清楚地概述(首先为自己)您拥有哪些存储桶,以及您希望如何处理它们。如:


if (age == 400) {

    delegate.update();

}

此代码对 400 案例没有任何特定的作用。将其与 300 案例进行比较。在那里你至少创建了一个新对象。有什么变化。但是在 400 的情况下,你会更新。那应该怎么办?!


除此之外:您似乎在该类的构造函数中隐式地将死花添加到该列表中。超级坏主意。保存死花列表的类应该是唯一将新花添加到该列表或删除的地方。我假设您的 DeadFlowers 类知道该列表,并将新实例添加到该列表中。那是大错特错。


还有一件小事:ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>();最好是List<GameObject> deadFlowers = new ArrayList<>();. 左边不需要表示具体类型(ArrayList),右边也不需要使用泛型。当然,这DeadFlowers违反了 java 命名约定(应该以小写开头)。


查看完整回答
反对 回复 2022-11-02
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

如果我没记错的话,在你的花死了之后,你的年龄似乎并没有改变 那么为什么要到 400 岁呢?



查看完整回答
反对 回复 2022-11-02
  • 3 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信