Componentes Principais

Esta seção detalha os componentes mais importantes do jogo Arretado, explicando suas responsabilidades e como interagem entre si.

GameScene.ts

Descrição Geral

GameScene.ts é a cena central de jogabilidade, responsável por orquestrar a maioria dos elementos do jogo durante as fases de combate. Estende Phaser.Scene e gerencia o ciclo de vida da cena, incluindo inicialização, criação de objetos, atualização da lógica do jogo e desligamento.


Principais Responsabilidades

1. Inicialização da Cena (init())

  • Configura a onda atual do jogo (#currentWaveKey).

  • Carrega os dados da onda correspondentes usando o WaveManager.

  • Atualiza o waveIndicator com as informações da onda e do ato.


2. Criação de Elementos do Jogo (create())

  • Limpa colliders e corpos físicos do mundo para garantir um estado limpo a cada reinício da cena.

  • Inicializa o HealthComponent para o jogador, usando as estatísticas de playerStats.

  • Lança as cenas de UI:

    • gameHud

    • PlayerBoostCooldownUI

  • Configura:

    • A duração da onda.

    • O SoundManager, reproduzindo a música de fundo da onda atual.

  • Carrega e posiciona o background da onda, se especificado.

  • Configura o tilemap, se presente, usando setupTilemap.

  • Configura os controles de entrada do jogador via inputManager.

  • Cria instâncias de:

    • Player

    • Grupos de inimigos:

      • BasicEnemyGroup

      • RangedEnemyGroup

      • DashEnemyGroup

      • TankEnemyGroup

      • BossEnemy

    • Observação: grupos opcionais são inicializados como undefined se não estiverem presentes na onda.

  • Lança a BossHealthBar, se um chefe estiver presente, e configura seu corpo físico como imovível.

  • Inicializa:

    • shootingController (gerenciamento dos tiros do jogador)

    • Collider (gerenciamento de colisões)

  • Lança a PlayerHealthBar após um pequeno atraso para garantir que todos os elementos estejam prontos.

  • Configura:

    • Os limites do mundo físico.

    • A câmera para seguir o jogador.

  • Configura um listener para o evento waveCompletedAndAdvance do globalEventEmitter, gerenciando a transição para:

    • Cutscene

    • Próxima fase


3. Atualização da Lógica do Jogo (update())

  • Garante que o retículo de mira do jogador permaneça dentro dos limites da tela (containReticle).

  • Chama handlePause() para gerenciar a funcionalidade de pausa do jogo.

  • Atualiza:

    • Estado do Player

    • Todos os grupos de inimigos, chamando seus métodos update() ou updateEnemyMovement().


4. Gerenciamento de Pausa (handlePause())

  • Detecta a entrada da tecla de pausa.

  • Alterna o estado de pausa das cenas:

    • gameScene

    • gameHud

  • Lança ou para a PauseScene.


5. Desligamento da Cena (shutdown())

  • Para a música da onda.

  • Remove todos os listeners de eventos.

  • Limpa:

    • Grupos de inimigos

    • Player

    • shootingController

    • collider

  • Destroi os corpos físicos do mundo para liberar recursos.

Player.ts

Descrição Geral

A classe Player representa o personagem controlável pelo jogador no jogo. Estende Phaser.Physics.Arcade.Sprite, conferindo propriedades físicas e a capacidade de interagir com o mundo físico do Phaser.


Principais Responsabilidades

1. Inicialização (Construtor)

  • Configura o sprite do jogador, adicionando-o à cena e ao sistema de física.

  • Define propriedades visuais:

    • Profundidade

    • Escala

    • Offset

  • Define limites de colisão com o mundo.

  • Inicializa o controlKeys através do inputManager.

  • Cria uma instância de HealthComponent para gerenciar a saúde do jogador.


2. Movimentação do Jogador (playerMovement())

  • Lida com a entrada do teclado para mover o jogador.

  • Calcula a direção do movimento com base nas teclas pressionadas (cima, baixo, esquerda, direita).

  • Aplica a velocidade definida em playerStats.MoveSpeed.

  • Inclui lógica para movimentação diagonal.

  • Implementa um sistema de boost (aceleração temporária) ativado pela tecla de espaço, com cooldown associado.

  • Usa o globalEventEmitter para emitir um evento quando o boost é ativado, permitindo que outros componentes (como a UI) reajam à mudança.


3. Animação do Jogador (playerAnimation())

  • Controla as animações do sprite do jogador:

    • lampiaoRun (movimento)

    • lampiaoIdle (parado)

  • Baseia-se no estado de movimento retornado por playerMovement().


4. Recebimento de Dano (takeDamage())

  • Chamado quando o jogador sofre dano.

  • Utiliza o HealthComponent para subtrair a quantidade de dano da saúde atual.

  • Registra mensagens no console sobre:

    • O dano recebido

    • Se o jogador morreu


5. Gerenciamento de Saúde

  • Através do HealthComponent, encapsula a lógica de saúde, permitindo:

    • Perda de saúde

    • Verificação de estado (vivo ou morto)


Grupos de Inimigos

Descrição Geral

O jogo apresenta diversos tipos de inimigos, cada um com comportamentos e características distintas. Cada tipo é gerenciado por sua própria classe de grupo, estendendo Phaser.Physics.Arcade.Group ou similar, para gerenciamento eficiente.


Principais Responsabilidades (Gerais para Grupos de Inimigos)

1. Criação e Gerenciamento

  • Cria e gerencia instâncias de inimigos.

  • Adiciona inimigos à cena.

  • Configura propriedades físicas e visuais.

  • Reutiliza objetos (pooling) para otimizar desempenho.


2. Movimentação

  • Cada grupo implementa sua lógica específica:

    • BasicEnemyGroup: movimento simples em direção ao jogador.

    • DashEnemyGroup e RangedEnemyGroup: padrões de ataque mais complexos.

    • BossEnemy: método updateEnemyBossMovement para comportamento único.


3. Ataque

  • Inimigos podem atacar de diferentes formas:

    • Contato direto

    • Projéteis (RangedEnemyGroup)

    • Habilidades especiais (BossEnemy)


4. Saúde e Dano

  • Possuem sistema de saúde.

  • Grupos gerenciam a lógica de dano e destruição dos inimigos ao chegar a zero de vida.


5. Atualização

  • Método updateEnemyMovement() (ou similar) é chamado a cada frame para:

    • Atualizar movimentação

    • Controlar animações

    • Executar ataques


Collider.ts

Descrição Geral

Classe crucial para interação entre elementos do jogo, configurando e gerenciando detecções de colisão entre jogador, inimigos e projéteis, além de aplicar efeitos resultantes (ex: dano).


Principais Responsabilidades

1. Configuração de Colisões (create())

  • Configura Phaser.Physics.Arcade.Collider entre:

    • Inimigos e Jogador: jogador sofre dano ao colidir com inimigos.

    • Projéteis do Jogador e Inimigos: inimigo sofre dano e projétil é desativado/destruído.

    • Projéteis de Inimigos e Jogador: jogador sofre dano e projétil é desativado/destruído.


2. Tratamento de Colisões

  • Define funções callback que:

    • Aplicam lógica de jogo (redução de saúde, efeitos visuais/sonoros).

    • Removem objetos do jogo quando necessário.


3. Destruição (destroy())

  • Remove todos os colliders configurados.

  • Evita vazamentos de memória e interações indesejadas após o encerramento da cena.


shootingController.ts

Descrição Geral

Gerencia a lógica de tiro do jogador, coordenando disparo de projéteis, mira e interação com inimigos.


Principais Responsabilidades

1. Inicialização (Construtor)

  • Recebe referências à:

    • Cena

    • Jogador

    • Grupos de inimigos

  • Configura o retículo de mira do jogador.


2. Criação (create())

  • Configura eventos de entrada para tiro do jogador (ex: clique do mouse).


3. Controle do Retículo (containReticle())

  • Garante que o retículo permaneça dentro dos limites da tela.


4. Lógica de Tiro

  • Determina direção do projétil.

  • Cria e lança projétil em direção ao retículo.

  • Gerencia cooldown e seleção de alvos, se aplicável.


5. Destruição (destroy())

  • Limpa listeners de eventos e referências para evitar vazamentos de memória.


SoundManager.ts

Descrição Geral

Componente utilitário para gerenciar reprodução de áudios do jogo, incluindo músicas de fundo e efeitos sonoros.


Principais Responsabilidades

1. Inicialização (init())

  • Recebe a cena atual para configurar o sistema de áudio do Phaser.


2. Reprodução de Música de Onda (playWaveMusic())

  • Inicia a música de fundo da onda atual.

  • Para música anterior antes de iniciar nova, evitando sobreposições.


3. Parada de Música de Onda (stopCurrentWaveMusic())

  • Para a música de fundo da onda atual durante desligamento ou transições.


4. Reprodução de Efeitos Sonoros

  • Pode incluir métodos para reproduzir efeitos específicos (ex: tiro, dano, explosões).


HealthComponent.ts

Descrição Geral

Componente reutilizável que gerencia a saúde de qualquer entidade (jogador, inimigos, chefe), encapsulando a lógica de perda/ganho de saúde e verificação de estado.


Principais Responsabilidades

1. Inicialização (Construtor)

  • Recebe:

    • Saúde máxima

    • Saúde inicial

    • Tipo da entidade (ex: 'player', 'enemy')


2. Perda de Saúde (loseHealth())

  • Reduz a saúde atual pela quantidade especificada.

  • Garante que saúde não fique abaixo de zero.


3. Ganho de Saúde (gainHealth())

  • Aumenta a saúde atual pela quantidade especificada.

  • Garante que saúde não exceda a máxima.


4. Verificação de Estado

  • isDead() e isAlive() retornam estado atual com base na saúde.


5. Eventos

  • Pode emitir eventos (ex: healthChanged, entityDied) para notificar outros componentes.

  • Utiliza globalEventEmitter para atualizações em tempo real da UI.


inputManager.ts

Descrição Geral

Gerencia e fornece acesso aos controles de entrada do jogador, abstraindo a complexidade da API de entrada do Phaser.


Principais Responsabilidades

1. Configuração de Controles (setupControls())

  • Recebe a cena atual.

  • Configura listeners de teclado para:

    • Teclas de movimento (W, A, S, D ou setas)

    • Espaço (boost)

    • P (pausa)


2. Obtenção de Teclas (getKeys())

  • Retorna objeto com referências às teclas configuradas, permitindo que outros componentes verifiquem estados (pressionada, solta, etc).


WaveManager.ts e wavesContainer.ts

Descrição Geral

Gerenciam as ondas de inimigos do jogo em conjunto. O wavesContainer.ts define as estruturas de dados, enquanto o WaveManager.ts fornece métodos de acesso e manipulação.


Principais Responsabilidades

1. Definição de Ondas (wavesContainer.ts)

  • Contém mapa de configurações para cada onda, incluindo:

    • Duração

    • Música de fundo

    • Background

    • Tilemap

    • Lista de inimigos


2. Obtenção de Dados da Onda (WaveManager.ts)

  • getWaveData() retorna dados de configuração da onda baseada na chave.


3. Progressão da Onda

  • Apesar da progressão ser gerenciada pela GameScene via evento waveCompletedAndAdvance, o WaveManager fornece os dados necessários para tal.


Atualizado