Detalhes de Implementação

Esta seção aborda aspectos específicos da implementação do jogo Arretado, focando em como funcionalidades cruciais como colisões, gerenciamento de saúde e o sistema de eventos são tratados no código.

Segue a documentação técnica formatada para o conteúdo solicitado, no mesmo padrão:


Collider.ts

Localização

src/components/Collider.ts


Propósito

Componente central para a detecção e resposta a interações físicas entre os objetos do jogo, utilizando o sistema de física Arcade do Phaser. Configura e gerencia os Phaser.Physics.Arcade.Collider para diferentes pares de objetos.


Funcionamento

Configuração (create())

Define as regras de colisão, tais como:

  • Inimigos colidem com o jogador, causando dano ao jogador.

  • Projéteis do jogador colidem com inimigos, causando dano a eles.

  • Projéteis de inimigos colidem com o jogador, causando dano ao jogador.


Callbacks

Para cada par de colisão, uma função callback é definida e executada sempre que a colisão ocorre. Essas funções aplicam a lógica do jogo, incluindo:

  • Redução da saúde do objeto atingido (usando HealthComponent).

  • Desativação ou destruição de projéteis após o impacto.

  • Reprodução de efeitos visuais e sonoros (explosões, sons de impacto, etc.).


Otimização

O uso de grupos de inimigos (BasicEnemyGroup, RangedEnemyGroup, etc.) aliado ao sistema de colisão do Phaser otimiza o desempenho, pois as colisões são verificadas entre grupos inteiros, não individualmente para cada objeto.


HealthComponent.ts

Localização

src/components/HealthComponent.ts


Propósito

Componente genérico e reutilizável que encapsula a lógica de saúde para qualquer entidade do jogo (jogador, inimigos, chefes), promovendo reutilização e consistência no gerenciamento de vida.


Funcionalidades Principais

  • Propriedades:

    • Saúde atual

    • Saúde máxima

  • Métodos:

    • loseHealth(amount: number): Diminui a saúde atual, garantindo que não fique abaixo de zero.

    • gainHealth(amount: number): Aumenta a saúde atual, respeitando o máximo definido.

    • isDead(): Retorna true se a saúde atual for zero ou menos.

    • isAlive(): Retorna true se a saúde atual for maior que zero.

  • Eventos: O componente pode emitir eventos (via globalEventEmitter) quando a saúde muda ou quando a entidade morre, permitindo que outros sistemas (como UI) reajam em tempo real, sem acoplamento direto.


globalEventEmitter.ts

Localização

src/components/events/globalEventEmitter.ts


Propósito

Implementa o padrão Publicador/Assinante (Publisher/Subscriber) para comunicação desacoplada entre diferentes partes do jogo, essencial para modularidade e escalabilidade.


Utilização

  • Emissão de eventos: Componentes emitem eventos para sinalizar acontecimentos, por exemplo:

    • playerEvents.boostActivated: emitido pelo Player.ts ao ativar boost, para a UI atualizar cooldown.

    • waveCompletedAndAdvance: emitido pela GameScene.ts ao concluir uma onda, disparando transição para próxima fase ou cutscene.

    • Eventos relacionados à mudança de saúde ou morte (emitidos por HealthComponent).

  • Escuta de eventos: Outros componentes se registram para ouvir eventos específicos e executam callbacks quando os eventos ocorrem.


Benefícios

  • Desacoplamento entre módulos.

  • Flexibilidade para adicionar ou modificar listeners sem alterar emissores.

  • Melhora a manutenibilidade e reduz complexidade das dependências.


Gerenciamento de Assets e Tilemaps

Assets

Todos os recursos (imagens, spritesheets, áudios, tilemaps) são organizados em src/assets e pré-carregados em PreloadAssets.ts.


Tilemaps

O método setupTilemap (em GameOptionsConfig.ts) é responsável por carregar e configurar os tilemaps de cada onda, permitindo diferentes layouts e áreas de colisão para cada fase.


Configurações Dinâmicas

Arquivos de Configuração

Situados em src/config, definem parâmetros do jogo como:

  • Estatísticas do jogador (PlayerConfig.ts).

  • Opções gerais (GameOptionsConfig.ts).

  • Dados de ondas (wavesContainer.ts).

Atualizado