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

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

多個對象如何在沒有實例引用的情況下向對象發送通知(在 java 中)?

多個對象如何在沒有實例引用的情況下向對象發送通知(在 java 中)?

慕桂英546537 2023-05-10 13:20:46
我正在用 Java 開發視頻游戲,我想在所有敵人都死后進入下一個級別。我有一個 Enemy 類、一個 Level 類和一個 WorldGame 類。在 WorldGame 中,我移除了敵人,但我不知道如何在所有敵人都死了而必須進入下一個級別時通知級別,而不將 Level 的實例傳遞給所有敵人。你有什么建議嗎?class Alien {}class GameWorld {  removeEnemy();}class Level {  goToNextLevel();}
查看完整描述

4 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

查看觀察者設計模式。Java 中的內置版本已被刪除,但您可以輕松編寫自己的版本。(事件的)偵聽器仍然是 Java 模式的一個示例。

這個想法是,一個 Java 對象,比如 A,可以被另一個 Java 對象,比如 O“觀察”。事實上,可以有任意數量的“觀察者”。所有觀察者都是獨立的,彼此不了解,A 對觀察者一無所知。

現在,A 可以做的是在有理由這樣做時(通過調用方法)發出通知(A 可能是一個死去的怪物)。這導致在所有觀察者中調用一個特殊方法(更新),然后可以采取行動(例如,減少仍然活著的怪物的數量)。

關鍵是一旦所有設置完成,任何類都不需要引用其他類。

聽起來你正在尋找這樣的東西。


查看完整回答
反對 回復 2023-05-10
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

我認為你在混淆責任。關卡(或敵人)不知道其他敵人。我認為你更需要這樣的東西:


 class GameWorld { 


    public void mainGameLoop() {

       ...

       removeEnemiesThatRequireRemoval();

       if (getNumberEnemiesLeft() == 0) {

         currentLevel = levelsManager.goToNextLevel(currentLevel);

意義:

  • 級別類不知道“下一個”級別(它只知道自己)

  • 如前所述:一個敵人不知道(所有剩余的)敵人

這就是您的中央“控制結構”需要具備的所有知識。它不應該去任何其他地方。

這應該是你的中心主題:任何對象都應該確切地知道它需要什么來完成它的核心工作,而不是更多。它的核心工作也應該盡可能清晰和具體。


查看完整回答
反對 回復 2023-05-10
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

在您的示例中,您可以使用事件偵聽器機制。創建事件AllEnemiesDeadEvent和偵聽器接口AllEnemiesDeadListener。將偵聽器的注冊表保存在GameWorld. 讓 Gameworld 在它調用時跟蹤死去的敵人removeEnemy()。當所有敵人都死了它會引發事件。

現在,讓 Level 類注冊AllEnemiesDeadListener并在該事件發生時得到通知。

如果Level是唯一對此事件感興趣的類,請保持簡單。只需調用Level#gotoNextLevel()GameWorld不是事件模型。


查看完整回答
反對 回復 2023-05-10
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

假設您的應用程序中的 GameWorld 類可以訪問所有關卡,而這些關卡又在該關卡上有敵人。您可以參考以下代碼庫并提出最適合您需求的解決方案。


public class GameWorld {


    private List<GameLevel> gameLevels;

    private GameLevel currentLevel;


    public GameWorld() {

        gameLevels = new LinkedList<GameLevel>();

        this.instantiate();

    }


    private void instantiate() {

        // instantiate game adding levels to it

    }


    public void moveToNextLevel() {

        currentLevel = currentLevel.next();

    }


}


public class Enemy {


    private EnemyType enemyType;

    private GameLevel gameLevel;


    public Enemy(GameLevel level, EnemyType type) {

        enemyType = type;

        gameLevel = level; 

    }


    private void create() {

        // .. instantiation task

        gameLevel.listEnemy(this);

    }


    private void killEnemy() {

        // clean up task

        gameLevel.delistEnemy(this);

        // .. clean up task

    }


}


public class GameLevel {


    private GameWorld gameWorld;

    private List<Enemy> enemies;

    private GameLevel nextLevel;


    public GameLevel(GameWorld world) {

        enemies = new ArrayList<Enemy>();

        gameWorld = world;

    }


    public void listEnemy(Enemy enemy) {

        enemies.add(enemy);

    }


    public void delistEnemy(Enemy enemy) {

        enemies.remove(enemy);

        if(enemies.isEmpty()) {

            gameWorld.moveToNextLevel();

        }

    }


    public void setNextLevel() {

        // set next level after this

    }


    public GameLevel next() {

        return nextLevel;

    }


}



查看完整回答
反對 回復 2023-05-10
  • 4 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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