G69 Platform Game Engine

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
Animação do personagem parado

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.


Cenário da G69 utilizando camadas de parallax

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.

Visualização do mapa de colisões da G69
Animação do personagem correndo
Spritesheet da animação de corrida

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.

Código da G69 aberto no KDevelop