terça-feira, 5 de janeiro de 2016

Jogos: Android, C++ & NDK

Recentemente desenvolvi um jogo para Android, utilizando a linguagem C++, em conjunto com a IDE CodeBlocks e plataforma Windows. Como sabemos, os aplicativos para Android são por natureza baseados em Java, por isso, foi preciso uma "conversão" do produto do desenvolvimento para a sua execução correta.

Ferramentas
Os elementos gerais necessários para a adequação da plataforma e ambientação para o desenvolvimento foram:

  • Android SDK
    • é o core do Android, contendo aplicação, máquinas virtuais para emulação, bibliotecas, drivers, arquivos de sistema e demais ferramentas
    • para uso deste, foi baixado o Android Studio do site: https://developer.android.com/sdk/
  • NDK - Native Development Kit
    • ferramenta utilizada para realizar a compilação dos fontes do jogo
    • a versão baixada foi a r10e do site https://developer.android.com/ndk/
  • SDL - Simple Directmedia Layer
    • possui bibliotecas específicas para desenvolvimento do jogo e tratamento de imagens
    • a versão baixada foi a v2.0 do site https://www.libsdl.org/
    • também foi necessário baixar separadamente a biblioteca “SDL_image”, que possui módulos que não vêm junto com o pacote SDL
  • Apache Ant
    • ferramenta utilizada para realizar o deploy da aplicação, ou seja, gerar o apk executável que será instalado ou emulado em um dispositivo com Android
    • a versão baixada foi a v1.9.6 do site https://ant.apache.org/

Sobre o Jogo
O nome do jogo é Kingdom Blizzard, e é um jogo do tipo estratégico, estilo “capture the flag”,
englobando diversos aspectos de jogos neste formato. O tema é baseado nos reinos da era
medieval, e o ambiente é de nevasca, por isso o nome “Kingdom Blizzard”.

O objetivo é andar com o rei (personagem principal), passando pelos obstáculos e inimigos, até chegar do outro lado e capturar a bandeira. No caso de colisão com inimigos, o personagem volta à posição inicial do jogo. Não é possível se sobrepor (passar por cima) dos obstáculos no campo (icebergs). A moeda posicionada em um espaço do campo, se capturada pelo jogador, dará a ele um tempo de fuga, em que os inimigos ficarão congelados. O movimento do personagem se dá por toques na tela, por isso é necessário que o aparelho possua touchscreen.

Nas imagens do jogo a seguir é possível ter uma noção do esquema gráfico. Por ser estática a imagem não será possível ver a animação do jogo: os objetos e o personagem possuem quadros que mudam constantemente, e o personagem principal se vira ao lado que for direcionado no movimento, além dos inimigos que ficam o tempo todo indo de um lado para o outro horizontalmente, com a intenção de colidir com o personagem. As únicas peças estáticas no jogo são o fundo e os obstáculos (icebergs).

Obs: Não se enganem, este jogo não foi desenvolvido com o intuito de bombar no Google Play, mas apenas de conhecer, uma espécie de "hello world" nestas águas do Android.

Início/Término do jogo


Emulação
Inicialmente, o jogo foi testado através de emuladores do Android SDK. Por questões
de performance e adequação de hardware, este emulador teve de ser substituído. O programa
utilizado então para esta finalidade foi o BlueStacks, um emulador que atende bem pelo propósito. O jogo foi compilado oficialmente para rodar em Android versão (até) 5.0.1, e foi testado em alguns dispositivos (tablets e smartphones, com versões 4.x e 5.x de Android), não apresentando problemas.

Ambiente
A preparação do ambiente para o desenvolvimento foi provavelmente a etapa mais difícil (e bota difícil nisto), visto que a adequação e interação entre as variadas ferramentas para o desenvolvimento nem sempre demandam uma instalação e configuração padrão, apresentando muitas vezes mal comportamento como problemas e instabilidade, além de que possivelmente seja preciso baixar arquivos, bibliotecas e releases específicas de ferramentas, de acordo com o problema. No entanto ressalto aqui que a adequação do ambiente é fundamental para a construção do projeto e funcionamento da aplicação.

