Space Nomad Postmortem
Hoje venho falar da minha aplicação para o scholarship da WWDC da Apple (saiba mais no meu post anterior). Depois de aproximadamente duas semanas de aprendizado e programação na linguagem Swift para o Apple Playgrounds consegui "terminar" o meu projeto. Eu digo "terminar" não porque considero um projeto inacabado ou sem valor, muito pelo contrário. Eu digo porque foi uma experiência tão legal e que trouxe um resultado tão bacana que me animou a incrementá-la, fazer um polimento extra e transformá-la em um aplicativo completo para iOS, vamos ver se isso se concretiza. Para entender melhor o conceito do jogo e dar uma olhada em como ele funciona segue o vídeo abaixo.
Mas voltando ao assunto do post, o objetivo é explicar um pouco sobre o processo de criação do Space Nomad. Foi bem difícil ter uma idéia no começo. Meio sem rumo eu acabei me deparando com um excelente tutorial introdutório ao SpriteKit (ainda por cima desenvolvido como um playground) que colocava uma imagem na tela, colocava algumas animações e partículas. Era um código extremamente simples e sucinto que dava um resultado bem legal, e com mais ou menos um dia de modificações em cima dele eu tinha uma espécie de clone de rocket league no espaço, onde os carros foram substituidos por nyan cats.
O jogo era bastante divertido, perdi algum tempo me divertindo com ele, mas a idéia não era original, boa parte do charme estava nos sprites que não eram meus e eu acabei achando que o projeto não tinha futuro. Foi aí tive a idéia de adaptar a mecânica para fazer um jogo de navegação livre no espaço!
Comecei desenhando os planetas, o que foi bem simples depois que aprendi a criar SKShapeNodes. Animei algumas shape nodes e coloquei alguma aleatoridade para dar um efeito mais vivo aos planetas. Coloquei então um personagem na tela e tentei começar a implementar uma mecânica. A primeira idéia foi simplesmente reutilizar a mecânica do meu experimento anterior, e ela até que funcionava bem, mas não havia muita interação com os planetas. Tive então a idéia de fazer o personagem orbitar os planetas, o que foi ao mesmo tempo um turning point para o jogo e um grande desafio para o desenvolvimento.
Fazer órbitas é mais difícil do que parece! Quer dizer, apenas fazer o personagem rotacionar em volta do planeta não é lá tão difícil, mas existem diversas sutilezas a serem consideradas para que o movimento seja fluído e interessante. O que mais me trouxe problemas foi conseguir uma transição aceitável entre o vôo livre e a ordem, sem que o personagem piscasse na nova posição. Como teve matemática envolvida no tweaking da mecânica, e acabou até surgindo uma mini livraria de funções de rotação e ângulo para CGPoints e CGVectors.
Com a mecânica pronta e funcionando, faltou só a parte de polir, refinar, embelezar, redesenhar, etc… Não é técnicamente puxado, mas toma muito tempo, ainda mais para mim que não tenho um feeling tão apurado de design e tenho que ficar testando várias coisas diferentes até ter um resultado que me agrada.
O que aprendi
Sumarizando: foi uma experiência extremamente agradável! Reforcei meus conhecimentos em swift (já tinha uma experiência razoável antes desse desafio) e inclusive aprendi a usar alguns conceitos bem importantes de desenvolvimento que já tinha visto em outras linguagens mas não em swift (e.g. protocols, singleton design pattern). Meio forçadamente acabei aprendendo um pouco de edição de imagens e vetores para conseguir desenhar um personagem principal para o meu jogo (confesso que acabou sendo divertido e gostei do resultado). E ainda por cima descobri um software bem legal e simples para compor umas batidas! Ligando com meu post anterior, acho que esses dois últimos aprendizados (desenho e áudio) foram frutos diretos da saída da zona de conforto!