No description
  • Rust 97.8%
  • WGSL 2.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
abyssdev 7eaae23bf4
All checks were successful
CI / Formato, lint e testes (push) Successful in 5m3s
Publicar / publicar (push) Successful in 7m47s
Assinaturas / Commits assinados (push) Successful in 14s
release: Versao 0.6.0
2026-10-03 21:46:14 -03:00
.forgejo/workflows docs: Adiciona a licenca MIT 2026-10-03 20:23:25 -03:00
src feat: Adiciona camas para dormir e renascer 2026-10-03 21:45:51 -03:00
.editorconfig Hello Minecraft world 2026-10-03 17:07:08 -03:00
.gitignore Hello Minecraft world 2026-10-03 17:07:08 -03:00
Cargo.lock release: Versao 0.6.0 2026-10-03 21:46:14 -03:00
Cargo.toml release: Versao 0.6.0 2026-10-03 21:46:14 -03:00
LICENSE docs: Adiciona a licenca MIT 2026-10-03 20:23:25 -03:00
logo.png docs: Adiciona README com logo, badges e guia de contribuicao 2026-10-03 17:34:22 -03:00
README.md feat: Adiciona camas para dormir e renascer 2026-10-03 21:45:51 -03:00

Simple Minecraft, feito em Rust

Última versão Status do CI Rust 1.85 ou superior Gráficos com wgpu Windows e Linux Licença MIT

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

  1. Escolha uma issue aberta, ou abra uma nova descrevendo a ideia ou o problema.

  2. Faça um fork e crie uma branch a partir da main, por exemplo feat/camera-primeira-pessoa.

  3. Antes de enviar, rode o mesmo que o CI roda:

    cargo fmt
    cargo clippy --all-targets -- -D warnings
    cargo test
    
  4. 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.

  5. Abra um pull request para a main citando a issue com Closes #4 na 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:

  1. Atualize o version no Cargo.toml e faça o commit.

  2. Escreva as notas da versão num arquivo, com um título na primeira linha. Pode usar Markdown: elas viram o texto do Release.

  3. Envie a main e 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=verbatim mantém a mensagem como está. Sem ele, o git trata as linhas que começam com # como comentário e apaga os títulos ### Novidades do 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.yml nã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