Exemplo do que você vai construir ao terminar este tutorial
Uma coisa que quase todos os jogos precisam fazer é exibir alguma forma de texto, nem que seja um número voando que represente os pontos ou dano infligido. E fazer isto no Libgdx poderia ser uma tarefa um pouco mais fácil, principalmente se você quiser incrementar e colocar efeitos como stroke e gradient fill em seus textos.
O processo é um pouco tedioso mas é certeiro. Um jeito de se fazer isso é o seguinte:
Customizar a aparência da fonte usando a ferramenta Littera
Exporta-la em formato bmf e copia-la para o projeto
Instanciar o objeto BitmapFont no projeto e desenhar a fonte no método render()
Vamos aos passos.
1. Gerar a fonte em formato fnt usando a ferramenta Littera
Littera é uma ferramenta online que vai exportar uma fonte de formato comum (TrueType® OpenType®) para formato bitmap font. Comece acessando o site onde a ferramenta se encontra kvazars.com/littera/
Interface da ferramenta Littera com a fonte padrão carregada
A ferramenta tem um design simples e direto, quem usa Photoshop vai se sentir em casa. Escolha a fonte e tamanho que você quer usar em seu jogo na seção Font através do grande botão Select Font.
Utilize o maior tamanho que a fonte vai ser usada no jogo, isto vai fazer com que a sua fonte não seja renderizada com aparência borrada.
Para economizar no tamanho do download final do seu jogo, se possível, restrinja os caracteres, aqui chamados de glyphs, aos que você vai usar, você pode fazer isso na seção anterior à seção de fonte. Alguns conjuntos mais usados podem ser rapidamente escolhidos no dropdown da seção.
Agora você vai escolher os efeitos que deseja em seu texto. Todas as alterações são demonstradas em tempo real.
"E se eu quiser a mesma fonte aparecendo com diferentes estilos?"
Infelizmente, se você quer que essa mesma fonte apareça, por exemplo, com e sem stroke, você vai precisar repetir todo esse processo.
2. Exporta-la em formato bmf e copia-la para o projeto.
Com todas as preferências visuais ajustadas, você precisa agora exportar a fonte em um dos formatos Text, a extensão é indiferente.
Formato XML .fnt selecionado
Pronto. Clique em Export e depois em Start. Não é preciso alterar os valores padrões. Você vai baixar um arquivo zip. Ele vai conter um arquivo .fnt e um arquivo .png, copie estes arquivos para a pasta assets do módulo android de seu projeto.
Coloque os arquivos dentro do módulo android nome-projeto/assets
3. Instanciar o objeto BitmapFont no projeto e desenhar a fonte no método render()
É preciso instanciar um objeto da classe BitmapFont para poder usar a sua fonte. Em create() utilize o seguinte código para criar o objeto, substituindo (NOME_DA_SUA_FONTE) pelo nome real do arquivo que você gerou.
bitmapFont = new BitmapFont(
Gdx.files.internal("(NOME_DA_SUA_FONTE).fnt"),
Gdx.files.internal("(NOME_DA_SUA_FONTE).png"),
false);
Para ser um bom cidadão do ambiente do sistema operacional Android e não causar vazamentos de memória é importante que se desfaça da fonte no método dispose()com uma simples chamada ao método homônimo do objeto bitmapFont
bitmapFont.dispose();
Finalmente você poderá escrever usando a sua fonte! Dentro do método render(), chame
Do Zero Ao Tetris Como criar 4 jogos clássicos com Java para Android
Você entrou na faculdade de ciência da computação, sistemas de informação, engenharia de computação, aprendeu tudo que você queria e não queria sobre Java, UML, cálculo, engenharia de software... mas no fundo, no fundo, você sempre quis fazer jogos?
Ao se deparar com as ferramentas de hoje você se sente perdido? Com muitas opções? Não sabe se investe o seu tempo em C++? UE4? Unity? São tantas escolhas a serem feitas que muitas vezes acabamos não fazendo nenhuma.
É possível começar a programar jogos para Android usando ferramentas simples que vão fundamentar o seu conhecimento como desenvolvedor de games.
Eu lhes sugiro e apresento Libgdx. Uma ferramenta de alto nível, mas nem tão alto assim, onde você vai poder usar tudo que você já aprendeu sobre programação até agora, desde a tríade clássica js+php+sql, passando por Java e whatnot.
Onde está a minha main() ?
Qualquer aluno de computação quando se depara com os frameworks e engines atuais de desenvolvimento de jogos
Neste livro, particularmente voltado para quem tem conhecimentos básicos sobre programação mas se sentiu assustado com as inúmeras opções e, inclusive, barreiras da complexidade inerente do desenvolvimento de jogos, um caminho claro e com várias oportunidades de aprofundamento vai ser apresentado.
Space Invaders™
Um clássico que você irá programar
Conceitos Ensinados no Livro
O Game Loop
Estrutura do Framework Libgdx
Uso de Spritesheets
Interpretação de comandos do usuário
Colisão Básica
Como reproduzir Som/Sfx e músicas
Uma introdução à máquinas de estados
GUI
Object Pool
Detecção de fim de jogo e recomeçar nível
Dimensionamento de telas (viewports)
Simulação de cinemática básica
Implementação de regras de puzzle
Persistência para criação de highscore boards
Exportar para o Android
Primeiro passos por exemplos.
Todo conceito passado no livro é acompanhado de um exemplo real. Não queremos que você ache que estamos lhe enrolando. Uma recomendação é que você vá além do exemplo e implemente suas próprias ideias com os conceitos que você for aprendendo durante a leitura do livro, isto que será bacana.
Snake™
Mais um clássico que você irá programar
Arte incluída para você focar somente na programação.
Nosso artista, Pedro Martins, criou todos os assets dos jogos que você irá criar, assim você vai poder focar somente nas mecânicas, códigos, lógica de programação e uso do framework.
Toda arte usada nos exemplos será livre de royalties e facilmente obtida no momento em que você adquirir o livro.
O livro será assim:
Introdução
Usando Libgdx em um mundo pós Unity
Mas Java? E a performance?
Instalando Android Studio
Instalando Libgdx
Criando um projeto Libgdx
Space Invaders™ Lv. 1
O Game Loop
Estrutura do Framework
Como organizar seu Projeto
Uma imagem na tela
O que são spritesheets e como usa-las
Lendo o input do usuário
Atirando projéteis
Colisão 1
A morte de um inimigo
Pong™
Dimensionamento de viewport
Reprodução de Sfx
Colisão 2
Refletindo a bolinha
Condição de fim de jogo e Reinício
Desenhando fontes
Snake™
Detecção de gestos
Items coletáveis
Desafio #1 de Game Design
GUI de Menu Inicial
Space Invaders™ Lv. MAX
Object Pool
PowerUp de Arma
Introdução à Máquinas de Estados
Inimigos com personalidade
Seu primeiro chefão
Tetris™
Encarando um jogo complexo
Reprodução de músicas
O giro da peça
Pensando em turnos
O bônus multi-linha
Desafio #2 de Game Design
FINAL
Assinando um APK
Publicando na PlayStore
Ok. Onde está esse livro?
Se você se interessou pelo livro, quer receber gratuitamente o fonte e o primeiro capítulo de um dos jogos, ou tem qualquer dúvida sobre como iniciar os seus estudos no vasto mundo da programação de jogos para android, inscreva-se já na nossa lista de email. Prometo que só enviarei conteúdo que vai lhe interessar.
Natan, o designer, recebeu um telefonema de um possível cliente, adrenalina subindo, pode ser um novo job chegando. Discutem detalhes, ideias vem, ideias vão, rabiscos no papel. Pronto, chegaram em um conceito. Desligam o telefone sem marcar uma reunião ou qualquer outro tipo de compromisso, mas tudo bem, a conversa foi boa e nada pode dar errado nessa venda.
Com todo o ânimo que a ligação provocou, Natan abre o seu editor gráfico favorito, produz alguns designs básicos, começa a fazer sua pesquisa de referências, busca por tudo: estilo gráfico, tipografia, cores, época, imagens. Pronto, já está fazendo o que ele sabe fazer melhor. Está produzindo um material de qualidade pro seu cliente. Digo, possível cliente.
O dia se acabou e nosso designer envia para o cliente todo esse novo material que produziu, e não foi pouca coisa. Ao chegar no escritório (em muitos casos, ao chegar na sua sala/escritório, o futuro realmente chegou nessa profissão) Natan sente uma pequena decepção do cliente ainda não ter respondido com qualquer tipo de feedback. Mas ainda exaltado pelo dia de ontem, como as coisas não estão fáceis, o telefone não toca e você não está recebendo emails de pedidos de orçamento, resolve dar um próximo passo no projeto do cliente, afinal, se alguma outra coisa chegar você já vai ter adiantado bastante esse projeto e não jogado o seu tempo fora navegando no facebook.
Os dias passam, Natan já produziu um pequeno protótipo, com css e javascript e um bocado de back-end. Resolve mandar um segundo email. Pegava mal tentar entrar em contato antes, cliente importante. No sábado de manhã uma resposta.
"Ok ótimo manda bala"
A pequena decepção se torna ira. "Como é possível que depois disso tudo é somente isso que ele pode falar? E mandar bala em quê, exatamente? Nem assinamos um contrato, o escopo não está fechado, o que tinha pra atirar você já atirou. Mandar bala, veja só..."
Um cliente antigo lhe liga, você recebe com muito carinho os pedidos de alteração e deixa um pouco de lado o cliente misterioso. Argh, argh, é assim que o designer reagiu aos pedidos do antigo cliente. Aumentar o logo de novo? Trocar o ícone da cestinha de compras por um carrinho porque foi comprovado que isto aumenta as conversões em 7,33%? Daí-me paciência, Natan pensou. E aos poucos foi voltando pro misterioso e ainda não cliente, não consegue parar de pensar na sua nova linda estrutura que está usando, as novas bibliotecas, as boas referências. "Projeto Massa!"
Lembra-se de responder o cliente. Dessa vez fez tudo certo.
"Bom dia Sr Gilson, Que bom que o senhor gostou do trabalho, podemos marcar uma reunião para fecharmos o escopo e assinarmos o contrato do trabalho? Muito obrigado, O Designer"
5 dias se passaram, e sim, nada do Sr Gilson responder, é, agora Natan consegue o chamar pelo nome. Não se contentando com a demora de responder do Sr Gilson, acredita que ele precisa de mais um incentivo e envia pra ele um vídeo do novíssimo protótipo.
Dois dias se passaram, e ele o responde. Diz que está muito ocupado mas que quer muito marcar a reunião com você no início da semana seguinte. Note que era uma terça-feira.
Esta história já aconteceu com Natan, com você e com muita gente, não é verdade? Infelizmente esta é a realidade de muitos freelancers, mas não pense que não há como sair dessa, que faz parte da vida. Existe um mundo onde você pode trabalhar e ser respeitado por seus clientes, mas pra isso é preciso mudar alguns padrões de comportamento e adicionar coisas simples ao seu processo VOCÊ PRECISA DE UM CONTRATO. Um contrato antes de tudo, e uma dose de reflexão para aprender a enxergar você da maneira que o cliente enxeraga. Se você quer saber como fazer um contrato que não lhe toma todo o seu tempo nem sua energia vitual, como fugir de clientes ruins sem ser rude e como atrair bons clientes, se inscreva na minha novíssima newsletter onde irei ensinar como se vence essas verdadeiras sinucas que a vida do freelancer é.