亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我想在物體達到某個點時擺脫它

我想在物體達到某個點時擺脫它

喵喵時光機 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 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號