Gerenciamento de Cenas

O Phaser utiliza um sistema de gerenciamento de cenas robusto que permite organizar diferentes partes do jogo em módulos independentes.

Ciclo de Vida da Cena

Cada cena no Phaser passa por um ciclo de vida bem definido:

init(data)

  • Quando é chamado: Uma vez, quando a cena é inicializada.

  • Propósito: Configurar dados iniciais que a cena pode precisar, geralmente passados de outras cenas através de start() ou launch().


preload()

  • Quando é chamado: Antes da cena ser criada.

  • Propósito: Carregar todos os assets específicos da cena (imagens, áudios, spritesheets, tilemaps). ➔ Nota: No Arretado, muitos assets são pré-carregados globalmente em PreloadAssets.ts, mas assets específicos de cada cena podem ser carregados aqui.


create()

  • Quando é chamado: Uma vez, após preload() ter sido concluído e os assets estarem prontos.

  • Propósito: Criar objetos do jogo, configurar física, adicionar listeners de eventos e estabelecer a lógica inicial da cena.


update(time, delta)

  • Quando é chamado: A cada frame do jogo.

  • Propósito: Processar a lógica de jogo contínua, como movimentação de personagens, detecção de colisões, atualização de UI e leitura de inputs.


shutdown()

  • Quando é chamado: Quando a cena está sendo desligada (parada ou removida).

  • Propósito: Limpar recursos, remover listeners de eventos e destruir objetos para evitar vazamentos de memória.


destroy()

  • Quando é chamado: Quando a cena é completamente destruída e removida do gerenciador de cenas.

  • Propósito: Libera todos os recursos ocupados pela cena de forma definitiva.


Operações de Cena (Phaser.Scene.SceneManager)

O SceneManager do Phaser fornece métodos para controlar o estado das cenas:

this.scene.start(key, data)

  • Função: Inicia uma cena e a coloca no topo da pilha de cenas. ➔ Se a cena já estiver em execução, ela será reiniciada. ➔ Usado para transições completas entre cenas, como do menu para a gameplay.


this.scene.launch(key, data)

  • Função: Inicia uma cena em paralelo com a cena atual. ➔ A cena lançada executa em cima da atual, permitindo múltiplas cenas ativas simultaneamente. ➔ Uso no Arretado: Sobrepor elementos de UI (HUD, barras de saúde) sobre a GameScene, como gameHud, PlayerHealthBar, PlayerBoostCooldownUI e BossHealthBar.


this.scene.stop(key)

  • Função: Para a execução de uma cena, mas ela permanece na memória. Seus métodos update() não são mais chamados. ➔ Útil para pausar cenas ou para transições onde a cena pode ser retomada depois.


this.scene.pause(key)

  • Função: Pausa a execução de uma cena. ➔ Similar ao stop(), mas a cena pode ser retomada com resume() sem reiniciar.


this.scene.resume(key)

  • Função: Retoma a execução de uma cena pausada previamente.


this.scene.remove(key)

  • Função: Remove completamente uma cena do gerenciador de cenas, liberando seus recursos. ➔ Geralmente usado junto com stop() ou após shutdown().


this.scene.bringToTop(key)

  • Função: Traz uma cena para o topo da pilha de renderização, garantindo que ela seja desenhada acima de outras cenas ativas.


Comunicação entre Cenas

Passagem de Dados com start() / launch()

  • Como funciona: Dados podem ser passados para a cena de destino através do segundo argumento de start() ou launch(). ➔ A cena de destino recebe esses dados no método init(). ➔ Exemplo no Arretado: A GameScene recebe o waveKey para saber qual onda carregar.


globalEventEmitter

  • Função: Sistema de eventos global implementado em src/components/events/globalEventEmitter.ts para comunicação flexível e desacoplada.

  • Usos principais:

    • Notificar a UI sobre mudanças no estado do jogador (ex: saúde, cooldown de boost).

    • Sinalizar a conclusão de uma onda (waveCompletedAndAdvance) para que a GameScene gerencie a transição para próxima fase ou cutscene.

    • Permitir comunicação entre componentes independentes sem referências diretas, promovendo modularidade e baixo acoplamento.

Atualizado