AWESOME ENGINE / GUIA TÉCNICO

Cenas e ciclo de vida

O contrato Scene, o registro de jogos, as transições adiadas e a limpeza de estado.

Nesta página

O contrato de uma cena

Uma cena recebe EngineContext por referência e define como iniciar, atualizar e desenhar. Este contrato existe na revisão de referência:

class Scene {
protected:
  EngineContext &ctx;

public:
  Scene(EngineContext &context) : ctx(context) {}
  virtual ~Scene() = default;

  virtual void Start() = 0;
  virtual void Update() = 0;
  virtual void Render() const = 0;

  virtual void OnEvent(const sf::Event &) {};
  virtual void OnPause(bool /* pausa */) {};
  virtual void OnCleanup() {};
};

Start, Update e Render são obrigatórios. Os demais callbacks têm implementação vazia e são especializados quando o jogo precisa deles.

Responsabilidades por etapa

Etapa Quando ocorre Uso dentro do jogo
Construtor Ao criar o registro inicial de cenas. Preparar objetos e recursos da instância.
Start Ao ativar ou reiniciar a cena. Restabelecer a partida e registrar seus controles.
OnEvent Ao receber eventos com a sobreposição oculta. Tratar eventos discretos do jogo.
Update Por quadro, com foco e sem sobreposição visível. Avançar lógica, movimento e estado.
Render Ao desenhar o quadro da cena ativa. Enviar objetos para ctx.renderer.
OnPause Quando o estado de pausa muda. Pausar ou retomar os elementos controlados pela cena.
OnCleanup Antes de sair da cena ou reiniciá-la. Parar o áudio e limpar estados que não devem continuar.

O construtor e Start não são equivalentes. As instâncias permanecem no registro e podem receber Start várias vezes.

Registro de jogos

SceneFactory::Scenes é um unordered_map que associa nomes a unique_ptr<Scene>. A fábrica registra sete instâncias:

scenes.emplace("Bounce", std::make_unique<Bounce::Game>(context));
scenes.emplace("Clicker", std::make_unique<Clicker::Game>(context));
scenes.emplace("MemoryCard", std::make_unique<MemoryCard::Game>(context));
scenes.emplace("TicTacToe", std::make_unique<TicTacToe::Game>(context));
scenes.emplace("MineSweeper", std::make_unique<MineSweeper::Game>(context));
scenes.emplace("Runner", std::make_unique<Runner::Game>(context));
scenes.emplace("Tetris", std::make_unique<Tetris::Game>(context));

A revisão documentada solicita Tetris no construtor do Engine. Os nomes são chaves exatas do registro; não há um caminho de recuperação implementado para uma cena desconhecida.

Transição adiada

SceneManager::ChangeScene armazena o nome solicitado se ainda não houver outra mudança pendente. O Engine consome essa solicitação no início do próximo processamento de eventos.

ChangeScene(nome)
     ↓
Solicitação pendente
     ↓
Próximo ProcessEvent
     ↓
OnCleanup da cena anterior
     ↓
Limpeza de partículas e bindings de entrada
     ↓
Troca do ponteiro ativo
     ↓
Start da cena solicitada
     ↓
Sincronização da pausa

RestartCurrentScene usa o mesmo mecanismo com o nome atual. Ele não destrói e reconstrói o objeto: por isso, Start deve deixar a partida em um estado válido mesmo quando repetido.

Explorar uma implementação real

Bounce mostra como uma classe de jogo recebe o contexto, prepara sua raquete e estatísticas, solicita som e música e usa os callbacks da cena.

Para adicionar uma cena à sua própria cópia, siga a separação existente: declaração em Games/Include, implementação em Games/Source e registro explícito em SceneFactory.cpp. O CMake descobre os arquivos .cpp dessas pastas com GLOB_RECURSE CONFIGURE_DEPENDS; não existe plugin de cenas carregado em tempo de execução.

Limitação de acesso ao menu

A sobreposição inclui um botão Menu, e o atalho M chama o mesmo fluxo. O Engine solicita uma cena chamada Menu, mas a fábrica dessa revisão não a registra. Evite essa ação ao explorar esta versão: ela pode disparar uma asserção ou uma exceção por chave inexistente.

Esta documentação mantém essa limitação explícita; ela não apresenta o menu como um seletor de jogos disponível.

Fontes

Baseado em código-fonte verificado.Encontrou um problema? →