Um projeto clássico do jogo Pong desenvolvido em C puro com a biblioteca gráfica Raylib, mas com um diferencial importante: foi construído utilizando a arquitetura de software ECS (Entity Component System).
Este projeto foi um desafio pessoal para aprofundar conhecimentos em C e explorar padrões de arquitetura de alta performance comuns na indústria de jogos.
Em vez de usar uma abordagem tradicional orientada a objetos, este projeto foi estruturado em torno do padrão ECS para promover uma melhor separação de preocupações e otimização de cache.
-
Entities (Entidades): São apenas identificadores únicos (um
int). Não possuem dados nem lógica. -
Components (Componentes): São
structsque contêm apenas dados puros, representando um aspecto de uma entidade. Por exemplo:CTransform(posição e tamanho),CVelocity(velocidade),CPlayerInput(teclas de controle). A associação é feita através de uma bitmaskComponentMask. -
Systems (Sistemas): São funções puras que contêm toda a lógica do jogo. Cada sistema opera em um conjunto de entidades que possuem os componentes necessários. Por exemplo, o
SMovimentatua em todas as entidades que têm os componentesTRANSFORMeVELOCITY. -
World (Mundo): Uma
structcentral que armazena todos os componentes em arrays contíguos (SoA - Structure of Arrays), melhorando a localidade dos dados.
Essa abordagem torna o código mais modular, flexível e performático.
- Jogabilidade clássica de Pong para dois jogadores locais.
- Controles por teclado e Gamepad.
- Sistema de pontuação.
- Efeitos sonoros para colisões e pontos.
- Física de colisão entre a bola, os paddles e os limites do cenário.
Este projeto utiliza um Makefile para simplificar o processo. Certifique-se de ter o gcc e a biblioteca raylib instalados.
# Clone o repositório
git clone https://github.com/travrei/PongECS.git
cd PongECS
# Compile o projeto
make
# Execute o jogo
make run
# Para limpar os ficheiros compilados
make clean- Linguagem: C
- Biblioteca Gráfica e de Áudio: Raylib
Um dos maiores desafios deste projeto foi a implementação de um sistema de colisão preciso. A abordagem inicial usando funções prontas da biblioteca não oferecia o controle necessário sobre a direção da colisão, resultando em comportamentos fisicamente incorretos (como a bola alterar a sua velocidade vertical ao colidir horizontalmente com um paddle).
A solução foi desenvolver uma lógica de colisão personalizada, analisando pontos específicos na circunferência da bola. Este processo, embora desafiador, foi um exercício valioso em resolução de problemas e na compreensão mais profunda da física de jogos 2D, mas ainda usando os recursos que a biblioteca Raylib me oferece.
