Uma engine 2D escrita em C++
A G69 Platform Game Engine é um projeto pessoal para estudar
desenvolvimento de jogos 2D em C++.
Em vez de começar com uma engine pronta, decidi montar minha própria estrutura
sobre a raylib.
Isso me permite trabalhar diretamente com o loop do jogo, câmera, colisões,
animações, áudio, mapas e organização das entidades.
A intenção não é competir com Unity, Godot ou outras engines consolidadas.
A G69 é meu laboratório para entender melhor como essas peças se conectam
e, principalmente, para me divertir programando.
O projeto utiliza C++, raylib, Tiled para criação dos mapas e Aseprite para sprites e animações.
O que já funciona
- Loop principal separado em update, fixedUpdate e render
- Câmera 2D com acompanhamento suave, offset, zoom e limites
- Carregamento de tilemaps e camadas criadas no Tiled
- Parallax com múltiplas camadas
- Estrutura inicial de entidades para jogador, cenário e inimigos
- Gravidade, aceleração, velocidade, salto e detecção de solo
- Colisões com tiles retangulares e rampas
- Leitura de polígonos de colisão definidos no Tiled
- Visualização de caixas, contatos e polígonos para depuração
- Animações carregadas de atlas JSON exportado pelo Aseprite
- Música e efeitos sonoros
- Código dividido em módulos de core, física, áudio, jogo e renderização
A engine já possui uma base funcional, mas ainda está em desenvolvimento. Continuo ajustando a arquitetura, corrigindo colisões e adicionando recursos conforme o próprio jogo passa a exigir.
Parallax
O cenário é dividido em camadas que acompanham a câmera em velocidades diferentes. As partes mais distantes se movem menos, enquanto as camadas próximas acompanham o jogador mais rapidamente.
Na G69, cada camada recebe seu próprio fator de deslocamento. Isso permite ajustar o efeito diretamente no mapa e experimentar diferentes composições sem alterar o restante da renderização.
Mapa de colisão
O cenário visível e as colisões são tratados separadamente. No Tiled, defino retângulos e polígonos sobre as regiões sólidas do mapa, e a engine carrega essas formas para realizar os testes de movimento.
Esse sistema já lida com chão, paredes e rampas. A parte mais trabalhosa tem sido manter o movimento estável nas transições entre superfícies, principalmente quando o personagem entra ou sai de uma inclinação.
Sprites animados
As animações são desenhadas no Aseprite e exportadas como imagem e arquivo JSON. A engine lê os quadros, nomes, posições e tempos de exibição diretamente desse atlas.
Dessa forma, animações como parado, corrida e salto podem ser alteradas no Aseprite sem precisar cadastrar manualmente cada quadro no código.
Por que fazer isso?
Porque eu queria programar uma engine.
Engines prontas são excelentes e certamente seriam a escolha mais prática para terminar um jogo. Mas, neste projeto, o caminho é tão importante quanto o resultado. Quero implementar a câmera, descobrir por que o personagem atravessou uma rampa, ajustar o tempo do loop e reorganizar o código quando uma ideia deixa de funcionar.
A raylib cuida da janela, entrada, áudio e renderização básica. Sobre ela, construo apenas o que a G69 precisa. Não pretendo reproduzir todos os recursos de uma engine genérica; prefiro manter o projeto pequeno, legível e fácil de modificar.
Desenvolvo a G69 no Linux utilizando o KDevelop. O repositório também serve como registro do meu aprendizado em C++, arquitetura de jogos, física 2D e organização de projetos maiores.
Talvez um dia ela resulte em um jogo completo. Enquanto isso, já cumpre bem seu propósito: me fazer estudar, testar ideias e continuar gostando de programar.