我试图弄清楚如何构造我的游戏。我想将我的“经理”传递给高层,而不是使其全局化。但是我遇到了一个问题。我的一位经理更新了场景。由于应用程序包含退出方法,因此需要将应用程序引用传递给场景。但是我的应用程序保留并更新了此SceneManager。因此,我的应用程序现在包括需要更新的SceneManager,而我的SceneManager包括需要将应用程序引用传递给场景的Application。

基本上,应用程序拥有所有管理器,SceneManager将应用程序引用传递给场景,场景使用管理器是从应用程序引用中获得的。

// In application
sceneManager.updateScenes(*this);
// In SceneManager
currentScene.update(application)
// In scene
application.getSceneManager().doSomething()

谁能建议我如何优雅地构建游戏的这一部分?我知道前向声明,但是我想知道是否有解决方案而无需进行前向声明。

我可以使用全局变量,但我不愿意。

c++ - 如何在不引入通函包含的情况下构建此结构?-LMLPHP

最佳答案

解决此问题的一种常见(但不是唯一)解决方案是让Scene通过Application实现的接口(interface)与Application通信,而不是直接引用。

这样做的另一个好处是,可以更清楚地表达需要准确调用的Scene(和其他依赖项)。

例如:

interface ISceneHandler {
  void Quit(); // Request that we quit the game.
}

class Application : ISceneHandler {
  private SceneManager sceneManager;

  public Application() {
    // Pass ourself as the handler.
    sceneManager = new SceneManager(this);
  }

  public void Quit() { ... }
}

class SceneManager {
  private ISceneHandler handler;

  public SceneManager(ISceneHandler handler) {
    this.handler = handler;
  }

  public void SomeEvent() {
    this.handler.Quit();
  }
}

关于c++ - 如何在不引入通函包含的情况下构建此结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59723854/

10-11 07:21