Faz um tempo que eu não frequento o Alvanista. Da última vez em que estive por aqui com mais participação, eu meio que estava tentando fazer um jogo para computador. O mais legal? Na época eu não fazia ideia de como programar e devido aos mais diversos motivos o projeto nunca foi pra frente. Um deles foi minha entrada na faculdade, onde acabei tomando como minha área favorita justamente a programação.
Uma das disciplinas optativas que curso é a de Microcontroladores. Pra quem não saca, um Arduino é um microcontrolador. E pra quem não conhece nem ele, dá pra dizer resumidamente que um microcontrolador é um dispositivo compacto com um processador e a opção de enviar e receber sinais, útil o suficiente para ser embarcado em muitos projetos de engenharia.

Para deixar claro, o microcontrolador que eu estou usando é um Tiva C Launchpad. Entrarei no mérito de suas configurações quando necessário.
Diferente de programar software simples para um sistema operacional qualquer, ao programar em um microcontrolador você tem a preocupação de resolver problemas utilizando registradores. Sabe quando alguém fala que computação se resume a 0 e 1? O que a gente faz aqui é praticamente dizer para o processador o que vai valer 0 e o que vai valer 1, e ter como resposta toda uma lógica de ações que ele vai realizar.
Como intermediário entre um código escrito na linguagem C dizendo para a placa o que fazer e esses comandos binários que ela interpreta, o algoritmo é lido na linguagem Assembly, mais próxima de como o computador entende as coisas do que como o ser humano faz.
Sabe o que também era programado em Assembly? Jogos de Game Boy. Seja Super Mario Land, Pokémon Red/Blue e Zelda Link's Awakening. Todos foram criados do zero com essa linguagem em mente.
O desafio proposto a mim foi, utilizando o Tiva C, uma matriz de botões 4x4 e uma tela do clássico celular Nokia 5110, montar um jogo convincente o suficiente para ser aprovado na disciplina. Nada mais justo, partindo de critérios como simplicidade, nostalgia e principalmente semelhança, eu criar minha própria versão de um jogo de Game Boy para o microcontrolador. O escolhido foi The Legend of Zelda.

Essa é a tela que eu devo utilizar. Ela possui duas grandes limitações: sua resolução é de apenas 84x48 pixels e ela é monocromática, mostrando apenas os pixels ligados ou desligados. Comparando ao GB, ele possui resolução de 160x144 pixels e consegue mostrar 4 escalas de cinza na tela.
O intuito inicial do jogo é fazer algo o mais próximo de The Legend of Zelda Link's Awakening, mas provavelmente apenas sendo possível atacar e perder vida para os inimigos, sem dungeons.
Primeiro vou falar da parte mais legal: mostrar as coisas na tela.
Como parâmetro, utilizei o spritesheet original de Link's Awakening e de ambos os Oracles.

Meu código, escrito em C, não consegue carregar uma imagem no formato bmp e simplesmente colocar ela na tela. O processo vai um pouco além disso.
Primeiro, é necessário remover as cores da imagem. Apenas as cores preto e branco serão interpretadas.
Para minha tela, o que tiver a cor preta, valerá como 0, enquanto branco valerá como 1. Essa lógica também serve para dizer quais pixels da tela estarão desligados (0) e ligados (1).
Portanto, se eu quero que um sprite apareça com seus contornos em preto na tela, devo desenhá-lo ao contrário no computador.

Essa é a imagem que eu devo reproduzir, num formato bitmap de 16 bits. Para minha tela interpretar, contudo, eu devo transformá-la em um vetor hexadecimal com as informações de pixel ligado ou desligado. A imagem do Link olhando para a esquerda é usada no meu código na forma:

Sem entrar no mérito do processo de como a função da tela trata esses números, basta dizer para ela mostrar "link_left_1" nas posições x e y desejadas, e meu personagem aparece na tela.
Em outros posts eu pretendo explicar um pouco mais da lógica por trás tanto do gameplay e dos botões quanto da própria disposição de coisas na tela, que devido ao pequeno tamanho, se torna um desafio.
No momento eu tenho como versão de testes a seguinte aplicação:
Parte 2.
Que top