Upload
vagner-carvalho
View
126
Download
4
Embed Size (px)
DESCRIPTION
Aprenda a desenvolver jogos para android criando um jogo parecido com o Angry Birds
Citation preview
2
Aviso sobre esta apostila
Antes de iniciar a leitura deste material, veja esses avisos importantes:
Esse material NO PODER SER DISTRIBUDO, em hiptese alguma, em
outros sites da Internet ou atravs outros processos/meios .
Esse material , em hiptese alguma, NO PODE SER COMERCIALIZADO tanto
pela Internet ou de forma impressa.
Se por acaso voc encontrar este material sendo distribudo em outro site ou
sendo comercializado (sem ser pelo site oficial da apostila), por favor, entre em
contato com o autor (ver e-mail na primeira pgina).
3
Sobre o Autor da Apostila
Luciano Alves da Silva Bacharelado em Cincia da Computao pela UNISUAM
e Ps-Graduado em Docncia do Ensino Superior pelo Instituto A Vez do Mestre
(Universidade Cndido Mendes - UCAM). Possui conhecimento e domnio das
linguagens de programao Pascal, Java, C/C++, C#, Visual Basic, Delphi, PHP e
HTML. J criou Ambientes de Desenvolvimento Integrado (conhecidos como IDE)
como o MakeWare (que trabalha com as linguagens Pascal, C++ e Java) e o
AlgoWare (interpretador de algoritmos).
autor tambm dos seguintes livros, pela editora AGBOOK
- Aprenda Passo a Passo a Programar em Android Guia Essencial para
Desenvolvedores
- Desenvolvendo Jogos com a Plataforma XNA Guia para Desenvolvedores.
- Desenvolvendo Jogos com a Ferramenta RPG Maker VX Guia do Usurio.
4
Apresentao
Este material dedicado para aqueles que desejam desenvolver jogos em 2D
voltados para a plataforma Android, atravs da ferramenta de desenvolvimento
Eclipse com o Android SDK (usando o Android Developer Tools).
Este material completo, no necessrio adquirir nenhuma Apostila de Android
disponvel no site para este aprendizado sobre jogos. O usurio que tenha
interesse em desenvolver jogos para essa plataforma, precisa possuir
conhecimentos bsicos sobre linguagens de programao (de preferncia Java
ou suas derivadas C++/C#) e algoritmos.
5
ndice analtico
Capitulo 1 Introduo ao desenvolvimento de jogos .............................. 7
Capitulo 2 Viso geral sobre o Google Android ....................................... 9
2.1) Sobre o Android ...................................................................................... 9 2.2) Estrutura Geral da plataforma Google Android ..................................... 11 2.2.1) A arquitetura do Android .................................................................... 13 2.2.2) Aplicaes .......................................................................................... 13 2.2.3) Android Runtime ................................................................................ 14 2.2.4) Linux Kernel ....................................................................................... 15 2.3) Para qual verso do Android devemos desenvolver os nossos jogos ? 15
Capitulo 3 Instalando e Configurando o Android Developer Tools ........ 18
3.1) Efetuando o download e configurando o ADT ...................................... 19
Capitulo 4 Instalando e Configurando o emulador BlueStacks .............. 24
Capitulo 5 Comeando a desenvolver jogos para Android .................... 36
5.1) - Conhecendo a estrutura geral do projeto Android para jogos ............. 41 O diretrio src (source) .............................................................................. 41 O diretrio res (resources) ......................................................................... 47 Os diretrios drawable-hdpi, drawable-mdpi , drawable-ldpi e drawable-xhpdi. .......................................................................................................... 47 O diretrio values ....................................................................................... 48 Definindo o nome de um projeto .................................................................. 49 Definindo o cone da aplicao (jogo) .......................................................... 52 Executando o jogo ....................................................................................... 54
Capitulo 6 Visualizando imagens no jogo (A classe Image) .................... 58
Capitulo 7 Movendo elementos do jogo pela tela ................................. 69
Capitulo 8 Trabalhando com animao de sprites (A classe AnimationSprites) ................................................................................. 83
Capitulo 9 Detectando colises entre objetos no jogo .......................... 91
Capitulo 10 Criando elementos durante a execuo do jogo ............... 100
6
Capitulo 11 Trabalhando com a classe Scene ...................................... 110
Capitulo 12 Criando Personagens (A Classe Character) ....................... 125
Capitulo 13 Trabalhando com HUD ..................................................... 146
13.1) Criando uma HUD simples ................................................................ 146 13.2) Criando uma HUD personalizada ..................................................... 150
Capitulo 14 Programao com Inteligncia Artificial (I.A) ................... 157
14.1) Definindo movimentos aleatrios para um elemento de jogo ............ 157 14.1.1) Melhorando o cdigo : No deixar o inimigo sair da tela................ 165 14.1.2) Melhorando o cdigo : Gerando inimigos de cores aleatrias ....... 168 14.2) Algoritmo de I.A para perseguio de personagem ......................... 171 14.3) Algoritmo de I.A para perseguio e ataque ao personagem ........... 176
Capitulo 15 Msicas e sons no jogo .................................................... 192
15.1) A classe MediaPlayer ....................................................................... 192 15.2) A classe SoundPool .......................................................................... 192 15.3) Desenvolvendo o jogo....................................................................... 193
Capitulo 16 Trabalhando com mais de uma tela no jogo ..................... 204
Capitulo 17 Desenvolvendo um jogo completo ................................... 225
17.1) Sobre o jogo Alex Kidd Shinobi World ........................................... 225 17.2) Desenvolvendo nosso jogo ............................................................... 225
Capitulo 18 Publicando seus jogos Android no Google Play ................ 267
Apndice Sites e ferramentas para a criao de sprites e sons .......... 269
Concluso a respeito do material ........................................................ 273
7
Capitulo 1 Introduo ao desenvolvimento de jogos
ntes de comearmos a desenvolver os nossos jogos para a plataforma
Android, precisamos ter em mente o que vem a ser um jogo (de um modo
geral). Um jogo nada mas do que uma aplicao (programa),
desenvolvida e destinada somente para o entretenimento. Atualmente
encontramos jogos dos mais diversos gneros para os mais diversos pblicos.
Vejamos agora alguns ttulos conhecidos de jogos que existem hoje em dia:
Angry Birds (Android)
A
8
Jetpack Joyride (Android)
Benji Bananas (Android)
Para desenvolvermos um jogo, naturalmente, precisamos ter algumas coisas em
mente : seu inicio, meio e fim (histria do jogo de modo geral, no importando seu
gnero) ; as ferramentas que vamos utilizar para desenvolver os jogos e
programadores/artistas que estaro envolvidos no projeto do jogo.
Aqui nesta apostila estaremos utilizando como ferramenta para o
desenvolvimento do nosso jogo, a ferramenta Eclipse juntamente com o Android
SDK (usando o Android Developer Tools) e para executarmos os nossos jogos
estaremos utilizando o emulador BlueStacks.
9
Capitulo 2 Viso geral sobre o Google Android
omo vamos desenvolver jogos para o Android, neste captulo irei falar a
respeito da plataforma e de sua arquitetura de forma geral, pois desta
forma teremos conhecimento e base suficiente para desenvolver jogos
para o Android, avaliando hardware e verses da plataforma.
2.1) Sobre o Android
O Android uma plataforma desenvolvida pela Google voltada para dispositivos
mveis, totalmente aberta livre (Open Source), que foi divulgada em 5 de
novembro de 2007. Inicialmente o sistema Android foi desenvolvido pelo Google
e atualmente essa plataforma mantida pela OHA (Open Handset Alliance. Visite
o link : http://www.openhandsetalliance.com), um grupo constitudo por
aproximadamente 84 empresas as quais se uniram para inovar e acelerar o
desenvolvimento de aplicaes e servios, com o objetivo e trazer aos
consumidores uma experincia mais rica em termos de recursos, menos
dispendiosa em ternos financeiros para o mercado mvel.
Um dos primeiros SmartPhones que ofereceu suporte a esse sistema operacional
foi o G1 da empresa T-Mobile. Confira na imagem seguinte:
C
10
G1 - T-Mobile
Atualmente o sistema Android se encontra hoje disponvel tanto em SmartPhones
quanto nos Tablets. Confira abaixo alguns dos dispositivos encontramos hoje no
mercado com o sistema operacional Android:
SmartPhone Samsung Galaxy S3
11
Tablet Samgung Galaxy Note
2.2) Estrutura Geral da plataforma Google Android
O Android SDK uma ferramenta de desenvolvimento que disponibiliza um
conjunto de APIs necessrias para desenvolver aplicaes para a plataforma
Android, utilizando a linguagem Java.
Vamos conhecer os recursos encontrados nessa plataforma:
- Application framework: Permite a reutilizao e substituio de componentes ;
- Dalvik virtual machine: uma Mquina Virtual Java (JVM) voltada para
dispositivos mveis ;
- Browser Integrado baseado no webkit engine ;
- Grficos Otimizados O Android constitudo por bibliotecas 2D e 3D baseada
na especificao OpenGL ES 1.0 ;
12
- SQLite: Sistema Gerenciador de Banco de Dados (SGBD) j embutido no
Android para guardar dados ;
- Suporte multimdia: A plataforma j oferece para udio, vdeo e formatos de
imagem (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) ;
- Telefonia GSM (dependente de hardware) ;
- Bluetooth, EDGE, 3G, e WiFi (dependente de hardware) ;
- Cmera, GPS, compasso, e acelermetro (dependente de hardware) ;
- Rico ambiente de desenvolvimento , incluindo um emulador de dispositivo,
ferramentas de depurao, memria, performance e um plugin para o Eclipse
(ADT) ;
13
2.2.1) A arquitetura do Android
Arquitetura geral da plataforma
2.2.2) Aplicaes
O Android nos fornece um conjunto de aplicaes fundamentais, so elas:
- um cliente de e-mail;
- programa de SMS;
- agenda;
- mapas;
- navegador;
- contatos entre outros.
14
Todos os aplicativos acima presentes no Android foram desenvolvidos na
linguagem de programao Java.
O Android nos fornece um conjunto de bibliotecas C/C++ utilizadas por vrios
componentes do sistema. Veja algumas das bibliotecas abaixo:
- System C library: Consiste em uma implementao derivada da biblioteca C
padro baseado no sistema (libc) do BSD sintonizada para dispositivos rodando
Linux.
- Media Libraries: Baseado no PacketVideos OpenCORE; so as bibliotecas que
suportam os mais diversos formatos de udio e vdeo, incluindo tambm imagens.
- Surface Manager: Responsvel pelo acesso ao subsistema de exibio bem
como as mltiplas camadas de aplicaes 2D e 3D;
- LibWebCore: Consiste em um web browser engine utilizado tanto no Android
Browser quanto para exibies web.
- SGL o engine de grficos 2D
- 3D libraries: Uma implementao baseada no OpenGL ES 1.0 APIs; As
bibliotecas utilizam acelerao 3D via hardware (quando disponvel) ou o software
de renderizao 3D altamente otimizado includo no Android.
- FreeType Biblioteca responsvel pela renderizao de fontes bitmap e vector;
- SQLite Conforme j mencionado, consiste no sistema gerenciador de banco
de dados (SGBD) relacional disponvel para todas as aplicaes.
2.2.3) Android Runtime
O Android constitudo por um conjunto de bibliotecas que fornece a maioria das
funcionalidades disponveis nas principais bibliotecas da linguagem Java.
Toda aplicao Android roda em seu prprio processo, com sua prpria instncia
da mquina virtual Dalvik. O Dalvik foi escrito de forma a executar vrias VMs
eficientemente. Ele executa arquivos .dex, que otimizado para consumo mnimo
de memria. A VM baseada em registros e roda classes compiladas pela
15
linguagem Java que foram transformadas em arquivos .dex, atravs da
ferramenta dx includa no SDK.
O Dalvik VM foi baseado no kernel do Linux para funcionalidades subjacentes
como o encadeamento e a gesto de baixo nvel de memria.
2.2.4) Linux Kernel
O Android foi projetado em cima da verso 2.6 do kernel do Linux para os
servios centrais do sistema, tais como segurana, gesto de memria, gesto de
processos, etc. O kernel tambm atua como uma camada de abstrao entre o
hardware e o resto do software.
2.3) Para qual verso do Android devemos desenvolver os
nossos jogos ?
Quando vamos desenvolver um jogo para um determinado sistema operacional,
normalmente, precisamos fazer a seguinte pergunta : Para qual verso do S.O
devemos desenvolver ?
Considero esse um dos pontos mais importantes que devemos refletir antes de
desenvolvermos um jogo. Como neste material iremos desenvolver jogos voltados
para a plataforma Android, devemos pensar para qual verso da plataforma
precisamos desenvolver.
1.3.1) Qual verso da plataforma Android a mais utilizada no momento ?
Para falar a respeito dessa situao, irei mostrar aqui um grfico que mostra quais
verses do Android so as mais usadas no mundo todo :
16
Grfico de Estatstica a respeito do S.O Android mais usado
O grfico da esttica acima foi feito em outubro de 2013, onde nele podemos
observar que as verses do Android mais utilizadas so o Jelly Bean (verso 4.1
4.3), Gingerbread (verso 2.3) e Ice Cream Sandwich (verso 4.0). As verses
mais antigas do Android como Eclair (verso 2.1) e Donut (verso 1.6) j nem so
mais citadas e faladas hoje em dia, e a verso KitKat ,a nova verso do Android
(Verso 4.4), ainda est comeando a se popularizar.
Hoje em dia se fomos a alguma loja para comprar um aparelho (Smartphone ou
Tablet Android) iremos adquiri-lo, naturalmente, com o S.O Android na verso 4.1
para cima. Se olharmos por esse ponto de vista, devemos pensar em
desenvolvermos nossa aplicao utilizando como base a verso 4.1, mas, em
nosso material iremos utilizar como base a verso do Android 4.0 .
1.3.2) O Publico
Outro fator muito importante , e que destaco aqui , a questo O PUBLICO.
Nesse fator , a questo S.O deveria ser deixada teoricamente de lado, visto que
muitos usurios ainda possuem aparelhos Android com uma verso mais antiga
(como a verso 2.3 e 2.2), logo, devemos pensar tambm nesses usurios para
usufruir dos nossos jogos desenvolvidos.
17
1.3.4) Hardware e Processamento
Outro fator muito importante, que deve ser levado tambm em considerao, alm
da verso do S.O, (quando se trata de desenvolvimento de jogos) a questo
Hardware e Processamento. Existe uma grande diferena entre desenvolver uma
aplicao (para uso de uma forma geral) e desenvolver um jogo.
Naturalmente um jogo, dependendo do seu porte, exige de certa forma de um
bom hardware (envolvendo processamento, GPU e etc.). Quando pensamos em
adquirir um aparelho (como um tablet Android por exemplo), devemos avaliar as
suas especificaes de hardware , que acompanham o produto.
Naturalmente os tablets genricos que encontramos em algumas lojas, que
acompanham uma verso popular do Android, nem sempre possui uma
especificao de hardware adequada para jogos (principalmente para jogos em
3D ou jogos que exijam recursos como acelermetro, multi-toque e etc). Fique
muito atento as especificaes do aparelho.
1.3.3) Qual prioridade devemos dar : Publico ou (Verso do S.O / Hardware)
?
Agora a questo : Como combinar a questo PUBLICO e VERSO do S.O /
Hardware para desenvolvermos um jogo ? Como se trata do desenvolvimento do
jogo, a prioridade que devemos dar em primeira instncia e verso do S.O em
conjunto com Hardware, visto que naturalmente os jogos so mais exigentes em
requisitos de hardware e sistema que a maioria das aplicaes em geral. Como
nessa apostila iremos trabalhar com jogos no estilo 2D, os requisitos exigidos
para um tablet (ou smartphone) Android so os mais essenciais possveis para
rodar games dessa categoria.
18
Capitulo 3 Instalando e Configurando o Android Developer Tools
ara a elaborao desse material eu fiz o uso do Android Developer Tools
(que na verdade a ferramenta Eclipse em conjunto com o Android SDK).
Qualquer verso (de preferncia superior) do programa citado acima
serve. Para que toda essa aplicao funcione necessrio que voc tenha
instalado, antes de tudo, a Mquina Virtual Java (de preferncia a verso 6 ou
posterior). Bom, mos a obra.
Para saber se voc possui uma Maquina virtual Java entre no prompt de comando
de digite a seguinte linha:
java version
Se mostrar algo parecido como demonstra a figura seguinte:
Maquina Virtual Java instalada no computador
Significa que voc possui uma mquina virtual Java instalada no seu computador,
caso contrrio, instale o JRE. Voc pode fazer o download do Java pelo link
abaixo:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
P
19
3.1) Efetuando o download e configurando o ADT
Conforme havia falado, a ferramenta que iremos utilizar aqui para a construo
dos nossos jogos o ADT (Android Developer Tools), que consiste no Eclipse
configurado com o Android SDK. A linguagem que utilizaremos para criar as
aplicaes ser a linguagem Java, na qual a ferramenta d suporte. Para
realizarmos do download desta ferramenta basta visitarmos o seguinte link
abaixo:
http://developer.android.com/sdk/index.html
Depois de visitar o link ser aberta a seguinte pgina, conforme demonstra a
figura seguinte:
Site do Android Download do ADT
Para efetuarmos do download do Android Developer Tools basta clicarmos no
boto Download the SDK. Feito isso ser aberta uma tela de contrato de termos
e condies, onde nela voc vai confirmar os termos de contrato e selecionar a
verso sistema operacional (32 bits ou 64 bits). Depois de escolher o sistema
20
operacional, basta clicar no boto Download the SDK ADT Bundle for Windows
para efetuar o download da ferramenta.
A instalao da ferramenta bastante simples (como no Eclipse), bastando
descompactar o arquivo em um diretrio desejado. O diretrio de instalao do
ADT para esse caso ser o diretrio raiz C:\. Ao descompactar o arquivo da
aplicao, certifique-se de que foi gerado o diretrio C:\ adt-bundle-windows-x86
(ou C:\ adt-bundle-windows-x86_64, caso o sistema escolhido seja de 64 bits) :
Contedo do diretrio adt-bundle-windows-x86
A ferramenta de desenvolvimento se encontra dentro do diretrio eclipse, basta
isso basta acessar o diretrio eclipse. Feito isso, voc ver o seguinte contedo:
21
Contedo do diretrio eclipse
Para executarmos o Android Developer Tools basta clicar no cone (de cor roxa)
escrito eclipse. Quando a ferramenta executada pela primeira vez, ser
solicitado um diretrio de Workspace (diretrio de trabalho), que o local no
qual o Eclipse vai gerar os projetos, conforme voc confere na figura seguinte:
Diretrio do Workspace
Escolha o diretrio desejado para seu Workspace e , caso voc deseje que ela
seja definitivo, marque a opo Use this as the default and do not ask again.
Depois disso clique em OK.
22
Feito isso, o ambiente de programao Eclipse ser carregado, conforme
demonstra a figura seguinte:
Ambiente de programao Eclipse (ADT)
Agora vamos fechar a guia Android IDE para encerrarmos a tela de Welcome! .
Feito isso veremos a seguinte tela abaixo:
23
Ambiente de programao Eclipse (ADT)
A ferramenta Android Developer Tools nos fornece um emulador Android, onde
atravs dele podemos rodar , executar e testar as nossas aplicaes, mas, nessa
apostila NO IREMOS FAZER USO deste emulador que acompanha o Android
Developer Tools.
A razo pela qual no iremos fazer uso do emulador que acompanha o ADT
bem simples : O emulador roda perfeitamente aplicaes comuns para uso de
forma geral, porm, quando vamos executar um jogo, seu desempenho para
executar o mesmo PSSIMO, pois a emulao fica muito lenta e com muitos (e
muitos) lags.
Para testarmos os nossos jogos iremos fazer uso de um emulador separado (e
tambm bastante conhecido por executar jogos Android) chamado BlueStacks.
24
Capitulo 4 Instalando e Configurando o emulador BlueStacks
ara executarmos os nossos jogos desenvolvidos na ferramenta Android
Developer Tools, iremos fazer uso de um chamada BlueStacks, bastante
conhecido por rodar especialmente jogos para Android.
A instalao do emulador BlueStacks requer que seu computador possua
obrigatoriamente os drives de vdeo. (caso contrrio, ele ir exigir que voc
instale atualize os drives).
Para efetuarmos o download da ferramenta BlueStacks basta visitar o seguinte
link abaixo:
http://www.bluestacks.com
Feito isso ser aberta a seguinte pgina abaixo:
P
25
Pgina oficial do emulador BlueStacks
Feito isso basta clicarmos no boto Download situado na pgina e
automaticamente seremos redirecionamos para uma outra pgina e , em seguida,
a caixa de dilogo de download surgir em seguida:
Caixa de dilogo de download
Faa o download da ferramenta e em seguida, aps o termino do download,
vamos executar a instalao da aplicao. Feito veremos a seguitnte tela abaixo:
26
Caixa de dilogo Instalao do BlueStacks
Clique no boto Continue para prosseguirmos com a instalao. Na caixa de
dilogo a seguir:
27
Caixa de dilogo Instalao do BlueStacks
Vamos deixar o caminho do jeito que estar e clique em Next para avanarmos.
Na prxima caixa de dilogo :
28
Caixa de dilogo Instalao do BlueStacks
No ser necessria fazer nenhuma alterao (fique a vontade caso voc deseje
modificar as opes acima). Clique no boto Install para iniciar a instalao.
A instalao depende do uso da Internet, logo, os todos os arquivos de instalao
da ferramenta sero baixados do site (dependendo de sua Internet, esse
processo poder demorar um pouco, tenha pacincia!), conforme voc confere
em seguida:
29
Caixa de dilogo Instalando o BlueStacks
Aps concluir a instalao, automaticamente voc ver que ele j executar o
emulador em tela cheia, conforme voc confere logo em seguida:
30
Emulador em execuo (modo tela cheia)
Para sairmos do modo tela cheia basta clicar no boto Restaurar, situado no
canto superior direito da tela. O resultado voc confere logo em seguida:
Executando o emulador Obtendo dados
31
Mesmo com o emulador em execuo, ele ainda est executando ainda um
download de dados. Aguarde ele terminar esse processo (dependendo de sua
Internet, esse processo poder demorar um pouco, tenha pacincia!).
Depois de todo o processo acima concludo, ser exibida a seguinte tela:
Emulador BlueStacks em execuo
Bom , agora vamos fechar o nosso emulador.
Configurando a resoluo de tela do emulador
O emulador BlueStacks j possui uma resoluo padro (que normalmente
1280x720). Mas, e se eu quisesse alterar a resoluo dele (Para 800x480, que
ser a resoluo que vamos trabalhar na apostila) ? O emulador BlueStacks NO
OFERECE nenhuma configurao para modificar atravs dele sua resoluo,
mas, essas informaes esto guardadas em uma chave de registro do Windows
(que vamos precisar mexer para definirmos a nossa resoluo desejada). Vamos
no menu iniciar do Windows e em seguida chame a opo Executar. Dentro da
caixa de dilogo digite regedit, conforme abaixo:
32
Caixa de dilogo Executar do Windows
Clique em OK para executarmos o editor de registros do Windows, conforme
voc pode conferir na figura seguinte:
Editor de Registro do Windows
33
Agora vamos entrar no seguinte caminho :
HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks\Guests\Android\FrameBuffer\
0.
Vejamos o resultado abaixo:
Chave de Registro do Windows
Modifique os valores de Width (largura) e Altura (Height) respectivamente para
800 e 480 (em decimal), conforme podemos conferir na figura abaixo:
34
Pronto!!! Feito isso nosso emulador ir executar na resoluo que configuramos.
Porm, para que o emulador execute conforme nossas confuraes, vamos na
barra de tarefas encontrar o cone da aplicao BlueStacks, e em seguida clique
com o boto direito sobre o cone e selecione Restart:
Feito isso nosso emulador ser recarregado e executado conforme nossas
configuraes feitas na chave de registro. Veja o resultado abaixo:
35
Emulador em execuo Na resoluo 800x480
36
Capitulo 5 Comeando a desenvolver jogos para Android
epois de tudo configurado e instalado, conforme foi mostrado nos
captulos anteriores, vamos a partir de agora comear a desenvolver
nossos jogos para a plataforma Android.
Conforme havia falado, para criarmos os nossos jogos aqui no ADT, iremos
utilizar um framework que eu mesmo desenvolvi que vai facilitar muito o processo
de desenvolvimento de jogos (chamado GameUtil2D, em breve o mesmo ganhar
um site : http://www.gameutil2d.org ). O framework j acompanha este material
(que o arquivo GameUtil2DV1_1.zip).
Para usarmos esse framework de projeto precisaremos importar esse modelo
para o ADT, para podermos desenvolver nossos jogos. Para importar o modelo
basta irmos no menu File / Import. Feito isso, dever ser aberta a seguinte tela
conforme mostra a figura seguinte:
D
37
Caixa de dilogo - Import
Se observamos a caixa de dilogo acima, existem vrias pastas onde em cada
uma delas existe um conjunto de opes. Para importarmos um projeto vamos
expandir a pasta General e em seguida iremos selecionar a opo Existing
Projetcs into Workspace, conforme exibido na figura abaixo:
38
Caixa de dilogo - Import
Clicando em Next avanamos para a prxima etapa, que consiste na seleo do
projeto que ser utilizado no ADT, conforme mostrada na figura seguinte:
39
Caixa de dilogo - Import
Na caixa de dilogo acima vamos selecionar a opo Select archive file, e em
seguida vamos clicar no boto Browse... para selecionarmos o nosso modelo de
projeto (o arquivo GameUtil2DV1_1.zip, que acompanha este material). Depois
de selecionado o arquivo, na lista Projects vai estar sendo exibido o modelo de
projeto que ser utilizado no ADT, conforme voc v na figura seguinte:
40
Caixa de dilogo - Import
Para importarmos o nosso projeto basta clicarmos no boto Finish e pronto, j
podemos utiliz-lo para construirmos os nossos jogos. Vejamos o nosso projeto
no ADT, conforme mostra a figura seguinte:
Projeto importado para o ADT
41
5.1) - Conhecendo a estrutura geral do projeto Android para jogos
Ns vamos utilizar para a construo dos nossos jogos para Android, um
framework (que eu mesmo desenvolvi) voltado para o desenvolvimento de
aplicativos desta categoria. Vamos conhecer abaixo toda a estrutura (de arquivos
e pastas) que compem este projeto.
Se visualizarmos o lado esquerdo, existe uma seo chamada Package
Explorer, onde nela existe uma pasta chamada GameUtil2DCanvas (que o
nosso projeto), constitudo por vrios subdiretrios , que por sua vez, possui seus
respectivos arquivos. Se expandirmos a pasta do projeto, veremos uma estrutura
de diretrios e pacotes conforme demonstra a figura seguinte:
Package Explorer
Irei comentar agora toda a estrutura de um projeto Android. Ele composto por
vrias pastas e arquivos, cada um com uma finalidade em especifico.
O diretrio src (source)
Vamos comear conhecendo primeiramente o diretrio src (source). Dentro
desse diretrio temos todos os arquivos de extenso .java que fazem parte de
42
uma aplicao Android. Se ns expandirmos essa pasta encontraremos uma
srie de arquivos, todos eles organizaes em seus respectivos pacotes,
conforme voc pode conferir na figura seguinte:
Package Explorer
Irei explicar agora a finalidade de cada pacote e de seus respectivos arquivos:
O pacote gameutil2d.project
Esse pacote constitudo por um arquivo principal, que ser a classe que iremos
trabalhar daqui por diante:
GameMain.java : Esse o arquivo principal do projeto, nele que entramos
com o cdigo do jogo.
43
Conforme vimos acima, o arquivo no qual iremos mexer para escrever nossos
jogos o arquivo GameMain.java. Se clicarmos duas vezes no arquivo, veremos
o seguinte contedo:
package gameutil2d.project; import gameutil2d.framework.*; import android.content.Context; import android.graphics.Canvas; import android.view.MotionEvent; import gameutil2d.classes.basic.*; import gameutil2d.classes.scene.*; import gameutil2d.classes.character.*; import gameutil2d.classes.text.*; public class GameMain { public GameMain(Context context) { /* Construtor da classe GameMain * Nesse mtodo inicializamos todas as variveis de controle, * objetos e entre outros elementos do jogo (imagens, animaes * e personagens)*/ //Insira seu cdigo aqui } public void onScreenLoading(int w, int h, OrientationMode orientation) { /* Mtodo que executado logo aps o construtor da classe * GameMain aqui carregamos todos os elementos (imagens, * animaes, personagens) que dependam das informaes de * largura (w) e altura (h) da tela do jogo, incluindo tambm * sua orientao (orientation) */ //Insira seu cdigo aqui } public void Update() { //Mtodo responsvel pela execuo da lgica do jogo (movimento, * ao, colises e etc.) */ //Insira seu cdigo aqui }
44
public void Draw(Canvas canvas) { //Mtodo responsvel por desenhar todos os elementos do jogo na * tela (atravs do objeto "canvas") //Insira seu cdigo aqui } public void onTouch(MotionEvent e) { //Mtodo executado quando ocorre algum evento de toque sobre a * superficie da tela */ //Insira seu cdigo aqui } public void onExitGame() { / * Mtodo que executado quando o jogo encerrado * Adequado para a finalizao de threads e msicas de fundo do * jogo*/ //Insira seu cdigo aqui } }
O cdigo acima a estrutura padro da classe GameMain (arquivo
GameMain.java) no qual iremos escrever o cdigo para o desenvolvimento do
nosso jogo. Essa classe constituda pelos seguintes mtodos:
GameMain: Esse o mtodo construtor, executado toda vez que o jogo
executado. So neles que carregamos todos os objetos e iniciamos as variveis
que sero utilizados no jogo. Veja sua sintaxe:
public GameMain(Context context)
onScreenLoadling: Esse sempre logo aps a execuo do mtodo GameMain ,
nele carregamos objetos e entre outros elementos que dependam das
informaes bsicas da tela do dispositivo (como largura, altura e orientao do
mesmo). Veja sua sintaxe:
public void onScreenLoading(int w, int h, OrientationMode orientation)
45
Irei explicar agora a finalidade de cada parmetro acima:
w : Retorna a largura atual da tela, em pixels.
h : Retorna a altura atual da tela, em pixels.
orientation : Retorna a orientao da tela do dispositivo.
Update: Esse mtodo executado sempre durante a execuo do jogo, e
tambm o primeiro a ser executado. Ele responsvel por executar a lgica
de processamento do jogo (movimento,aes e etc.). Vejamos a sua sintaxe:
public void Update()
Draw: Esse mtodo executado sempre durante a execuo do jogo, e
executado alternadamente com o mtodo Update. Ele responsvel por
desenhar a tela do jogo, ou seja, deseja todos os elementos na tela do dispositivo.
Vejas a sua sintaxe:
protected void Draw(Canvas canvas)
Esse mtodo possui um parmetro chamado canvas, que representa a tela do
dispositivo, no qual vamos utilizar para desenhar os elementos do jogo.
onTouch: Esse mtodo disparado toda vez quando ocorre um touch screen,
ou seja, quando tocamos a tela do dispositivo. Esse mtodo dispara ou quando
pressionamos (tocamos) na tela com o dedo, ou quando arrastamos o dedo
pela tela ou quando tiramos o dedo do dispositivo. Vejamos a sua sintaxe:
public boolean onTouch (MotionEvent e)
O parmetro e guarda todas informaes do evento, como as coordenadas onde
ocorreu o toque na tela do dispositivo, e tambm o tipo do toque que ocorreu
(pressionamento, movimento (drag) ou liberao).
46
onExitGame:Esse mtodo disparado quando o jogo (aplicativo) encerrado.
Ele bastante til para finalizarmos alguma atividade antes do jogo acabar como
o encerramento de uma msica ou para liberar objetos da memria e etc.
O pacote gameutil2d.classes.basic
Nesse pacote esto contidos as classes bsicas que iremos utilizar para a
construo dos nossos jogos. Vejamos abaixo quais so essas classes e a
finalidade de cada uma (que ser demonstrada nos captulos posteriores) :
Image.java : Esse arquivo (ou classe) utilizado quando queremos exibir
uma imagem na tela em um jogo.
AnimationSprites.java: Esse arquivo (ou classe) utilizado para realizar
animaes de sprites em um jogo.
Collision.java : Esse arquivo (ou classe) utilizado para detectar colises
entre dois elementos em um jogo.
FlipEffect.java : Classe utilizada para inverter uma imagem (ou um
conjunto de imagens de uma animao de sprites) na horizontal.
GameElement.java: Essa a base utilizada para a construo da maioria
das classes citadas acima (e de algumas outras classes que sero citadas
em seguida), e de bastante utilidade para a construo de outros elementos
do jogo por parte do usurio.
Box.java : Classe utilizada somente para definir pontos de coliso,
bastante til para a construo de jogos baseados em plataforma (muito
utilizada em conjunto com as classe Character e Scene).
GameState.java: Essa classe possui somente uma finalidade : guardar o
status do jogo, ou seja, se ele est no modo pausa ou no modo play.
47
O pacote gameutil2d.classes.character
Nesse pacote existe somente uma classe, destinada para a criao de
personagens (para jogos no estilo plataforma).
Character.java : Esse arquivo (ou classe) utilizado para a construo de
personagens, que iremos utilizar em um jogo.
O pacote gameutil2d.classes.scene
Nesse pacote existe somente uma classe, destinada para a criao de cenrios
do jogo.
Scene.java : Esse arquivo (ou classe) utilizado para representar uma
cena do jogo, e quais elementos estaro presentes nele.
O pacote gameutil2d.classes.text
Nesse pacote existe somente uma classe, destinada para a exibio de
informaes na tela do jogo.
TextDrawable.java : Esse arquivo (ou classe) utilizado para exibir
informaes na tela do jogo (mensagens, textos etc.).
O diretrio res (resources)
Dentro da estrutura do projeto Android existe um diretrio chamado res
(resources), onde dentro dele colocamos todos os recursos que podemos utilizar
em um jogo no Android (como imagens, sons, msicas e etc). Vamos conhecer os
subdiretrios existentes dentro dessa pasta e a finalidade de cada um deles.
48
Os diretrios drawable-hdpi, drawable-mdpi , drawable-ldpi e drawable-xhpdi.
A partir da verso 1.6 da plataforma Android foram adicionados dentro da pasta
res (resources) trs diretrios responsveis pelo gerenciamento de imagens:
drawable-ldpi, drawable-mdpi, drawable-hdpi. Nas verses do Android 2.2 em
diante , podemos encontrar dentro da pasta do projeto (alm dos diretrios
citados), tambm o diretrio drawable-xhdpi . Todos esses diretrios possuem a
mesma finalidade : armazenar imagens que sero utilizadas por uma aplicao
em Android. Agora , qual a diferena que existe entre esses diretrios ? Cada um
desses diretrios ser utilizado de acordo com a resoluo do dispositivo Android
em uso.
Um dispositivo Android possui naturalmente as seguintes resolues : HVGA,
QVGA, WVGA e etc. Por exemplo, uma resoluo QVGA (320x240) possui uma
densidade baixa (low density ldpi), logo, se voc criar uma aplicao para
dispositivos desse tipo de configurao, o diretrio que voc utilizar para guardar
suas imagens ser o drawable-ldpi.
Uma resoluo HVGA (320x480) possui densidade mdia (medium density
mdpi), logo, se voc criar uma aplicao para dispositivos desse tipo de
configurao, o diretrio que voc utilizar para guardar suas imagens ser o
drawable-mdpi.
Uma resoluo WVGA (800x480 , resoluo de um Tablet por exemplo) possui
densidade alta (high density hdpi), porm, h algumas resolues WVGA que
suportam densidade mdia (mdium density mdpi).
Para os jogos que iremos desenvolver daqui por diante, vamos trabalhar com a
resoluo WVGA (conforme havamos configurado no nosso emulador
Bluestacks), que por padro possui densidade mdia (mdpi) , logo, todas as
imagens que vamos utilizar no jogo sero adicionadas dentro do diretrio
drawable-mdpi.
O diretrio values
Um dos recursos que o Android permite que usemos na construo de
aplicaes so constantes. Como bom programador que todos ns somos,
49
sabemos que uma constante nada mais do que um endereo de memria que
vai armazenar um determinador valor, que ser nico at o fim da execuo do
programa. Mas, o que isso tem a ver com as telas da nossa aplicao ? Vou
explicar.
Normalmente usamos constantes para armazenar valores fixos que,
naturalmente, estaro presentes na maior parte do seu programa. muito comum
criarmos um ttulo como nome de uma aplicao (como por exemplo : Alpha
Software), que vai estar presente na maioria das telas (ou em todas) da sua
aplicao. Imagine voc digitar manualmente o nome de seu software em todas
as telas da sua aplicao, seria um processo trabalhoso voc no acha ? Agora
imagine futuramente que voc precise mudar o nome de sua aplicao ? Voc
ter novamente o mesmo trabalho para digitar em cada tela o nome da nova
aplicao, sem dvida. Usando constantes, voc no ter esse trabalho.
Dentro dessa pasta temos os seguintes arquivos:
- strings.xml : Esse arquivo guarda constantes relacionadas nossa aplicao
em geral (como o nome da aplicao, o ttulo que vai aparecer na aplicao e
etc.).
- dimen.xml : Esse arquivo guarda constantes relacionadas as dimenses que
podemos utilizar em nossa aplicao.
- styles.xml : Esse arquivo guarda constantes relacionadas estilos que
podemos utilizar em nossa aplicao.
Definindo o nome de um projeto
Como voc percebeu, o nome do nosso projeto no Eclipse (ADT) se chama
GameUtil2DCanvas, mas, se eu quiser um outro nome para esse projeto (como
por exemplo Meu Primeiro Jogo), visto que todos os nossos projetos que iremos
criar ser a partir deste modelo ? Para darmos um novo nome para o projeto,
basta selecion-lo e em seguida pressionar a tecla F2, para renomear o projeto
com um novo nome, conforme voc pode conferir na figura abaixo:
50
Caixa de dilogo Rename Java Project
Agora vamos renomear o nosso projeto com o seguinte nome : Meu Primeiro
Jogo. Confira como ficou na figura seguinte:
Caixa de dilogo Rename Java Project
Depois de escrever o novo nome do projeto basta clicar em OK para que o
projeto seja renomeado. Confira o resultado na figura seguinte:
51
Projeto renomeado
Se lembra do arquivo strings.xml, que responsvel por guardar constantes de
uma aplicao ? Pois bem, uma das constantes desse arquivo armazena o nome
do projeto e uma outra constante armazena o nome da aplicao (jogo). Vamos
abrir o contedo desse arquivo, e o resultado voc confere na figura seguinte:
Contedo do arquivo strings.xml
Se ns observarmos acima, temos as seguintes constantes:
app_name : Apesar do nome (app_name, de Application Name), essa
constante guarda no nome do projeto.
Para visualizarmos o contedo de uma das constantes acima, basta selecionar a
constante desejada. Veja na figura seguinte:
52
Constante app_name selecionada
Quando selecionamos uma constante, so exibidos dois campos:
Name : Guarda o nome da constante (podendo o mesmo ser alterado)
Value : Armazena o valor que a constante est assumindo (podendo o mesmo
ser alterado)
Para essa situao, estaremos alterando o contedo que a constante est
armazenando. A constante app_name armazena o valor GameUtil2D V1.1.
Vamos substituir o valor armazenado por essa constante pelo seguinte nome :
Meu Primeiro Jogo.
Feito isso, vamos salvar as alteraes feitas nesse arquivo (pressionando as
teclas CTRL+S).
Definindo o cone da aplicao (jogo)
Para definirmos o cone da aplicao , devemos escolher uma imagem que v
represent-la (normalmente se usa uma imagem de extenso PNG de dimenso
48x48 pixels).
Por padro, esse modelo j possui um cone padro que vai representar a
aplicao, mas, voc pode alterar esse cone. Para definirmos a imagem que vai
ser o cone da aplicao, devemos fazer algumas configuraes no arquivo
53
AndroidManifest.xml (esse arquivo considerado o sistema nervoso do
Android, nele que definimos as principais caractersticas e permisses da nossa
aplicao). Vamos dar um duplo clique no arquivo, e o mesmo ser aberto
conforme mostra a figura seguinte:
Contedo do arquivo AndroidManifest.xml
Se voc observar a figura acima, existe uma guia chamada Application, vamos
clicar nela para carregar essa seo, conforme demonstra a figura seguinte:
54
Contedo do arquivo AndroidManifest.xml Seo Application
Se ns observamos acima existe um campo chamado Icon, nele que
definimos o cone da nossa aplicao (jogo). Lembre-se, como o cone vai ser
uma imagem que vamos utilizar, todas as imagens que estaremos utilizando na
nossa aplicao devem estar dentro do diretrio drawable-mdpi. Aps definir o
cone da aplicao, salve o arquivo AndroidManifest.xml para que as alteraes
tenham efeito.
Para esse exemplo (e os posteriores), vamos utilizar o cone padro do projeto.
Executando o jogo
Para executarmos o nosso jogo feito no Android, basta clicarmos com boto
direito sobre o projeto (Meu Primeiro Jogo) e em seguida selecionar a opo Run
As, feito isso selecione Android Application, conforme demonstra a figura
seguinte:
55
Executando a aplicao
Feito isso o projeto ser compilado e em instantes ser aberto uma caixa de
dilogo, pedindo que voc escolha o dispositivo a ser utilizado, conforme voc
confere em seguida:
56
Caixa de dilogo Android Device Chooser
Essa caixa de dilogo aparece porque o Android Developer Tools reconhece o
emulador BlueStacks como se fosse um dispositivo externo, logo, vamos
selecionar o nosso emulador do BlueStacks (identificado como emulator-5554) e
em seguida vamos clicar em OK.
Feito isso , nossa aplicao ser instalada no dispositivo e na barra de tarefas do
Windows surgir o seguinte balo, avisando que a aplicao foi instalada no
emulador com sucesso.
Aplicao instalada com sucesso
57
Caso seu emulador BlueStacks esteja fechado, clique no balo que surge para
que possamos executar a nossa aplicao. Vejamos a nossa aplicao em
execuo na figura seguinte:
Aplicao em execuo no emulador
A tela escura indica que no h nada na tela, que nenhum elemento est
presente no jogo, por isso este resultado ocorre.
Neste captulo conhecemos nosso framework de desenvolvimento, que iremos
utilizar para a construo dos nossos jogos (o GameUtil2D). Nos prximos
captulos vamos conhecer todas as classes que compem esta framework e como
criar vrios exemplos de jogos (e tambm jogos) atravs dela.
58
Capitulo 6 Visualizando imagens no jogo (A classe Image)
o captulo anterior conhecemos e aprendemos a manusear e a executar
uma aplicao (jogo) atravs do framework para jogos no Android. Neste
captulo iremos aprender a inserir e visualizar imagens em um jogo no
Android, atravs da classe Image , que faz parte do pacote que acompanha o
framework.
Conforme havia falado, todos os nossos projetos que iremos desenvolver,
utilizando nosso framework (o arquivo GameUtil2DV1_1.zip). Para isso vamos
importar esse arquivo, conforme j foi mostrado no captulo anterior.
Agora vamos alterar algumas propriedades do projeto, conforme podemos
conferir abaixo:
Nome do projeto : VisualizandoImagensJogo
Constante app_name : Visualizando Imagens Jogo
Depois de alterada as informaes acima, vamos abrir o arquivo GameMain.java
(que o arquivo no qual vamos escrever o cdigo do nosso jogo), que est
situado no pacote gameutil2d.project (dentro da pasta src).
Para visualizarmos uma imagem no jogo, precisamos fazer uso da classe Image ,
responsvel por essa finalidade. Para isso, dentro da classe GameMain vamos
declarar um atributo do tipo Image.
Na classe GameMain, na seo de declarao de atributos, vamos declarar um
atributo chamado imagem , conforme podemos conferir em seguida:
Image imagem;
N
59
Agora dentro do construtor da classe (o mtodo GameMain), vamos carregar o
nosso atributo (objeto), com os seguintes parmetros conforme voc confere no
cdigo abaixo:
public GameMain(Context context) { //Insira o cdigo aqui imagem = new Image(context, R.drawable. logo_gameutil2d, 0, 0, 48, 48); }
Vamos analisar os parmetros do comando inserido acima. O construtor da
classe Image possui os seguintes parmetros :
imagem = new Image(context, R.drawable.logo_gameutil2d, 0, 0, 48, 48);
O primeiro parmetro do construtor padro, cujo argumento sempre ser o
context. O segundo parmetro corresponde a imagem que vamos visualizar no
jogo (que a imagem logo_game_util2d.png).
Antes de continuarmos com a explicao dos parmetros, vamos entender essa
notao que foi utilizada para expressar a imagem que ser carregada. Observe
que o argumento utilizado para especificar a imagem a ser carregada foi
R.drawable.logo_gameutil2d.
Conforme j foi explicado, todas as imagens que vamos utilizar em uma aplicao
Android ficam do diretrio drawable-mdpi (que fica dentro da pasta res). Na
teoria, como a imagem (com diretrio e tudo), expresso dessa forma :
res/drawable-mpdi/logo_gameutil2d.png
No Android, devemos utilizar a notao:
R.drawable.logo_gameutil2d
A letra R da expresso acima, representa o diretrio res, e a palavra
drawable representa o diretrio drawable-mdpi. Se observarmos acima, o
nome da imagem no leva a extenso, pois o Android j identifica
automaticamente a imagem e sua extenso.
60
Vejamos alguns exemplos da anlise feita na tabela seguinte:
Caminho completo da imagem Como expressar no Android
res/drawable-mdpi/aviao.png R.drawable.aviao
res/drawable-mdpi/cenario.jpg R.drawable.cenario
res/drawable-mdpi/personagem.png R.drawable.personagem
Agora vamos continuar com o comentrio dos parmetros.
O terceiro e quarto parmetro do construtor correspondem , respectivamente, as
coordenadas X e Y do objeto na tela do jogo (cujos valores so 0 e 0). J o
quinto e o sexto parmetro correspondem, respectivamente, a largura e a altura
do objeto (cujo valores so 48 e 48).
Bom, o que fizemos at agora foi carregar o objeto (imagem) na memria. Agora
precisamos desenhar a imagem carregada na tela. Para isso devemos utilizar o
mtodo Draw, responsvel por esse finalidade. Dentro do mtodo Draw vamos
escrever o cdigo abaixo:
protected void Draw(Canvas canvas) { imagem.Draw(canvas); }
Se observarmos o mtodo acima, inserimos a seguinte linha de comando :
imagem.Draw(canvas);
Que responsvel por desenhar a imagem na tela, atravs do mtodo Draw.
Nesse mtodo passamos como parmetro o canvas, que representa a tela
onde a imagem ser desenhada.
Vamos conferir na figura abaixo como ficar o resultado na tela do emulador.
61
Imagem em exibio na tela
E ai, aprendeu como visualiza uma imagem na tela do jogo ? com certeza que
sim!
Vamos aproveitar esse mesmo projeto para demonstrar mais um exemplo de
visualizao de imagens. Para isso, vamos utilizar como exemplo as seguintes
imagens para nossa demonstrao : bird.png, titulo_flappy_bird.png e
background_fase_flappy_bird.png (as imagens j acompanham este material).
Conforme j havia falado, todas as imagens que vamos utilizar em um jogo fica
situado dentro do diretrio drawable-mdpi, logo, a imagem que vamos usar para
ser visualizada deve estar dentro desse diretrio. Irei mostrar aqui duas formas de
se colocar uma imagem dentro desse diretrio, sendo que comearei pela forma
mais tradicional, e depois pela forma mais fcil.
Forma tradicional
Para importar um arquivo, clique com o boto direito do mouse sobre a pasta
res/drawable-mdpi e selecione Import, depois selecione File System (Que se
62
encontra dentro da pasta General, conforme mostra a figura abaixo) e em
seguida clique em Next.
Selecionando a opo File System
Aps clicar em Next ser exibida a caixa de dilogo como demonstra a figura
abaixo:
63
Caixa de dilogo Import
Clique no boto Browse... para selecionar o diretrio onde se encontram as
imagens. Feito isso, marque os arquivos (imagens) para que ele seja importado
para a pasta res/drawable-mdpi . Veja a figura abaixo:
64
Imagem selecionada
Depois disso, s clicar em Finish para importar as imagens para o projeto.
Forma mais fcil
A segunda forma, que diria que a mais fcil de todas, voc ir at o diretrio onde se encontra as imagens , para que voc em seguida possa selecion-la, e logo aps copi-la (o famoso Ctrl+C). Feito isso v at o projeto que criamos para selecionarmos o diretrio drawable-mpdi para colarmos as imagens dentro da pasta, simplesmente dando CTRL+V (simples no ?).
Com as imagens j inserida no projeto, vamos alterar as seguintes linhas de
comandos nos mtodos que citarei abaixo. Primeiramente vamos apagar todo o
cdigo que inserimos dentro da classe GameMain.
65
Em seguida, dentro da seo de declarao de atributos, vamos declarar os seguintes objetos abaixo:
: Image bird; Image titulo_flappy_bird;
Image background_fase_flappy_bird;
Context context;
Agora dentro do mtodo construtor GameMain inserir a seguinte linha de cdigo
abaixo, conforme mostrado no cdigo abaixo:
public GameMain(Context context) {
this.context = context; }
O comando que inserirmos acima ser responsvel por guardar dentro do atributo
da classe context o contedo armazenado dentro do parmetro context do
construtor da classe GameMain. Esse armazenamento ser necessrio, pois ,
ns iremos carregar todas as imagens dentro do mtodo onScreenloading e
precisamos do context para carregarmos todas as imagens fora do mtodo
GameMain (no somente imagem mas tambm todos os objetos que precisem do
argumento context fora do construtor).
Agora dentro do mtodo onScreenLoading vamos digitar os seguintes
comandos abaixo:
public void onScreenLoading(int w, int h, OrientationMode orientation) { background_fase_flappy_bird = new Image(context, R.drawable.background_fase_flappy_bird,0,0,w,h); titulo_flappy_bird = new Image(context, R.drawable.titulo_flappy_bird, 260, 100, 280, 92); bird = new Image(context, R.drawable.bird, 370, 200, 60, 47); }
Agora dentro do mtodo Draw vamos digitar o seguinte cdigo, conforme
mostrado em seguida:
66
public void Draw(Canvas canvas) { background_fase_flappy_bird.Draw(canvas); titulo_flappy_bird.Draw(canvas); bird.Draw(canvas); }
Dentro do mtodo Draw existem trs instrues onde cada uma ir exibir uma
imagem na tela. As instrues que inserimos no cdigo, possuem uma sequncia,
que precisarei explicar.
Observe que a primeira instruo adicionada no mtodo Draw foi:
background_fase_flappy_bird.Draw(canvas);
Que ir exibir uma imagem de fundo, que a fase do famoso jogo Flappy Bird.
Em seguida, temos a seguinte instruo:
titulo_flappy_bird.Draw(canvas);
Que ir exibir o ttulo Flappy Bird na tela. Como essa a segunda imagem a ser
exibida, a mesma exibida a frente da imagem de fundo.
Na terceira instruo temos a seguinte linha de cdigo:
bird.Draw(canvas);
Que ir desenhar o passarinho (personagem) do jogo na tela. Como essa a
terceira imagem a ser exibida na tela, a mesma mostrada a frente da imagem
de fundo e do ttulo.
Aps escrevermos os cdigos acima, vamos executar a nossa demonstrao. O
resultado voc confere na figura a seguir:
67
Imagens em exibio na tela
Invertendo uma imagem na tela
A classe Image possui um mtodo chamado Draw que serve para exibirmos uma
imagem na tela. Pois bem, o mesmo mtodo possui um segundo parmetro que
permite-nos inverter a imagem exibida na horizontal, que o
FlipEffect.HORIZONTAL.
Para realizarmos essa demonstrao de inverso de imagem, vamos alterar
dentro do mtodo Draw a seguite instruo destacada em azul abaixo:
public void Draw(Canvas canvas) { background_fase_flappy_bird.Draw(canvas); titulo_flappy_bird.Draw(canvas); bird.Draw(canvas, FlipEffect.HORIZONTAL); }
68
Observe que no objeto bird (que mostra o passarinho na tela), adicionamos o
segundo argumento no mtodo Draw, o FlipEffect.HORIZONTAL. Que ir inverter
a imagem na horizontal.
Depois de alterar o cdigo , salve-o e em segudia execute a aplicao. Veja o
resultado em seguida:
Imagens em exibio na tela (com a imagem do pssaro invetida)
E ai, est aprendendo aos poucos como se cria um jogo para Android ? com
certeza que sim.
Este s um pontap inicial, nos prximos captulos iremos aprender vrias
tcnicas de desenvolvimento de jogos que sero de grande valia para seus
futuros jogos desenvolvidos para a plataforma.
69
Capitulo 7 Movendo elementos do jogo pela tela
o captulo anterior aprendemos como visualizar elementos (como
imagens) na tela, porm, as imagens vistas ficam num ponto fixo da
dela, definido pelo cdigo. Agora vamos aprender a movimentar esses
elementos pela tela do jogo, usando os recursos oferecidos pelo Android.
Neste tpico vamos aprender a movimentar os elementos do jogo usando o
touch screen (visto que atualmente, no se usa mais o movimento dos
elementos do jogo via teclado fsico).
Antes de comearmos, vamos importar o nosso framework para o ADT, pois ser
a partir dele que vamos construir nossos jogos, como fizemos anteriormente.
Depois de importar o framework, vamos alterar algumas propriedades do projeto,
conforme podemos conferir abaixo:
Nome do projeto : MovendoObjetoPelaTela
Constante app_name : Movendo Objetos Pela Tela
Depois de criado o projeto, vamos adicionar as seguintes imagens (que se
encontram presentes neste material) , que se chamam aviao.png , nuvem.png
e ceu_azul.png.
Depois de adicionar as imagens no projeto (dentro do diretrio drawable-mdpi),
vamos abrir o arquivo GameMain.java para escrevermos o cdigo do nosso
jogo.
N
70
Para comear, vamos declarar os seguintes atributos na seo de declarao de
atributos da classe GameMain :
Image aviao, nuvem, ceu_azul;
Context context;
Agora dentro do mtodo construtor GameMain, vamos adicionar os seguintes
comandos, conforme voc confere em seguida:
public GameMain(Context context) { this.context = context; aviao = new Image(context, R.drawable.aviao, 0, 0, 90, 70); nuvem = new Image(context, R.drawable.nuvem, 250, 100, 90, 70); }
Nas linhas de comando que adicionamos acima (no mtodo GameMain),
carregamos as imagens do avio e da nuvem.
Agora vamos no mtodo onScreenLoading, para adicionarmos o seguinte
cdigo:
protected void onScreenLoading(int w, int h, Orientation orientation) { ceu_azul = new Image(context, R.drawable.ceu_azul, 0, 0, w, h); }
Na linha que adicionarmos no mtodo acima, carregamos a imagem do cu azul.
Agora a pergunta que eu fao : Por qu que carregamos a imagem do cu azul
nesse mtodo ? A resposta simples, simplesmente porque precisamos que a
imagem do cu azul se ajuste ao tamanho da tela, logo, a largura e a altura da
tela dever ser as mesmas do tamanho da tela.
Neste mtodo temos os seguintes argumentos, w que armazena a largura da tela
e h que armazena a altura da tela. Esses valores foram passados como
argumentos no construtor da imagem do cu azul, como podemos conferir em
seguida:
ceu_azul = new Image(context, R.drawable.ceu_azul, 0, 0, w, h);
71
Agora vamos no mtodo Draw para adicionarmos as seguintes linhas de
comando:
protected void onDraw(Canvas canvas) { ceu_azul.Draw(canvas); nuvem.Draw(canvas); aviao.Draw(canvas); }
Nas linhas de comando que adicionarmos acima, todas elas, desenham as
imagens na tela do jogo. Agora, as linhas de comando acima foram adicionadas
na seguinte sequencia:
A primeira linha de comando que adicionarmos, desenha a imagem do cu azul
na tela, at ai tudo bem. Na linha seguinte desenhamos a nuvem na tela, essa
nuvem ser desenhada na frente da imagem do cu azul. Por ltimo,
desenhamos a imagem do avio, e esse avio ser desenhado na frente da
imagem da nuvem e do cu azul (conforme j foi explicado no captulo anterior,
mas sendo reforado neste captulo).
Depois de escrever o cdigo , vamos executar nossa aplicao e conferir os
resultados:
72
Jogo em execuo
Por enquanto, s conseguimos visualizarmos o nosso avio, mas, no podemos
moviment-lo pela tela ainda.
Como havia falado, iremos movimentar os objetos via touch screen (neste caso
aqui, o avio).
Vamos voltar na seo de declarao de atributos, e l vamos declarar as
seguintes instrues, como segue:
enum Sentido { PRA_FRENTE, PRA_TRAS, PRA_CIMA, PRA_BAIXO, PARADO } Sentido sentidoAviao = Sentido.PARADO;
Image seta_direita, seta_esquerda, seta_cima , seta_baixo;
Agora dentro do mtodo onScreenLoading vamos digitar as seguintes instrues
destacadas em azul abaixo:
public void onScreenLoading(int w, int h, OrientationMode orientation) {
73
ceu_azul = new Image(context, R.drawable.ceu_azul, 0, 0, w, h); seta_esquerda = new Image(context, R.drawable.seta_esquerda, 0, h - 64, 64, 64); seta_cima = new Image(context, R.drawable.seta_cima, 64, h - 64, 64, 64); seta_baixo = new Image(context,R.drawable.seta_baixo, w - (64 * 2), h 64, 64 , 64); seta_direita = new Image(context,R.drawable.seta_baixo, w - 64, h - 64, 64 , 64); }
Agora dentro do mtodo Draw vamos adicionar as seguintes linhas de cdigos
destacada em azul abaixo:
public void Draw(Canvas canvas) { ceu_azul.Draw(canvas); nuvem.Draw(canvas); aviao.Draw(canvas); seta_esquerda.Draw(canvas); seta_cima.Draw(canvas); seta_baixo.Draw(canvas); seta_direita.Draw(canvas); }
Para realizarmos o movimento do avio vamos trabalhar com os seguintes
mtodos : onTouch e Update.
Dentro do mtodo onTouch vamos adicionar as seguintes linhas de cdigo
abaixo:
public void onTouch(MotionEvent e) { if(e.getAction() == MotionEvent.ACTION_DOWN) { if(seta_esquerda.IsTouch(e.getX(), e.getY())) sentidoAviao = Sentido.PRA_TRAS; else if(seta_cima.IsTouch(e.getX(), e.getY())) sentidoAviao = Sentido.PRA_CIMA; else if(seta_baixo.IsTouch(e.getX(), e.getY())) sentidoAviao = Sentido.PRA_BAIXO; else if(seta_direita.IsTouch(e.getX(), e.getY())) sentidoAviao = Sentido.PRA_FRENTE; }
74
else if(e.getAction() == MotionEvent.ACTION_UP) { sentidoAviao = Sentido.PARADO; } }
Irei explicar aqui o cdigo presente dentro do mtodo onTouch. A primeira linha
de cdigo:
if(e.getAction() == MotionEvent.ACTION_DOWN)
Avalia se houve algum toque na tela, ou seja, quando o mtodo getAction
presente dentro da instncia de classe MotionEvent (representado por e) retorna
um valor do tipo MotionEvent.ACTION_DOWN.
Se a condio avaliada for verdadeira, verifico se o toque ocorreu em uma das
imagens de direo presentes na tela. A instruo:
if(seta_esquerda.IsTouch(e.getX(), e.getY()))
Verifica se a imagem da seta para esquerda foi tocada na tela, atravs do mtodo
IsTouch, cujos argumentos do mesmo so as coordenas X e Y de onde ocorreu o
toque na tela (obtidos atravs dos mtodos getX e getY do objeto e,que
instncia da classe MotionEvent). Veja a instruo abaixo:
Caso a condio do toque seja verdadeira, atribudo a varivel sentidoAviao o
valor Sentido.PRA_TRAS, indicando que o avio ir andar para trs. Veja a
instruo:
sentidoAviao = Sentido.PRA_TRAS;
A explicao similar para o restante das instrues seguintes que avaliam,
respectivamente , se as imagens da seta pra cima, seta para baixo e seta para
direita foram tocadas tambm.
Agora para o primeiro if do bloco de comandos, existe um else, que avalia se o
toque foi liberado da tela, pela seguinte instruo:
if(e.getAction() == MotionEvent.ACTION_UP)
75
Caso seja verdadeira a instruo acima, executado o prximo cdigo:
sentidoAviao = Sentido.PARADO;
Que atribui para a varivel sentidoAviao o valor Sentido.PARADO, indicando
que o nosso avio ir ficar parado.
No evento onTouch o que ocorre somente a atualizao do valor do atributo
sentidoAviao. A atualizao do atributo no far (ainda) que o avio realize
nenhum movimento. Precisamos processar o valor armazenado em sentidoAviao
em um mtodo que ir realmente movimentar o objeto na tela. O movimento do
objeto ser processado no mtodo Update. Vamos no mtodo Update para
digitarmos o seguinte cdigo:
public void Update() { if(sentidoAviao == Sentido.PRA_FRENTE) aviao.MoveByX(10); else if(sentidoAviao == Sentido.PRA_TRAS) aviao.MoveByX(-10); else if(sentidoAviao == Sentido.PRA_CIMA) aviao.MoveByY(-10); else if(sentidoAviao == Sentido.PRA_BAIXO) aviao.MoveByY(10); }
Irei comentar as instrues do mtodo acima. A expresso :
if(sentidoAviao == Sentido.PRA_FRENTE)
Verifica se o atributo sentidoAviao assumi o valor Sentido.PRA_FRENTE, que
indica que o objeto ser movimentado para frente. Se a condio acima for
verdadeira, o avio ser movimento para frente, atravs do mtodo MoveByX,
conforme voc pode conferir abaixo:
aviao.MoveByX(10);
O comando acima vai deslocar o avio para frente (na verdade, para direita), de
10 em 10 pixels, conforme voc pode conferir no valor do argumento do mtodo
acima, que indica o tamanho do deslocamento em pixels.
76
Na condio seguinte, avaliado se o atributo sentidoAviao assumi o valor
Sentido.PRA_TRAS, que indica que o objeto ser movimentado para trs. Se a
condio acima for verdadeira, o avio ser movimento para trs, atravs do
mtodo MoveByX, conforme voc pode conferir abaixo:
aviao.MoveByX(-10);
O comando acima vai deslocar o avio para trs (na verdade, para esquerda), de
10 em 10 pixels (observe que , conforme voc pode conferir no argumento, o
valor est negativo, indicando que ele far o movimento no sentido contrrio).
A mesma explicao similar para as prximas instrues , que avaliam se o
avio se deslocar para cima e para baixo.
Vamos executar a nossa aplicao. O resultado voc confere na imagem
seguinte:
Movendo o avio pela tela (usando o touch screen)
77
Se observarmos o jogo, ns conseguimos mover o avio pela tela, porm, a
nuvem que adicionamos no jogo est imvel. O ideal seria que essa nuvem se
movimentasse, dando a sensao de que o avio est voando (em movimento).
Para colocarmos a nuvem em movimento, precisaremos adicionar mais algumas
instrues. Para comear vamos declarar um atributo, conforme voc pode
conferir em seguida:
int largura_tela;
Agora dentro do mtodo onScreenLoading , logo aps o comando que
adicionamos, vamos adicionar a seguinte instruo destacada em azul abaixo:
public void onScreenLoading(int w, int h, OrientationMode orientation) { : seta_baixo = new Image(context,R.drawable.seta_baixo, w - (64 * 2), h - 64, 64 , 64); seta_direita = new Image(context,R.drawable.seta_direita, w - 64, h - 64, 64 , 64); largura_tela = w; }
Que retorna para a varivel largura_tela o valor da largura da tela do dispositivo
(armazenado no argumento w do mtodo).
Agora dentro do mtodo Update vamos adicionar o seguinte comando destacado
em azul abaixo, como segue:
public void Update() { : else if(sentidoAviao == Sentido.PRA_CIMA) aviao.MoveByY(-10); else if(sentidoAviao == Sentido.PRA_BAIXO) aviao.MoveByY(10); nuvem.MoveByX(-15); if(nuvem.GetX() < -nuvem.GetWidth()) nuvem.SetX(largura_tela); }
78
Irei explicar cada linha de comando das instrues adicionadas acima. A linha:
nuvem.MoveByX(-15);
Desloca a nuvem para a esquerda, de 15 em 15 pixels (lembre-se : valor positivo
significa deslocamento pra direita, e valor negativo deslocamento para esquerda).
A prxima instruo :
if(nuvem.GetX() < -nuvem.GetWidth())
Verifica se a nuvem saiu for a da tela. Como interpretamos a avaliao feita pela
condio acima ? Irei explicar para voc. O mtodo GetX (do objeto nuvem, do
tipo Image) retorna a posio da coordenada X do objeto na tela, e o mtodo
GetWidth retorna a largura do objeto. Quando a posio X de qualquer objeto for
menor que o valor negativo de sua largura, significa que o objeto no est visvel
na tela, ou seja, est fora dela (fora pelo lado esquerdo da tela). Quando isso
acontece, executada a seguinte instruo:
nuvem.SetX(largura_tela);
Que reposiciona a nuvem para surgir a partir da direita da tela, dando a sensao
que o avio est realmente voando. Execute novamente a aplicao e confira o
resultado:
79
Jogo em Execuo Nuvem se movimentando pela tela
Se observarmos o nosso jogo, o nosso avio pode se deslocar perfeitamente pela
tela, porm, de deixarmos o avio se mover constante (e unicamente) para uma
direo, o mesmo sai da tela (independente se para frente, pra trs, pra cima ou
para baixo). Como solucionar esse problema ? simples, basta limitarmos seu
movimento de forma que o mesmo no saia da tela.
Para realizarmos esse procedimento, primeiramente, vamos declarar o seguinte
atributo abaixo (destacado em azul): :
Image seta_direita, seta_esquerda, seta_cima , seta_baixo; int largura_tela; int altura_tela;
Agora vamos dentro do mtodo Update para digitarmos as seguintes linhas de
cdigo destacadas em azul abaixo:
public void Update() { if(sentidoAviao == Sentido.PRA_FRENTE)
80
{ aviao.MoveByX(10); //Comeou a sair da tela indo para frente ??? if((aviao.GetX() + aviao.GetWidth()) > largura_tela) aviao.SetX(largura_tela - aviao.GetWidth()); } else if(sentidoAviao == Sentido.PRA_TRAS) { aviao.MoveByX(-10); //Comeou a sair da tela indo para trs ??? if(aviao.GetX() < 0) aviao.SetX(0); } else if(sentidoAviao == Sentido.PRA_CIMA) { aviao.MoveByY(-10); //Comeou a sair da tela indo para cima ??? if(aviao.GetY() < 0) aviao.SetY(0); } else if(sentidoAviao == Sentido.PRA_BAIXO) { aviao.MoveByY(10); //Comeou a sair da tela indo para baixo ??? if((aviao.GetY() + aviao.GetHeight()) > altura_tela) aviao.SetX(altura_tela - aviao.GetHeight()); } }
Irei explicar agora a finalizade de cada instruo adicionada no cdigo. A
instruo:
if((aviao.GetX() + aviao.GetWidth()) > largura_tela)
Avalia se o avio est comeando a sair da tela indo para frente (se a posio
atual do avio na coordenada X somado com a largura do mesmo for maior que a
largura da tela. Isso uma regra padro). Caso a condio seja verdadeira,
executado a seguinte instruo:
aviao.SetX(largura_tela - aviao.GetWidth());
Que impede que o avio saia da tela, atravs do reajuste da posio dele na
coordenada X, que ser a largura da tela a largura do avio.
81
Quando o avio anda para trs, executado a seguinte avaliao condicional:
if(aviao.GetX() < 0)
Que verifica se o avio est comeando a sair da tela (se a posio X do objeto
for menor que 0). Se a condio for verdadeira, ser executada a seguinte
instruo:
aviao.SetX(0);
Que reajusta a posio do avio , pela coordenada X (definindo a coordenada X
com o valor 0).
Quando o avio anda para cima, executado a seguinte avaliao condicional:
if(aviao.GetY() < 0)
Que verifica se o avio est comeando a sair da tela (se a posio Y do objeto
for menor que 0). Se a condio for verdadeira, ser executada a seguinte
instruo:
aviao.SetY(0);
Que reajusta a posio do avio , pela coordenada Y (definindo a coordenada Y
com o valor 0).
Quando o avio est se movimentando para baixo, executada a seguinte
avaliao:
if((aviao.GetY() + aviao.GetHeight()) > altura_tela)
Que verifica se o avio est comeando a sair da tela (se a posio atual do avio
na coordenada Y somado com a altura do mesmo for maior que a altura da tela.
Isso uma regra padro). Caso a condio seja verdadeira, executado a
seguinte instruo:
aviao.SetY(altura_tela - aviao.GetHeight());
82
Que impede que o avio saia da tela, atravs do reajuste da posio dele na
coordenada Y, que ser a altura da tela a altura do avio.
Executando nossa aplicao, teremos o seguinte resultado:
Jogo em execuo Avio no sai mais da tela
83
Capitulo 8 Trabalhando com animao de sprites (A classe AnimationSprites)
os captulos anteriores, aprendemos a visualizar imagens estticas no
jogo (pode ser qualquer elemento do jogo como uma rvore, um poste,
um bloco e etc). Agora, se eu quisesse que algum elemento do jogo
apresenta-se alguma animao ? Neste captulo vamos aprender como realizar
essas animaes usando sprites no jogo.
Na maioria dos jogos em 2D (talvez podemos dizer todos), alguns os elementos
apresentam algum tipo de animao (como o movimento de um personagem ou a
ao de algum objeto). Agora a pergunta que fao : como so realizadas essas
animaes no jogo ? Essas animaes so realizadas utilizando o que ns
chamamos de sprites. O que vem a ser uma sprite ? Sprites nada mais so do
que um conjunto de imagens, onde cada imagem representa o movimento ou
ao de um determinado elemento do jogo (como um personagem ou um objeto
do jogo qualquer).
Vamos ver abaixo um conjunto de imagens (sprites) de um personagem, onde
cada imagem representa um movimento:
Sprites de um personagem de um jogo (dando soco)
Como funciona a animao de um personagem (ou objeto) durante o jogo ? Se
observarmos as imagens acima, cada uma delas representa um movimento, e
N
84
cada uma delas exibida numa fatia de tempo, dando a sensao de
movimento ou ao.
Para trabalharmos com animao de sprites aqui no Android, ns vamos fazer
uso da classe chamada AnimationSprites, destinada somente para esse tipo de
tarefa (presente dentro do pacote gameutil2d.classes.basic do nosso
framework).
Para comearmos, vamos importar nosso framework para o ADT e em seguida,
vamos realizar algumas modificaes nele, conforme mostrado em seguida:
Nome do projeto : AnimacaoSprites
Constante app_name : Animacao de Sprites
Depois de criado o projeto, vamos adicionar as seguintes imagens , que j
acompanham este material, em nosso projeto : naruto_parado_1.png,
naruto_parado_2.png, naruto_parado_3.png e naruto_parado_4.png.
Depois de colocar as imagens dentro do projeto, vamos abrir o arquivo
GameMain.java, para digitarmos o cdigo do nosso jogo. Na declarao de
atributos, vamos realizar a seguinte declarao, conforme mostrado em
seguida:
AnimationSprites naruto;
Agora dentro do mtodo construtor GameMain , vamos escrever o seguinte
cdigo (destacado em azul), conforme mostrado abaixo:
public GameMain(Context context) { naruto = new AnimationSprites(context, 0, 0, 124, 164); naruto.Add(R.drawable.naruto_parado_1); naruto.Add(R.drawable.naruto_parado_2); naruto.Add(R.drawable.naruto_parado_3); naruto.Add(R.drawable.naruto_parado_4); naruto.Start(3, true); }
Irei explicar o cdigo inserido no mtodo acima. A linha de comando:
85
naruto = new AnimationSprites(context, 0, 0, 124, 164);
Carrega a instncia do objeto naruto do tipo AnimationSprites. No primeiro
argumento da classe, sempre passamos o valor context. No segundo e terceiro
parmetro, passamos respectivamente a coordenada X e Y do objeto na tela. J
os dois ltimos parmetros representam , respectivamente , a largura e a altura
do objeto (124 para largura e 164 para altura). Nas linhas de comando seguinte:
:
naruto.Add(R.drawable.naruto_parado_1); naruto.Add(R.drawable.naruto_parado_2); naruto.Add(R.drawable.naruto_parado_3); naruto.Add(R.drawable.naruto_parado_4); :
Adicionamos as imagens (sprites) dentro do objeto, para que possamos ter uma
animao do personagem, atravs do mtodo Add. Em seguida, vem a seguinte
instruo:
naruto.Start(20, true);
Que tem a finalidade de iniciar a animao, atravs do mtodo Start. Esse
mtodo possui dois parmetros : O primeiro parmetro responsvel por definir,
em frames, o intervalo da troca de imagens, e o segundo definimos se a
animao vai ficar em loop (caso true) ou no (caso false).
Agora no mtodo Draw vamos adicionar a seguinte instruo:
protected void Draw(Canvas canvas) { naruto.Draw(canvas); }
86
Vamos executar agora a nossa demonstrao ? Veja como ficou na figura
seguinte:
Animao do personagem em execuo
Em uma animao de sprites tambm podemos aplicar o efeito e flip (inverso)
de uma imagem, na horizontal (como j havamos visto com imagens estticas).
Para invertermos uma imagem na horizontal, basta adicionar um parmetro no
mtodo Draw do objeto, o FlipEffect.HORIZONTAL.
Vamos voltar para o mtodo Draw da classe GameMain para substituirmos a
linha abaixo:
naruto.Draw(canvas);
Por essa:
naruto.Draw(canvas,FlipEffect.HORIZONTAL);
87
Que inverte as imagens da animao (como havia falado, esse procedimento
acima funciona tambm para imagens estticas). Veja o resultado na figura
seguinte:
A
nimao do personagem invertida na horizontal
Mais um exemplo de animao de sprites
Vamos realizar agora mais uma pratica de animao de sprites no Android
usando a classe AnimationSprites. Para essa pratica vamos importar um projeto
em Android j feito (que j acompanha este material), que o arquivo
AnimacaoSprites_GundamWing.zip, para dentro do ADT.
Aps importar o arquivo AnimacaoSprites_GundamWing.zip para dentro do ADT
execute o jogo e confira o resultado, conforme mostra a figura seguinte:
88
Jogo em execuo
Esse um exemplo baseado no jogo Gundam Wing Endless Duel, um dos
grandes sucessos da plataforma Super Nitendo.
A inteno deste exemplo trocarmos as posies dos personagens do jogo.
Para isso, vamos abrir o arquivo GameMain.java e em seguida vamos realizar
as seguintes modificaes citadas a seguir:
Dentro do mtodo onScreenLoading, vamos substituir as seguintes linhas de
cdigo destacadas em vermelho abaixo:
public void onScreenLoading(int w, int h, OrientationMode orientation) { wing_gundam = new AnimationSprites(context, 100, 130, 200, 250); wing_gundam.Add(R.drawable.wing_gundam_parado_1); wing_gundam.Add(R.drawable.wing_gundam_parado_2); : heavy_arms = new AnimationSprites(context, 450, 120, 197, 263);
89
heavy_arms.Add(R.drawable.heavy_arms_parado_1); heavy_arms.Add(R.drawable.heavy_arms_parado_2); : }
Pelas seguintes linhas de cdigo destacadas em azul abaixo:
public void onScreenLoading(int w, int h, OrientationMode orientation) { wing_gundam = new AnimationSprites(context, 450, 130, 200, 250); wing_gundam.Add(R.drawable.wing_gundam_parado_1); wing_gundam.Add(R.drawable.wing_gundam_parado_2); : heavy_arms = new AnimationSprites(context, 100, 120, 197, 263); heavy_arms.Add(R.drawable.heavy_arms_parado_1); heavy_arms.Add(R.drawable.heavy_arms_parado_2); : }
Agora dentro do mtodo Draw vamos substituir as seguintes linhas de cdigo
destacadas em vermelho abaixo:
public void Draw(Canvas canvas) { : wing_gundam.Draw(canvas); heavy_arms.Draw(canvas,FlipEffect.HORIZONTAL); }
Pelas seguintes linhas de cdigo destacadas em azul abaixo:
public void Draw(Canvas canvas) { : wing_gundam.Draw(canvas, FlipEffect.HORIZONTAL); heavy_arms.Draw(canvas); }
Depois de realizar as alteraes de cdigo citadas acima, execute novamente o
jogo e confira os resultados, conforme podemos observar na figura seguinte:
90
Jogo em execuo Personagens trocados de posio
Regras para a criao de sprites
Quando vamos criar as sprites (animaes) de um determinado elemento de um
jogo, normalmente, cada imagem que ir representar uma ao desse elemento,
deve ter o mesmo tamanho (padronizado para cada elemento do jogo), e quando
salvas, devero estar nomeadas de forma que fique fcil a organizao das
imagens (como por exemplo : personagem_andando_1.png ,
personagem_andando2.png e etc).
91
Capitulo 9 Detectando colises entre objetos no jogo
ma das tcnicas mais importantes que no se pode faltar em um jogo, a
deteco de colises entre elementos .Neste captulo, iremos aprender a
detectar se dois objetos (ou mais) se colidem um com o outro no jogo,
atravs dos recursos oferecidos neste material.
Para a deteco de coliso entre elementos, iremos fazer uso da classe
Collision, que j se encontra presente no modelo de projeto que usamos.
Para comear, vamos importar nosso framework para o ADT, e em seguida
vamos fazer as seguintes modificaes:
Nome do projeto : ColisaoEntreObjetos
Constante app_name : Colisao entre Objetos
Depois de criado o projeto , vamos adicionar as seguintes imagens (dentro do
diretrio drawable-mdpi) : seta_esquerda.png , seta_direita.png ,
monstro_andando_1.png, monstro_andando_2.png , cenario.png e
obstaculo.png.
Agora vamos abrir o arquivo GameMain.java para escrevermos o cdigo do
nosso jogo.
Dentro da seo de declarao de atributos, vamos realizar as declaraes
abaixo, como segue:
AnimationSprites personagem; Image cenario; Image obstaculo,obstaculo2; Context context;
U
92
Image seta_esquerda, seta_direita; enum Movimento { DIREITA, ESQUERDA, PARADO } Movimento movimentoPersonagem = Movimento.PARADO;
Agora dentro do mtodo GameMain vamos escrever o seguinte cdigo abaixo:
public GameMain(Context context) { this.context = context; }
Agora dentro do mtodo onScreenLoading vamos adicionar as seguintes
instrues:
public void onScreenLoading(int w, int h, OrientationMode orientation) { personagem = new AnimationSprites(context, (400 - 24), 305, 48, 50); personagem.Add(R.drawable.monstro_andando_1); personagem.Add(R.drawable.monstro_andando_2); personagem.Start(10, true); cenario = new Image(context, R.drawable.cenario, 0, 0, w, h); obstaculo = new Image(context, R.drawable.obstaculo, 80, 253, 68, 120); obstaculo2 = new Image(context, R.drawable.obstaculo, 630, 253, 68, 120); seta_esquerda = new Image(context, R.drawable.seta_esquerda, 0, h-96, 96, 96); seta_direita = new Image(context, R.drawable.seta_direita, w-96, h-96, 96, 96); }
Agora dentro do mtodo Update vamos escrever o seguinte cdigo abaixo:
public void Update() { if(movimentoPersonagem == Movimento.DIREITA) personagem.MoveByX(10); else if(movimentoPersonagem == Movimento.ESQUERDA) personagem.MoveByX(-10); }
Agora dentro do mtodo Draw vamos adicionar o seguinte cdigo:
public void Draw(Canvas canvas) { cenario.Draw(canvas); obstaculo.Draw(canvas);
93
obstaculo2.Draw(canvas); personagem.Draw(canvas); seta_esquerda.Draw(canvas); seta_direita.Draw(canvas); }
E para finalizar, no mtodo onTouch, vamos adicionar o seguinte cdigo abaixo:
public void onTouch(MotionEvent e) { if(e.getAction() == MotionEvent.ACTION_DOWN) { if(seta_direita.IsTouch(e.getX(), e.getY())) movimentoPersonagem = Movimento.DIREITA; else if(seta_esquerda.IsTouch(e.getX(), e.getY())) movimentoPersonagem = Movimento.ESQUERDA; } else if(e.getAction() == MotionEvent.ACTION_UP) movimentoPersonagem = Movimento.PARADO; }
Depois de adicionarmos o cdigo do nosso jogo, vamos execut-lo. O resultado
voc confere na figura seguinte:
94
Jogo em execuo
Se observarmos o jogo acima, nosso personagem pode se movimentar de um
lado para o outro, porm, o nosso personagem no pode ultrapassar os
obstculos (que so os elevadores).
A ideia seria desenvolver um cdigo que ir detectar a coliso do personagem
com os obstculos, que no caso so os elevadores.
Para adicionarmos o cdigo de coliso, vamos no mtodo Update para
adicionarmos as seguinte instrues, destacados em azul abaixo:
public void Update() { if(movimentoPersonagem == Movimento.DIREITA) { personagem.MoveByX(10);
95
//Colidiu com o obstculo da direita ("obstaculo2") if(Collision.Check(personagem, obstaculo2)) personagem.MoveByX(-10); } else if(movimentoPersonagem == Movimento.ESQUERDA) { personagem.MoveByX(-10); //Colidiu com o obstculo da esquerda ("obstaculo") if(Collision.Check(personagem, obstaculo)) personagem.MoveByX(10); } }
Irei explicar agora o cdigo que avalia a coliso do personagem com as barras
horizontais e verticais. A expresso abaixo:
if(movimentoPersonagem == Movimento.DIREITA)
Verifica se a varivel movimentoPersonagem est assumindo o status
Movimento.DIREITA (indicando que o personagem est andando para direita).
Se a condio acima for verdadeira, o personagem ir se deslocar para direita, 10
pixels, atravs da instruo abaixo:
personagem.MoveByX(10);
Em algum momento do deslocamento, poder haver um determinado momento em que o personagem poder se colidir com o obstculo da direita (o objeto obstaculo2), agora, como avaliar se houve a coliso ? Para verificar se houve uma coliso entre dois objetos usamos o mtodo Check da classe Collision, como podemos ver na instruo abaixo:
if(Collision.Check(personagem, obstaculo2))
Se ocorrer uma coliso, nosso personagem ir voltar um passo anterior (se ele
andou 10 pixels para direita e nesse movimento ele colidiu com o obstculo, ele
voltar um passo anterior), conforme voc confere em seguida:
personagem.MoveByX(-10);
96
A explicao das condies seguintes similar ao que foi explicado agora. Vamos executar agora a nossa demonstrao e conferir os resultados.
Jogo em execuo Personagem Colide com o Elevador
Como pudemos observar acima, a coliso uma das tcnicas de
desenvolvimento de jogos mais importantes, com essa tcnica conseguimos
muitas coisas (como verificar se o personagem est pisando