<aside> 🕹️ Notas sobre o que precisei aprender para desenvolver meu primeiro jogo 2D 🤓 Como aprendi a Minilibx, como migrei do WSL local para o Workspaces, e no geral como desenvolvi meu projeto — especialmente as dicas que eu gostaria de ter escutado antes de ter alguns problemas hehehe

</aside>

palavras-chave: jogo 2D, biblioteca gráfica, eventos, renderização, janelas, valgrind

<aside> ⚠️ Sabemos que não é todo mundo que tem o privilégio de poder dedicar 100% do seu tempo integralmente para a 42. Estes guias surgiram com o objetivo de agilizar o processo de descobrir quais os conhecimentos necessários para conseguir resolver o problema proposto pelo projeto, economizando tempo valioso pra codar. Evitei ao máximo dar soluções prontas — porque desenhar, implementar, testar e construir a solução também faz parte do seu aprendizado na 42. Mesmo assim, esta página pode conter alguns spoilers de implementação, por isso, prossiga com precaução!

</aside>

Introdução

Esse foi sem dúvidas o projeto MAIS MASSA que já fiz até o momento, e também o maior / mais desafiador - apesar de que no final, como sempre, vc olha pra trás e pensa que "nem foi tão difícil assim".

O desafio do so_long é construir uma fase de um videogame fictício, que possui uma personagem principal que navega pela fase, coleta itens e por fim encerra a fase saindo por uma porta de saída. Para isso, você vai utilizar a biblioteca minilibx — criada pelo staff da 42 Paris que gravou os vídeos lá na intra kkk — para abrir uma janela e colorir os pixels dentro dela, e programar a partir de eventos, as duas bases para um jogo eletrônico gráfico rodar.

A primeira dificuldade é aprender a como de fato usar a minilibx. A documentação oficial em si não é tão completa/informativa, mas é um bom ponto de entrada. Nela você encontra quais flags são necessárias pra conseguir compilar seu programa, e alguma informação das funções mais básicas da lib.

A documentação oficial da minilibx é escassa e não vai além do básico pra abrir uma janela/desenhar com pixels. Felizmente, outras pessoas fizeram os seus guias para usar a minilibx, que foram o que me ajudaram a entender melhor como utilizá-la. Deixo aqui as referências e dicas que me foram úteis.

Por se tratar de um projeto consideravelmente maior comparado com os projetos anteriores — printf, get_next_line, libft —, é uma ótima oportunidade de usar o Git pra ir salvando seu progresso aos poucos, aprender a usar o Valgrind (pfvr use desde o início!), criar uma estrutura de pastas pra organizar os arquivos (tem vários arquivos complementares de mapas e sprites), e utilizar structs pro seu código ficar mais organizado e semântico.

Por fim, acho importante trazer a atenção para uma transição muito sutil que acontece quando você transiciona do primeiro anel do Holy Graph (libft, printf, gnl) para o segundo (so_long, pipex, push_swap): nenhum dos projetos que você entregou até agora possuía uma main! O que significa que agora, independentemente de qual projeto você escolheu para fazer, você está construindo um programa inteiro, que tem começo, meio e fim — diferente do que veio antes, que eram pedaços de códigos (funções) que você poderiam ser chamados aqui ou ali dentro de outros programas. Será sua primeira oportunidade de entender de perto como é que um programa de verdade funciona, qual é a cara que um programa tem, e como lidar com a complexidade de um programa — que tem um único ponto de entrada, mas possivelmente vários pontos de saída. Aqui você vai botar à prova de fogo as suas habilidades de gerenciamento de memória!

Eu escolhi reviver um clássico da minha infância usando os sprites de Pokemon Yellow para o Gameboy, e foi simplesmente mágico! Espero que sua experiência com esse projeto seja tão divertida quanto foi pra mim. Boa sorte 🍀

Minilibx

O que Ă© / onde encontrar

A minilibx é uma biblioteca escrita por cima de outra biblioteca — a X11, que são as funções construídas para manipular o sistema de janelas X (X Window System) — que por sua vez é um programa para sistemas Unix-like (tipo o Linux) que serve para criar interfaces gráficas em um computador e interagir com mouse e teclado. Nesse sentido, a minilibx é uma simplificação de um sistema maior com funções mais específicas / complexas; e condensa o básico que iniciantes precisam aprender para começar a construir janelas e elementos gráficos num computador do tipo Unix (vulgo nós). Esse básico se resume a eventos de periféricos (mouse e teclado), gerenciamento de janelas, e desenhar em janelas.

Para entender a relação entre a biblioteca X11 e a minilibx, a melhor analogia que eu consegui pensar (talvez ñ seja a melhor de todas) foi a de uma bicicleta com rodinhas: a bicicleta é a X11, que é um sistema complexo que precisa de bastante habilidade motora e equilíbrio pra ser operado. A minilibx é uma bicicleta com rodinhas — ou seja, executa a mesma função que uma bicicleta sem rodinhas, mas com uma camada de complexidade a menos (a criança não precisa se preocupar com se equilibrar dos lados, apenas em pedalar e usar o guidon). Dessa forma, a minilibx adiciona uma camada de abstração à X11, permitindo que nós, n00bs, foquemos em aprender a manipular somente o essencial da X11, ao invés de se perder em meio a detalhes técnicos excessivos que a biblioteca oferece.

O repositĂłrio oficial da minilibx Ă©:

https://github.com/42Paris/minilibx-linux

Se você decidir fazer seu projeto no workspaces como eu fiz, essa etapa é tranquila, só adicionar umas flags de compilação no seu Makefile, e boa. Se decidir fazer no seu sistema local Linux/Mac, o repo dá as instruções do que instalar pra conseguir rodar a minilibx.

[obsoleto] Como usar no Windows (migrando do WSL pro Workspaces)