4 回答

TA貢獻1963條經驗 獲得超6個贊
查看觀察者設計模式。Java 中的內置版本已被刪除,但您可以輕松編寫自己的版本。(事件的)偵聽器仍然是 Java 模式的一個示例。
這個想法是,一個 Java 對象,比如 A,可以被另一個 Java 對象,比如 O“觀察”。事實上,可以有任意數量的“觀察者”。所有觀察者都是獨立的,彼此不了解,A 對觀察者一無所知。
現在,A 可以做的是在有理由這樣做時(通過調用方法)發出通知(A 可能是一個死去的怪物)。這導致在所有觀察者中調用一個特殊方法(更新),然后可以采取行動(例如,減少仍然活著的怪物的數量)。
關鍵是一旦所有設置完成,任何類都不需要引用其他類。
聽起來你正在尋找這樣的東西。

TA貢獻2065條經驗 獲得超14個贊
我認為你在混淆責任。關卡(或敵人)不知道其他敵人。我認為你更需要這樣的東西:
class GameWorld {
public void mainGameLoop() {
...
removeEnemiesThatRequireRemoval();
if (getNumberEnemiesLeft() == 0) {
currentLevel = levelsManager.goToNextLevel(currentLevel);
意義:
級別類不知道“下一個”級別(它只知道自己)
如前所述:一個敵人不知道(所有剩余的)敵人
這就是您的中央“控制結構”需要具備的所有知識。它不應該去任何其他地方。
這應該是你的中心主題:任何對象都應該確切地知道它需要什么來完成它的核心工作,而不是更多。它的核心工作也應該盡可能清晰和具體。

TA貢獻1744條經驗 獲得超4個贊
在您的示例中,您可以使用事件偵聽器機制。創建事件AllEnemiesDeadEvent
和偵聽器接口AllEnemiesDeadListener
。將偵聽器的注冊表保存在GameWorld
. 讓 Gameworld 在它調用時跟蹤死去的敵人removeEnemy()
。當所有敵人都死了它會引發事件。
現在,讓 Level 類注冊AllEnemiesDeadListener
并在該事件發生時得到通知。
如果Level
是唯一對此事件感興趣的類,請保持簡單。只需調用Level#gotoNextLevel()
而GameWorld
不是事件模型。

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;
}
}
添加回答
舉報