1

我正在构建一个游戏,我决定使用 GameState 抽象类来组织它,这样我就可以定义菜单、关卡和其他东西。

我有一个名为 GameStateManager 的类,它保存所有状态并在需要时更改它们。将 GameStateManager 的实例传递给 GameState 构造器是否正确,只是为了访问他的状态更改方法?

如果没有,还有其他方法吗?

4

4 回答 4

0

将 GameStateManager 的实例传递给 GameState 构造器是否正确,只是为了访问他的状态更改方法?

不。

您应该只拥有一个经理实例和一个引用。这意味着您应该使用基于实例的系统。例如:

GameStateManager instance = GameStateManager.getInstance();

这样你就可以静态访问它。

这可以通过以下方式完成:

// in GameStateManager.java

private static GameStateManager instance;

protected static GameStateManager getInstance(){
    if(instance == null){
        instance = new GameStateManager(); //private constructor
    }
    return instance;
} 

我假设protected将在这里工作,基于所有 GameState 实例与 GameStateManager 在同一个包中。

于 2013-07-14T22:26:28.340 回答
0

将 a的实例GameState传递给构造函数是有意义的,如果它可以拥有 的集合,因为您需要 a来管理GameStateManagerGameStateGameStatesGameStateManagerGameStatesGameState

但是,如果不是这种情况,我认为将 传递给构造函数是没有意义的。的全部意义在于改变状态,因此,除非出现上述情况,否则不应使用 a 来更改其他状态,而应使用 the。 GameStateManagerGameStateGameStateManagerGameStateGameStateManager

如果您想弄清楚如何通知GameStateManagercurrentGameState需要更改,您可以有一个static方法GameStateManager,您可以调用 fromGameState来更改 current GameState。如果你不想做public,这是有道理的,只要你的类在同一个包中,你就可以做到protected static。这应该适合您的目的。

于 2013-07-14T22:29:05.567 回答
0

在OO中思考,您需要问自己是否对ieGameState有硬依赖(组合),GameStateManager如果没有它就无法执行GameStateManager,那么您可以使用构造函数来传递GameStateManager

如果对 ieGameState具有软依赖(聚合),GameStateManager即它可以在没有的情况下执行GameStateManager,那么您可以使用 getter/setter 传递GameStateManager

于 2013-07-15T01:32:34.427 回答
0

我认为最干净的解决方案是使用观察者模式GameStateManager知道所有GameStates(他是观察者并且必须实现notify()他可以处理游戏状态更改逻辑的 - 方法)。

在创建新GameState的 时,GameStateManager必须像这样将自己注册为观察者newGameState.registerObserver(this)

当一个GameState主题)改变时,它会为所有的监听器(例如,只有一个 GameStateManager)调用 notify。这样,GameState 根本不需要知道 GameStateManager,而只知道如果它发生了变化,一些观察者需要通知什么。

于 2013-07-15T01:48:29.510 回答