Last Updated:

Sokoban Devlog #00: esqueleto da aplicação

Nawarian
Nawarian jogos

Conteúdo do post

raylib é uma biblioteca de desenvolvimento de jogos escrita em C. Não traz consigo coisas como gerenciamento de assets, gravidade e outras ferramentas prontas. Apenas o básico que alguém precisa para desenvolver jogos sem muita dor de cabeça.

Desde que eu comecei a usar a raylib com o PHP, comecei a tomar gosto por desenvolver com a linguagem C. E acho que já está mais do que na hora de encarar um projeto em C do começo ao fim. Portanto vou iniciar a série Sokoban usando raylib.

A ideia de escrever um jogo do tipo Sokoban é simples: eu não sou um Game Designer e a única habilidade que eu quero desenvolver é a de programar em C. Sokoban é um jogo simples o suficiente em termos de gráficos e que vai me permitir praticar bastante minhas habilidades em C.

Sokoban é um estilo de jogo do tipo puzzle, onde você passa de fase ao empurrar caixas no lugar correto de forma a resolver o quebra cabeças. Aqui tem um vídeo que ilustra bem como um jogo do tipo Sokoban se parece:

Vamos preparar o nosso ambiente de desenvolvimento

O primeiro post, naturalmente, vai tratar do ambiente de desenvolvimento. E neste caso vou manter tudo muito simples. As ferramentas que vou utilizar para desenvolvimento:

  • VIM - editor de textos
  • clang - compilador C, padrão no MacOS
  • make - ferramenta de automação de build
  • pkg-config - nos ajuda a encontrar diretório das bibliotecas no computador
  • raylib - biblioteca de programação de jogos

Uma única linha de comando já deve instalar tudo o que a gente precisa no MacOS:

$ brew install vim make pkg-config raylib

Com tudo instalado, vamos criar um projeto vazio e rodar a nossa primeira janela para ter certeza de que tudo está funcionando.

Repositório no Github

Vou criar um novo repositório chamado Terrario/sokoban. E já vou inicializar este repositório com um README.md, licença GPL-3 e um .gitignore básico.

Com o repositório criado, posso fazer o clone na minha máquina:

$ git clone [email protected]:Terrario/sokoban.git
$ cd sokoban/

E agora já posso preparar a janela do Raylib e deixar tudo certo pra compilar e rodar o programa.

Uma janela simples usando raylib

Vou criar um arquivo src/sokoban.c que vai conter a nossa função main(). Nele vou colocar o seguinte snippet:

#include "raylib.h"

int main(void)
{
InitWindow(800, 600, "Sokobão");
SetTargetFPS(60);

while (!WindowShouldClose()) {
// Game loop
BeginDrawing();
ClearBackground(BLACK);

DrawFPS(0, 0);
EndDrawing();
}

CloseWindow();

return 0;
}

O programa acima não faz nada de mais. Em sequência nós:

  1. Criamos uma janela de 800x600 e título "Sokobão"
  2. Definimos que o nosso jogo roda em 60 frames por segundo
  3. Montamos o loop infinito (game loop)
  4. Dentro do loop infinito, desenhamos na tela
    1. Primeiro pintamos a tela toda de preto
    2. Depois desenhamos o framerate nas coordenadas x = 0, y = 0 da tela
  5. Ao sair do loop (pressionar ESC), fechamos a janela

Vamos compilar e ver se funciona!

$ mkdir build/
$ clang src/sokoban.c -o build/sokoban -lraylib
$ ./build/sokoban

Parece funcionar bonitinho 🎉

Agora vamos automatizar a build um pouco.

Automação de build com make

Vamos criar um arquivo chamado Makefile com o seguinte conteúdo:

CC=clang
CFLAGS=`pkg-config --cflags raylib` -std=c99
LIBS=`pkg-config --libs raylib`

MKDIR=mkdir -p
RMDIR=rm -rf

SRC_DIR=src
OUT_DIR=build

OBJS=$(OUT_DIR)/sokoban.o

all: $(OUT_DIR) $(OBJS)
 $(CC) $(OBJS) -o $(OUT_DIR)/sokoban $(LIBS)

run: all
 $(OUT_DIR)/sokoban

clean:
 $(RMDIR) $(OUT_DIR)

.PHONY: clean

$(OUT_DIR)/%.o: $(SRC_DIR)/%.c
 $(CC) -c $< -o [email protected] $(CFLAGS)

$(OUT_DIR):
 $(MKDIR) $(OUT_DIR)

Lembre-se: Makefile não usa espaços para indentação, mas sim tabulações.

Se o Makefile ficou estranho, me dá um alô que eu posso escrever um tutorial só sobre makefiles. O que é importante pra gente é a variável OBJS que no momento só aponta para um objeto. Conforme nós adicionarmos mais arquivos .c no projeto, vamos modificar aquela variável.

É possível fazer isso de forma mais dinâmica, mas eu não acho que esse projeto vá crescer tanto em número de arquivos. Se crescer, eu mudo o Makefile 😛.

Agora basta rodar make clean run pra recompilar o projeto todo e executar a nossa janelinha:

$ make clean run

Alguns toques finais

Vamos deixar tudo organizadinho antes de fechar o post e limpar o repositório um pouco.

Nós não queremos nunca que a pasta build suba para o repositório. Então vou adicionar estas linhas ao arquivo .gitignore:

# Build folder
build

Agora vamos adicionar jogar tudo para o Github. Afinal de contas, se não está na internet, não existe 😉.

Se quiser saber como subir arquivos no Github, dá uma olhada neste post fera do João Apostulo sobre como subir arquivos no github.

Próximos passos

O próximo passo vai ser carregar os assets para o nosso projeto e fazer um bonequinho se mexer na tela.

Eu vou usar os assets Open Source do Kenney pra isso. Aqui tem uma imagem de exemplo direto do site dele:

E por hoje é isso. Não se esquece de comentar e compartilhar o post pra dar uma força pra gente!

Pull Request deste capítulo você encontra no meu Github através deste link.

O link para o próximo post é este aqui.

Até a próxima 👋

Comments