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()
: Retornatrue
se a saúde atual for zero ou menos.isAlive()
: Retornatrue
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 peloPlayer.ts
ao ativar boost, para a UI atualizar cooldown.waveCompletedAndAdvance
: emitido pelaGameScene.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