Как структурировать это, не вводя круговые включения? - PullRequest
2 голосов
/ 13 января 2020

Я пытаюсь понять, как структурировать мою игру. Я хочу передать своих «менеджеров» по ​​иерархии, а не делать их глобальными. Но я столкнулся с проблемой. Один из моих менеджеров обновляет сцены. Необходимо передать ссылку Application на сцены, поскольку application содержит метод quit. Но мое приложение содержит и обновляет этот SceneManager. Поэтому мое приложение теперь включает в себя SceneManager, так как оно нуждается в обновлении, а мой SceneManager включает приложение, поскольку ему необходимо передать ссылку на приложение в сцены.

В основном приложение содержит все менеджеры, SceneManager передает ссылку на приложение на сцены, менеджеры использования сцен Получено из ссылки на приложение.

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

Может ли кто-нибудь подсказать мне, как элегантно структурировать эту часть моей игры? Я знаю о предварительных декларациях, но я хотел бы знать, есть ли решение без необходимости делать предварительные декларации.

Я мог бы использовать глобальные переменные, но я бы не хотел.

Diagram

1 Ответ

2 голосов
/ 14 января 2020

Одним из распространенных (но не единственных) решений этой проблемы является взаимодействие 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...