Basicamente, os passos seguidos foram:
  1. Descompactação e instalação das ferramentas listadas
  2. Extração da pasta principal “android-project”
  3. Criação da pasta assets na pasta principal para armazenar texturas
  4. Alteração do arquivo “Android.mk” da pasta android-project/jni
    • Alterar nome do programa principal e adicionar demais criados
  5. Criação de link simbólico da pasta SDL dentro da android-project/jni
  6. Copiar a pasta do SDL_image para dentro da pasta SDL/include
  7. Copiar as libs jpeg-9, libpng-1.6.2, libwebp-0.3.0, tiff-4.0.3 e zlib-1.2.8 para a android-project/jni e mapeá-las no arquivo SDL2_image/Android.mk
  8. Configurar variáveis de ambiente no Windows para contemplar os diretórios:
    • Variável Path
      • {dir}\android-ndk-r10e;
      • {dir}\apache-ant-1.9.6\bin;
      • C:\Users\{user}\AppData\Local\Android\sdk;
      • C:\Users\{user}\AppData\Local\Android\sdk\tools;
      • C:\Users\{user}\AppData\Local\Android\sdk\build-tools;
      • C:\Users\{user}\AppData\Local\Android\sdk\platform-tools
    • Criar variável ANDROID_SDK_HOME:
      • C:\Users\{user}\AppData\Local\Android\sdk

Depois do ambiente configurado, criar programa principal main.cpp na pasta android-project/jni/src, com declaração das bibliotecas a serem utilizadas (inclusive a SDL_image.h). Algumas configurações corretivas, avançadas e adicionais podem ser feitas, por exemplo, nos arquivos da pasta jni:
  • Application.mk: contém informações do emulador e versão do Android
  • src/Android.mk: contém declarações das pastas da infra (SDL, programas e bibliotecas)
Feito isto, para compilação utilizamos o comando ndk-build no cmd. Após a compilação, o deploy é feito através do comando ant debug também no cmd. Com isto, o executável será gerado na pasta android-project/bin. No BlueStacks, a forma de execução foi apenas clicar no arquivo gerado, e este então é instalado no App e pode ser executado pela interface.

Mídia e Texturas
Dentre os elementos que compõem o jogo, temos as texturas, que compõem a estética do jogo. Demais elementos como audio e efeitos visuais (como o flip dos sprites, por exemplo) não foram aprofundados por questões de suporte à plataforma, que são dificilmente encontrados. No mais, os sprites, textos e imagens que constituem a estética do jogo foram em sua maioria encontrados na internet ou produzidos por programas de manipulação de imagem (PhotoFiltre, Adobe Photoshop, etc). Dentre as texturas encontradas no jogo, temos:
  • Sprite do personagem
  • Sprites dos inimigos
  • Sprite de objetos do jogo (no caso, a moeda)
  • Objeto iceberg (obstáculo)
  • Objetos bandeira e portal (posições inicial e final, respectivamente)
  • Textura do plano de fundo

Algoritmo
O programa do jogo desenvolvido envolve aspectos fundamentais recorrentes de jogos, tais como efeitos de animação (texturas e sprites), sensação de movimento, detector de colisão, jogabilidade (herói, inimigo, obstáculos), níveis de dificuldade distintos durante o jogo (no caso, conforme aproximação do objetivo) e etapas principais: início, reinício e fim de jogo (no caso de vitória).

O algoritmo em si não será postado aqui pois é um pouco extenso. Pretendo em breve explicitar o funcionamento de um jogo básico (lógica/algoritmo) de forma genérica, em um post específico.

Obs: este jogo não foi desenvolvido com pretensões comerciais, assim não será disponibilizado no Google Play

Nenhum comentário:

Postar um comentário