- Rust 97.8%
- WGSL 2.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| src | ||
| .editorconfig | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| logo.png | ||
| README.md | ||
Simple Minecraft
Um Minecraft simples, feito do zero em Rust para aprender como um jogo de blocos funciona por dentro: janela, GPU, shaders, câmera, chunks, geração de terreno, física e colisão.
Em vez de usar uma engine pronta, o jogo conversa direto com a placa de vídeo pelo wgpu e abre a janela com o winit. Cada etapa da construção é uma issue do repositório, então o histórico do projeto também serve de roteiro de estudo.
O que já dá para fazer
- Andar por um mundo infinito gerado por ruído Perlin, com morros, montanhas, praias, florestas e campos
- Pular, cair e colidir com os blocos, ou voar livremente
- Quebrar e colocar blocos, inclusive vidro, tochas que iluminam e portas que abrem e fecham
- Camas para dormir à noite e marcar onde você renasce se cair para fora do mundo
- Um inventário com todos os blocos, para escolher os 9 que ficam na hotbar
- Iluminação com sombra suave nos cantos (ambient occlusion) e neblina no horizonte
- Ciclo de dia e noite de 20 minutos, com sol, lua, crepúsculo e noites escuras
- O mundo é salvo sozinho ao fechar o jogo e a cada minuto
O que vem pela frente está nas issues, divididas em marcos (milestones), um para cada fase do jogo.
Controles
| Tecla | Ação |
|---|---|
| W A S D | Andar |
| Espaço | Pular (voando: subir) |
| Shift | Voando: descer |
| Ctrl | Correr |
| F | Liga e desliga o modo voo |
| Mouse | Olhar ao redor |
| Clique esquerdo | Quebrar o bloco na mira |
| Clique direito | Colocar o bloco selecionado, abrir e fechar portas, deitar na cama |
| 1 a 9 ou roda do mouse | Escolher o espaço da hotbar |
| E | Abre e fecha o inventário |
| T (segurando) | Acelera o tempo |
| Esc | Solta o mouse; com o mouse solto, fecha o jogo |
Inventário
Aperte E para abrir o inventário com todos os blocos. Para fixar um bloco na hotbar:
- clique no bloco e depois no espaço da hotbar; ou
- passe o mouse em cima do bloco e aperte o número do espaço (1 a 9).
Clicando num espaço da hotbar você pega o bloco dele para levar a outro espaço, e o clique direito esvazia o espaço. A hotbar escolhida fica salva junto com o mundo.
Mundos e saves
O jogo continua de onde você parou: o mundo é salvo ao fechar e a cada minuto, em
%APPDATA%\AbyssDev\Simple Minecraft\data\mundo.sav no Windows e em
~/.local/share/simple-minecraft/mundo.sav no Linux.
Para começar outro mundo, use uma das opções abaixo. Elas substituem o save atual ao sair.
simple-minecraft --novo
simple-minecraft --semente 2026
A seed define o terreno: a mesma seed gera sempre o mesmo mundo. Só os blocos que você mudou vão para o save.
Como baixar e jogar
Baixe o pacote do seu sistema na página de Releases. Não é preciso instalar Rust para jogar.
Windows: extraia o simple-minecraft-<versão>-windows-x86_64.zip e abra o simple-minecraft.exe.
Linux:
tar -xzf simple-minecraft-<versão>-linux-x86_64.tar.gz
./simple-minecraft
Conferindo o download
Cada Release traz um SHA256SUMS com a impressão digital de cada pacote, para você conferir se o arquivo chegou inteiro.
No Linux, na pasta dos arquivos baixados:
sha256sum -c SHA256SUMS --ignore-missing
No Windows (PowerShell), compare o resultado com a linha do pacote no SHA256SUMS:
Get-FileHash simple-minecraft-<versão>-windows-x86_64.zip -Algorithm SHA256
Compilando a partir do código
Precisa do Rust 1.85 ou superior, instalado pelo rustup.
git clone https://cosmos.simioni.dev.br/caio/simple-minecraft-rust.git
cd simple-minecraft-rust
cargo run --release
Sem o --release o jogo compila mais rápido, mas roda bem mais devagar. Para jogar, use sempre o --release.
Estrutura do projeto
simple-minecraft-rust/
├── Cargo.toml Nome, versão e dependências do jogo
├── src/
│ ├── main.rs Ponto de entrada: log, seed e o loop de eventos
│ ├── app.rs O jogo: eventos da janela, game loop e regras de quebrar e colocar
│ ├── camera.rs Câmera em primeira pessoa e projeção em perspectiva
│ ├── entrada.rs Estado do teclado e do mouse
│ ├── interface.rs Inventário e hotbar: layout, cliques e atalhos
│ ├── jogador.rs Física do jogador: gravidade, pulo e colisão AABB
│ ├── save.rs Salvar e carregar, com versão do formato e migração
│ ├── tempo.rs Relógio do mundo, cor do céu e luz do dia
│ ├── mundo/ Os dados do mundo, sem nada de placa de vídeo
│ │ ├── bloco.rs Tipos de bloco, estado, formato e textura de cada face
│ │ ├── caixa.rs Caixas de colisão e de mira (AABB)
│ │ ├── luz.rs Luz das tochas espalhada por busca em largura
│ │ ├── chunk.rs Chunks de 16x16x16 e conversão de coordenadas
│ │ ├── face.rs As 6 faces de um bloco
│ │ ├── ruido.rs Ruído Perlin e fBm, escritos do zero
│ │ ├── gerador.rs Terreno, praias, montanhas e árvores a partir da seed
│ │ ├── carregamento.rs Gera e descarta chunks em volta do jogador
│ │ └── raycast.rs Qual bloco está na mira (DDA de Amanatides & Woo)
│ └── render/ Tudo que conversa com a placa de vídeo (wgpu)
│ ├── mod.rs Renderizador: device, surface e o quadro
│ ├── atlas.rs Texturas geradas por código, num atlas só
│ ├── malha.rs Vértices, faces e buffers na GPU
│ ├── malha_chunk.rs Malha do chunk com face culling e ambient occlusion
│ ├── pipeline.rs Pipeline dos blocos e depth buffer
│ ├── cena_gpu.rs Uniform com câmera, neblina e luz
│ ├── contorno.rs Contorno do bloco na mira
│ ├── hud.rs Mira e hotbar
│ ├── astros.rs Sol e lua
│ └── *.wgsl Os shaders
├── LICENSE Licença MIT
├── logo.png Logo do projeto
└── .forgejo/workflows/
├── ci.yml Formatação, lint, testes e build a cada push
├── assinaturas.yml Confere se os commits estão assinados com GPG
└── publicar.yml Gera os pacotes e o Release a cada tag de versão
O módulo mundo não conhece a placa de vídeo, e por isso todos os testes rodam no CI, que nem tem uma.
Testes
cargo test
São mais de 60 testes de lógica pura: física, raycast, ruído, geração de terreno, coordenadas de chunks, malhas e ambient occlusion.
Como contribuir
-
Escolha uma issue aberta, ou abra uma nova descrevendo a ideia ou o problema.
-
Faça um fork e crie uma branch a partir da
main, por exemplofeat/camera-primeira-pessoa. -
Antes de enviar, rode o mesmo que o CI roda:
cargo fmt cargo clippy --all-targets -- -D warnings cargo test -
Assine os commits com GPG (
git commit -S). O workflow de assinaturas recusa commits que o Forgejo não mostra como "Verificado", então sua chave pública precisa estar cadastrada na sua conta, com o e-mail do commit confirmado. -
Abra um pull request para a
maincitando a issue comCloses #4na descrição. O Forgejo só reconhece as palavras-chave em inglês (Closes,Fixes,Resolves) e fecha a issue sozinho quando o PR entra.
As mensagens de commit seguem o formato tipo: descrição curta:
| Tipo | Quando usar |
|---|---|
feat |
Algo novo no jogo |
fix |
Correção de bug |
refactor |
Mudança no código sem mudar o comportamento |
docs |
README, comentários e documentação |
ci |
Workflows do Forgejo |
release |
Mudança de versão |
Publicando uma versão
Só para quem mantém o projeto:
-
Atualize o
versionnoCargo.tomle faça o commit. -
Escreva as notas da versão num arquivo, com um título na primeira linha. Pode usar Markdown: elas viram o texto do Release.
-
Envie a
maine só depois crie e envie a tag assinada, num push separado:git push cosmos main git tag -s v0.2.0 --cleanup=verbatim -F notas.md git push cosmos v0.2.0--cleanup=verbatimmantém a mensagem como está. Sem ele, o git trata as linhas que começam com#como comentário e apaga os títulos### Novidadesdo Markdown.- O push separado importa: quando a branch e a tag vão juntas, o Forgejo dispara só os workflows da branch e o
publicar.ymlnão roda.
O workflow publicar.yml confere se a tag bate com o Cargo.toml, compila para Linux e Windows e cria o Release com a mensagem da tag como texto. Versões com sufixo, como v0.2.0-beta, viram pré-release.
Licença
O código está sob a licença MIT.
Este é um projeto de estudo, feito por fã, sem relação com a Mojang Studios ou a Microsoft. Minecraft é marca registrada da Mojang Synergies AB. Todas as texturas são geradas pelo próprio código, e nenhum arquivo, som ou código do jogo original é usado.
Feito por AbyssDev