Game Design Document aqui...
Para mais detalhes sobre MVP (e suas diferenças em relação ao MVC), siga este ótimo artigo da Baeldung: https://www.baeldung.com/mvc-vs-mvp-pattern
O diagrama abaixo mostra o controle de fluxo do padrão arquitetural MVP:
E você pode entendê-lo como:
- Usuário interage com a View
- Presenter é notificado sobre a interação
- Presenter atualiza o estado do Model
- Model retorna a mudança de estado para o Presenter
- Presenter faz o display do Model alterado na View
- Volta para o item 1
Mas como isso fica na prática em um jogo real na Godot Engine?
Se você navegar até ./src/game, vai encontrar alguns pacotes/diretórios que implementam esse padrão, com alguma pequena adaptação.
Primeira adaptação é a criação da classe SceneManager. Essa seria a classe Main ou o index.js se fosse numa aplicação. É o Entry Point dessa Scene. Responsável por instanciar e injetar as dependências das Presenters:
public override void _Ready()
{
var camera = GetNode<Camera2D>("Camera");
this.cameraService = new GodotCameraService(camera);
this.playerView = GetNode<PlayerView>("Player");
this.player = new Player("Leandro Vieira");
var playerPresenter = new PlayerPresenter(this.cameraService, this.player, this.playerView);
playerPresenter.Start();
this.sceneView = GetNode<MapView>("Map");
this.scene = new Map();
var scenePresenter = new MapPresenter(this.cameraService, this.scene, this.sceneView);
scenePresenter.Start();
}
Classes do tipo Manager serão associadas sempre ao Node root da Scene, nesse caso Lisbon:
Map e Player, os outros Nodes principais dessa Scene, terão, respectivamente, GodotMapView e GodotPlayerView.
As classes Presenter, tanto MapPresenter quanto PlayerPresenter, servem para orquestrar as ações de Map e Player oriundas das suas View.
Responsável pelas ações do Player, como por exemplo a movimentação (andar/correr/parar) e a animação.
Responsável pelos atributos, estado e lógica de um Player.
Responsável por orquestrar os Inputs da View e as mudanças de estado do Model, incluindo alterar a posição da câmera para posição atual do Player.
Responsável pelas ações do Mapa, como por exemplo o redimensionamento da tela.
Responsável pelos atributos, estado e lógica de um Mapa.
Responsável por orquestrar os Inputs da View e as mudanças de estado do Model, incluindo a definição dos limites da câmera quando ocorre um redimensionamento.
Como tanto a PlayerPresenter quanto a MapPresenter interagem com a câmera, CameraService serve para unificar ações em uma câmera. Player chama o método UpdatePosition
de GodotCameraService.cs, enquanto o Map chama o método SetLimits
de GodotCameraService.cs