2018-09-29 11:30:20 -0300 2018-09-29 11:30:20 -0300
maironw Mairon S. Wolniewicz Featured

Desenvolvendo um jogo em um microcontrolador - Parte 1

Single 3675067 featured image

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.

The Legend of Zelda: Link's Awakening

Plataforma: Gameboy
1262 Jogadores
19 Check-ins

53
  • Micro picture
    emphighwind · 3 meses atrás · 2 pontos

    Massa, programação não é o meu forte, mas eu sempre acho interessante de ver estes projetos DIY, não conhecia este Tiva C ai, os únicos microcontroladores que eu mexi direito e arranho alguma coisa foram o próprio ATmega do arduino e o ESP8266.

  • Micro picture
    tiagotrigger · 3 meses atrás · 2 pontos

    Que demais, tá ficando legal. Quero ver pronto, boa sorte com o projeto. o/

  • Micro picture
    msvalle · 3 meses atrás · 2 pontos

    Parabéns pelo projeto, e sucesso no desenvolvimento!
    @alvadevs

  • Micro picture
    artigos · 3 meses atrás · 2 pontos

    Parabéns! Seu artigo virou destaque!

  • Micro picture
    gus_sander · 3 meses atrás · 2 pontos

    Que interessante mano, é um ótimo projeto! Confesso que já usei o Arduino uma vez, mas foi só pra gerar números aleatórios de 0 e 1... A partir de uma gelatina de banana xD Nem lembro direito dos detalhes de como fizemos, mas foi massa. Enfim, sucesso aí no projeto cara, tô ansioso pra ver o resultado final!! o/

  • Micro picture
    maironw · 3 meses atrás · 2 pontos

    Obrigado pelo apoio galera!
    Pra quem tem interesse, apesar de eu não ter tentado, deve ser possível trabalhar em algo semelhante mesmo com o Arduino. É um projeto barato e o nível de programação exigido é manipulação de registradores e conhecimento sobre estruturas em C, ambos muito bem documentados internet afora.

Continuar lendo → Reduzir ←
Carregando...