Você está na página 1de 207

Book Apostila.

indb 1

27/01/2012 15:13:45

Apresentao

O mercado de Jogos pa
constante crescimento (no
so mostrados anncios d
para download). Desde o su
incalculvel o nmero de
(incluindo a maioria, jogos).

Neste Material iremos apren


para a plataforma Google An
com o Android SDK.

Game Mobile (JAVA)


Luciano Alves da Silva

Book Apostila.indb 1

27/01/2012 15:13:45

Apresentao
O mercado de Jogos para dispositivos mveis atualmente est em
constante crescimento (no de hoje que na televiso em algum momento
so mostrados anncios de jogos para celulares/smartphones disponveis
para download). Desde o surgimento da plataforma Google Android, quase
incalculvel o nmero de aplicativos disponveis para essa plataforma
(incluindo a maioria, jogos).
Neste Material iremos aprender passo a passo a desenvolver jogos voltados
para a plataforma Google Android, atravs da ferramenta Eclipse em conjunto
com o Android SDK.

Book Apostila.indb 2

27/01/2012 15:13:45

INDICE

5.13.2) Estrutura

5.13.3) Operado

Captulo 1- Fundamentos bsicos sobre jogos....................................... 5

5.13.4) Operado

5.13.5) Estrutura

1.1) O que um jogo ?..................................................................................................... 6

5.14) Estruturas

1.2) O mercado de jogos para dispositivos mveis.........................................................6

5.14.1) Estrutura

1.3) jogos para PC/Console versus jogos para Celular/Smartphone ?............................6

5.14.2) Estrutura

Captulo 2- A plataforma Google Android............................................... 8


2.1) Introduo................................................................................................................. 9

5.14.3) Estrutura

Captulo 6- Progra

2.2) Estrutura Geral da plataforma Google Android.........................................................11

6.1) Estrutura ge

2.2.1) A arquitetura do Android....................................................................................... 11

6.2) Usando atrib

2.2.2) Aplicaes.............................................................................................................. 12

6.3) Usando mt

2.2.3) Android Runtime.....................................................................................................12

6.4) Usando con

2.2.4) Linux Kernel............................................................................................................13

6.5) Herana......

Captulo 3- Instalando o Eclipse e o Android..........................................15


Captulo 4- Desenvolvendo nossa primeira aplicao no Android..........27
Captulo 5- Fundamentos da Linguagem Java........................................41

6.5.1) Modificad
6.6) Sobrecarga

6.7) Interfaces...

6.8) Polimorfism

5.1) Sobre a linguagem Java............................................................................................ 42


5.2) Caractersticas da linguagem Java............................................................................42

Captulo 7- Conhe

5.3) Comeando a programar em Java..........................................................................44

7.1) Desenvolven

5.4) Dados e informaes...............................................................................................48

7.2) Desenvolve

5.5) Variveis e memria.................................................................................................48


5.6) Declarando variveis................................................................................................49
5.7) Manipulando variveis.............................................................................................50

8.1) Movimentan

5.7.1) Comando de atribuio........................................................................................50

Captulo 9- Colis

5.7.2) Comando de leitura de dados via teclado............................................................50

Captulo 10- Trab

5.8) Operadores aritmticos...........................................................................................54

Captulo 11- Crian

5.9) Arrays.......................................................................................................................55

Captulo 12- Trab

5.10) Classes empacotadoras........................................................................................56


5.10.1) Mtodos de converso........................................................................................57
5.11) Converso entre tipos primitivos...........................................................................60
5.12) Enumerao.......................................................................................................... 61
5.13) Estruturas condicionais......................................................................................... 62
5.13.1) Estrutura condicional if.......................................................................................62

Book Apostila.indb 3

Captulo 8- A estr

27/01/2012 15:13:45

Captulo 13- Dese

8.1) Concluso..

5.13.2) Estrutura condicional if/else................................................................................. 63


5.13.3) Operadores relacionais.........................................................................................63
5.13.4) Operadores lgicos.............................................................................................. 64

....................... 5

5.13.5) Estrutura de mltipla escolha switch/case...........................................................66

............................... 6

5.14) Estruturas de repetio........................................................................................... 68

...............................6

5.14.1) Estrutura while...................................................................................................... 68

?............................6

5.14.2) Estrutura do/while..................................................................................................70


5.14.3) Estrutura for.......................................................................................................... 71

....................... 8

.............................. 9

Captulo 6- Programao Orientada a Objetos....................................... 75

...............................11

6.1) Estrutura geral de uma classe em Java.................................................................... 76

............................. 11

6.2) Usando atributos....................................................................................................... 76

.............................. 12

6.3) Usando mtodos....................................................................................................... 76

...............................12

6.4) Usando construtores................................................................................................. 77

...............................13

6.5) Herana..................................................................................................................... 79
6.5.1) Modificadores de escopos..................................................................................... 80

.......................15

6.6) Sobrecarga de mtodos............................................................................................82

Android..........27

6.7) Interfaces................................................................................................................... 83

.......................41

6.8) Polimorfismo..............................................................................................................86

............................... 42

...............................42

Captulo 7- Conhecendo as Widgets do Android.................................... 93

..............................44

7.1) Desenvolvendo nosso primeiro jogo (Nmero mgico).............................................94

..............................48

7.2) Desenvolvendo um jogo do Joquemp.................................................................... 115

..............................48

..............................49

..............................50

Captulo 8- A estrutura de layout AbsoluteLayout.............................. 130


8.1) Movimentando um objeto na tela............................................................................. 131

..............................50

Captulo 9- Coliso de Objetos................................................................137

..............................50

Captulo 10- Trabalhando com sprites em um jogo................................144

..............................54

Captulo 11- Criando objetos dinamicamente.........................................159

..............................55

Captulo 12- Trabalhando com msica e sons em um jogo.....................171

..............................56

..............................57

Captulo 13- Desenvolvendo um jogo de corrida.................................... 183


8.1) Concluso..................................................................................................................207

..............................60

.............................. 61

.............................. 62

..............................62

Book Apostila.indb 4

27/01/2012 15:13:45

F u n d a m e n t

G a m e

M o b i l e

Captulo 01 Fund

( J A V A )

Aqui neste captulo vamos


jogos eletrnicos e o seu m

C a p t u l o
F u n d a m e n t o s

b s i c o s

0 1
s o b r e

1.1 O que um jogo ?

j o g o s

Um jogo de computador n
desenvolvida e destinada so
diversos gneros de jogos c

O desenvolvimento de um j
um, o conhecimento de lg
ter dificuldades em criar s
em ferramentas conhecidas
C#, Visual Basic, Delphi, Jav
e o conhecido da mesma, o
por ela desenvolver seu jog

1.2 O mercado de jogo

O mercado de desenvolvim
mercados que est em con
televiso, sempre h annci
para download.

O crescimento do setor de
dos jogos casuais existente
celulares mais simples) com
etc. Com o avano da tecno
evoluram na mesma propo
termos de entretenimento.

1.3 jogos para PC/C


Smartphone ?

Um jogo de computador,
dedicao para seu desenv
entre desenvolver um jog
Smartphone, este ltimo tor
Jogos para PC/console

O desenvolvimento de um j
de desenvolvimento (isto e
profissionais envolvidos no
(dependendo do jogo).

Jogos para Celulares/Smar

O desenvolvimento de um
moderado de desenvolvime
relativamente menor se com

Depois de uma breve viso


vamos conhecer agora a re

Book Apostila.indb 5

27/01/2012 15:13:45

F u n d a m e n t o s

b s i c o s

s o b r e

j o g o s

Captulo 01 Fundamentos bsicos sobre jogos


Aqui neste captulo vamos ter uma breve introduo a respeito sobre os
jogos eletrnicos e o seu mercado dentro da plataforma mvel.

1.1 O que um jogo ?

o g o s

Um jogo de computador nada mais do que uma aplicao (programa)


desenvolvida e destinada somente para o entretenimento. Existem atualmente
diversos gneros de jogos como luta, ao, aventura , esportes e etc.
O desenvolvimento de um jogo requer do usurio que pretende desenvolver
um, o conhecimento de lgica de programao, pois assim o mesmo no
ter dificuldades em criar seu jogo. Normalmente um jogo desenvolvido
em ferramentas conhecidas como linguagem de programao (como C++,
C#, Visual Basic, Delphi, Java e etc.). Tendo em mente a linguagem escolhida
e o conhecido da mesma, o usurio poder atravs dos recursos oferecidos
por ela desenvolver seu jogo.

1.2 O mercado de jogos para dispositivos mveis


O mercado de desenvolvimento de jogos para dispositivos mveis um dos
mercados que est em constante crescimento. Tanto na internet quanto na
televiso, sempre h anncios de jogos para dispositivos mveis, disponveis
para download.
O crescimento do setor de jogos para essa plataforma se deve ao sucesso
dos jogos casuais existentes na maioria dos dispositivos mveis (desde os
celulares mais simples) como Tetris, Sudoku, Snake (Jogo da cobrinha) e
etc. Com o avano da tecnologia para a plataforma mvel, os jogos tambm
evoluram na mesma proporo , oferecendo um grande enriquecimento em
termos de entretenimento.

1.3 jogos para PC/Console versus jogos para Celular/


Smartphone ?
Um jogo de computador, qualquer que seja seu gnero, exige tempo e
dedicao para seu desenvolvimento, porm, se fizermos uma comparao
entre desenvolver um jogo para PC/Console e um jogo para Celular/
Smartphone, este ltimo torna-se vivel. Veja as comparaes abaixo:
Jogos para PC/console
O desenvolvimento de um jogo para PC/Console possui um altssimo custo
de desenvolvimento (isto envolve ferramentas de criao de jogos e os
profissionais envolvidos no desenvolvimento) e tempo para ser desenvolvido
(dependendo do jogo).
Jogos para Celulares/SmartPhones
O desenvolvimento de um jogo para Celular/Smartphone possui um custo
moderado de desenvolvimento e o tempo para a concluso do mesmo e
relativamente menor se comparado a um jogo de PC/Console.
Depois de uma breve viso geral a respeito de jogos e o mercado deles,
vamos conhecer agora a respeito da plataforma Google Android.

Book Apostila.indb 6

27/01/2012 15:13:46

G a m e

M o b i l e

( J A V A )

ANOTAES

Book Apostila.indb 7

27/01/2012 15:13:46

G a m e

M o b i l e

C a p t u l o
A

p l a t a f o r m a

Captulo 02 A pla

( J A V A )

Neste captulo ser abordad


ela surgiu, como est organ

0 2

G o o g l e

p l a t a f o r

A n d r o i d

2.1 Introduo

O Android uma platafo


dispositivos mveis, totalme
em 5 de novembro de 2007
com sistema operacional Li
OHA (Open Handset Allianc
80 empresas as quais se un
de aplicaes e servios, c
experincia mais rica em te
financeiros para o mercado

Um dos SmartPhones que o


G1 da empresa T-Mobile. C

No demorou muito para q


contamos com operadoras
a essa plataforma.

Os SmartPhones disponve
operadoras, que suportam
Motorola Milestone. Confira

Book Apostila.indb 8

27/01/2012 15:13:46

p l a t a f o r m a

G o o g l e

A n d r o i d

Captulo 02 A plataforma Google Android


Neste captulo ser abordada a respeito da plataforma Google Android, como
ela surgiu, como est organizada sua estrutura e arquitetura e tudo mais.

i d

2.1 Introduo
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. Ela foi desenvolvida sobre a plataforma Java
com sistema operacional Linux e atualmente essa plataforma mantida pela
OHA (Open Handset Alliance), um grupo constitudo por aproximadamente
80 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 SmartPhones que ofereceu suporte a esse sistema operacional foi o
G1 da empresa T-Mobile. Confira na imagem seguinte:

G1 - T-Mobile
No demorou muito para que o Android chegasse aqui no Brasil. Hoje j
contamos com operadoras como a Claro, TIM e Vivo que j oferecem suporte
a essa plataforma.
Os SmartPhones disponveis aqui no Brasil oferecidos por algumas dessas
operadoras, que suportam o sistema Android o Samgung Galaxy e o
Motorola Milestone. Confira esses SmartPhones nas imagens seguintes:

Book Apostila.indb 9

27/01/2012 15:13:46

G a m e

M o b i l e

( J A V A )

p l a t a f o r

2.2 Estrutura Geral d

O Android SDK uma ferra


conjunto de APIs necessri
Android, utilizando a linguag

Vamos conhecer os recurso

- Application framewor
componentes ;

- Dalvik virtual machine:


dispositivos mveis ;

- Browser Integrado base

- Grficos Otimizados O
baseada na especificao O

- SQLite: Sistema Gerencia


Android para guardar dados

- Suporte multimdia: A p
de imagem (MPEG4, H.264

Samsung Galaxy

- Telefonia GSM (depende

- Bluetooth, EDGE, 3G, e

- Cmera, GPS, compass

- Rico ambiente de de
dispositivo, ferramentas de
para o Eclipse (ADT) ;

2.2.1 A arquitetura do

Motorola Milestone

Arquit

10

Book Apostila.indb 10

27/01/2012 15:13:46

i l e

( J A V A )

p l a t a f o r m a

G o o g l e

A n d r o i d

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 ;
- 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) ;

2.2.1 A arquitetura do Android

Arquitetura geral da plataforma

11

Book Apostila.indb 11

27/01/2012 15:13:46

G a m e

M o b i l e

( J A V A )

p l a t a f o r

2.2.2 Aplicaes

2.2.4 Linux Kernel

O Android nos fornece um conjunto de aplicaes fundamentais, so elas:

O Android foi projetado em


servios centrais do sistem
gesto de processos, etc.
abstrao entre o hardware

- um cliente de e-mail;
- programa de SMS;
- agenda;
- mapas;
- navegador;
- contatos entre outros.
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 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.

12

Book Apostila.indb 12

27/01/2012 15:13:46

i l e

( J A V A )

es fundamentais, so elas:

p l a t a f o r m a

G o o g l e

A n d r o i d

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.

id foram desenvolvidos na

ecas C/C++ utilizadas por


as bibliotecas abaixo:

tao derivada da biblioteca


ntonizada para dispositivos

penCORE; so as bibliotecas
o e vdeo, incluindo tambm

ao subsistema de exibio
2D e 3D;

r engine utilizado tanto no

o OpenGL ES 1.0 APIs; As


e (quando disponvel) ou o
o includo no Android.

erizao de fontes bitmap e

no sistema gerenciador de
ra todas as aplicaes.

tecas que fornece a maioria


bibliotecas da linguagem

processo, com sua prpria


escrito de forma a executar
.dex, que otimizado para
em registros e roda classes
formadas em arquivos .dex,

uncionalidades subjacentes
de memria.

13

Book Apostila.indb 13

27/01/2012 15:13:46

G a m e

M o b i l e

( J A V A )

ANOTAES

14

Book Apostila.indb 14

27/01/2012 15:13:46

I n s t a l a n d o

G a m e

M o b i l e

C a p t u l o
I n s t a l a n d o

E c l i p s e

Captulo 03 Insta

( J A V A )

Para a elaborao dessa a


para Windows), o SDK do
para o Eclipse ADT-10.0.1.
programas citados acima s
necessrio que voc tenha
(de preferncia a verso 5 o

0 3
e

A n d r o i d

Para saber se voc possui


comando de digite a seguin
java version

Se mostrar algo parecido co

java version 1.6.0_07


Java(TM) SE Runtime Enviro
Java HotSpot(TM) Client VM

Significa voc possui uma m


caso contrrio, instale o JD
abaixo:

http://www.oracle.com/tech

Se voc j possui a mquina


agora voc fazer o downloa

http://www.eclipse.org/dow

Para fazer o download do


abaixo:

http://developer.android.com

Depois de obter os program


as devidas configuraes. P
android-sdk_r10-windows.
de descompactar, execute
dentro da pasta descompac

Contedo

Book Apostila.indb 15

27/01/2012 15:13:46

d r o i d

I n s t a l a n d o

E c l i p s e

A n d r o i d

Captulo 03 Instalando o Eclipse e o Android


Para a elaborao dessa apostila foi utilizado Eclipse Galileo (Eclipse 3.5.1
para Windows), o SDK do Android Reviso 10 e o plugin do Android
para o Eclipse ADT-10.0.1. Qualquer verso (de preferncia superior) dos
programas citados acima serve. Para que toda essa aplicao funcione
necessrio que voc tenha instalado, antes de tudo, a Mquina Virtual Java
(de preferncia a verso 5 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 mostra o cdigo abaixo:
java version 1.6.0_07
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
Significa voc possui uma mquina virtual Java instalada no seu computador,
caso contrrio, instale o JDK. Voc pode fazer o download do JDK pelo link
abaixo:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Se voc j possui a mquina virtual Java instalada em seu computador, basta
agora voc fazer o download do Eclipse, que pode ser feita pelo link abaixo:
http://www.eclipse.org/downloads/
Para fazer o download do Android SDK e do seu plugin , faa pelo link
abaixo:
http://developer.android.com/sdk/index.html
Depois de obter os programas e plugins citados acima, vamos fazer agora
as devidas configuraes. Primeiramente, voc ir descompactar o arquivo
android-sdk_r10-windows.zip, de preferncia no diretrio raiz C:\. Depois
de descompactar, execute o utilitrio SDK Manager, que se encontra
dentro da pasta descompactada, conforme mostrado na figura abaixo:

Contedo do arquivo descompactado

16

Book Apostila.indb 16

27/01/2012 15:13:46

G a m e

M o b i l e

( J A V A )

Ao execut-lo ele ir atualizar as suas fontes , conforme demonstra a figura


seguinte:

I n s t a l a n d o

Precisamos agora instalar


dilogo. Clique na seo
recursos disponveis para in
Repository e automaticam
download como voc pode

Processo de atualizao das informaes


Ao terminar o processamento acima, ele ira mostrar uma lista de pacotes
disponveis e necessrios para download, como podemos conferir a figura
abaixo:

Caixa de

Ns iremos trabalhar com a


vamos marcar a opo SD
seguida vamos clicar no b
seguinte caixa de dilogo a

Lista de pacotes disponveis para download


Vamos cancelar a instalao dos pacotes acima clicando no boto Cancel,
pois, no iremos instalar tudo. Feito isso voc ir visualizar a seguinte caixa
de dilogo abaixo:

Prepara

Vamos proceder com a ins


plataforma Android 2.1 ser

Caixa de dilogo Installed packages

Instala

17

Book Apostila.indb 17

27/01/2012 15:13:47

i l e

( J A V A )

onforme demonstra a figura

I n s t a l a n d o

E c l i p s e

A n d r o i d

Precisamos agora instalar a plataforma Android atravs desta caixa de


dilogo. Clique na seo Avaiable packages para visualizar todos os
recursos disponveis para instalao. Feito isso expanda a opo Android
Repository e automaticamente voc ver os recursos disponveis para
download como voc pode conferir na figura abaixo:

nformaes

ostrar uma lista de pacotes


o podemos conferir a figura

Caixa de dilogo - Available Packages


Ns iremos trabalhar com a plataforma Android 2.1 API 7, revision 2. Ento
vamos marcar a opo SDK Platform Android 2.1, API 7, revision 2 e em
seguida vamos clicar no boto Install Selected. Feito isso, voc ver a
seguinte caixa de dilogo abaixo:

ra download

clicando no boto Cancel,


visualizar a seguinte caixa

Preparando para Instalar o Android


Vamos proceder com a instalao clicando no boto Install. Feito isso a
plataforma Android 2.1 ser instalada, conforme demonstra a figura abaixo

packages
Instalao do Android em processo

Book Apostila.indb 18

18

27/01/2012 15:13:47

G a m e

M o b i l e

( J A V A )

I n s t a l a n d o

Depois de concluda a instalao do Android ser mostrada uma mensagem


pedindo que o ADB seja reiniciado, como demonstra a figura abaixo:

Para instalarmos o plugin d


uma caixa de dilogo confo

Mensagem solicitando para reiniciar do adb


Clique em Yes para reiniciar a ADB, e o resultado voc pode conferir na
figura abaixo.

Caix

Agora vamos clicar no bo


Android A.D.T-10.0.1.zip.
abaixo:

Instalao do Android concluda


Uma etapa concluda. Agora vamos instalar o Eclipse com o plugin do
Android. Para instalar o Eclipse simplesmente descompacte-o em um local
apropriado, de preferncia no drive C:\. Depois disso copie para o drive C:\
o plugin do Android ADT-10.0.1.zip. Feito isso vamos executar o Eclipse.
Com o Eclipse aberto , vamos no menu Help / Install New Software e
ser aberta uma caixa de dilogo, conforme mostra a figura seguinte:

Caix

Ao clicar em OK ser mo
seguinte:

Caixa de dilogo - Install

Ca

19

Book Apostila.indb 19

27/01/2012 15:13:47

i l e

( J A V A )

mostrada uma mensagem


nstra a figura abaixo:

I n s t a l a n d o

E c l i p s e

A n d r o i d

Para instalarmos o plugin do Android clique no boto Add, e ser exibida


uma caixa de dilogo conforme mostra a figura abaixo:

iciar do adb

tado voc pode conferir na

Caixa de dilogo - Add Site


Agora vamos clicar no boto Archive para selecionarmos o plugin do
Android A.D.T-10.0.1.zip. Preencha o campo Name como mostra a figura
abaixo:

ncluda

Eclipse com o plugin do


escompacte-o em um local
disso copie para o drive C:\
vamos executar o Eclipse.
/ Install New Software e
stra a figura seguinte:

Caixa de dilogo - Add Site


Ao clicar em OK ser mostrada uma tela, conforme demonstra a figura
seguinte:

tall
Caixa de Dialogo - Install

Book Apostila.indb 20

20

27/01/2012 15:13:47

G a m e

M o b i l e

( J A V A )

I n s t a l a n d o

Agora expanda o item Developer Tools e marque todas as opes,


conforme mostra a figura seguinte:

Agora, clique no boto Fin


demonstra a figura abaixo,

Instalan

Se em algum momento dur

Caixa de Dialogo - Install


Aps fazer isso clique no boto Next, e em seguida ser mostrada a
prxima tela, conforme demonstra a figura abaixo:

Pode clicar em OK sem p


termino do processo voc
mensagem abaixo:

Aps o Eclipse ter reinicia


a conexo da ferramenta
Window / Preferences.
Android e ser mostrada u

Caixa de Dialogo - Install

21

Book Apostila.indb 21

27/01/2012 15:13:47

i l e

( J A V A )

marque todas as opes,

I n s t a l a n d o

E c l i p s e

A n d r o i d

Agora, clique no boto Finish. Aps isso ocorrer alguns processos, como
demonstra a figura abaixo, aguarde at terminar.

Instalando do Android no Eclipse


Se em algum momento durante o processo for exibida a figura abaixo:

tall

seguida ser mostrada a


o:

Caixa de mensagem
Pode clicar em OK sem problemas, e o processo se completar. Aps o
termino do processo voc deve reiniciar o Eclipse, clicando em Yes, na
mensagem abaixo:

Caixa de mensagem
Aps o Eclipse ter reiniciado, vamos fazer agora as configuraes para
a conexo da ferramenta com o emulador do Android. Vamos no menu
Window / Preferences. Aberta a caixa de dilogo, selecione o item
Android e ser mostrada uma tela, conforme demonstra a figura seguinte:

tall

22

Book Apostila.indb 22

27/01/2012 15:13:47

G a m e

M o b i l e

( J A V A )

I n s t a l a n d o

Para criarmos um dispositi


uma tela conforme mostra a

Caixa de

Caixa de dilogo - Preferences


Agora voc vai selecionar o diretrio onde se encontra o Android, que neste
caso, o Android se encontra instalado em C:\android-sdk-windows, logo,
terei que selecionar essa pasta. Feito isso basta clicar em OK.
Para finalizar vamos definir um dispositivo virtual, conhecido como AVD
(Android Virtual Device), onde nossas aplicaes daqui para frente sero
executadas. Para isso, v no menu Windows / Android SDK and AVD
Manager, e ser aberta uma caixa de dilogo conforme mostra a figura
seguinte:

De inicio, vamos configurar


Em Name voc define o n

Em Target definirmos a p
temos uma o Android 2.1-u

Em Skin na opo Built-in


mudar essa opo para HV
Depois de preencher todos
de acordo com a figura aba

Feito o procedimento acima, ser aberta uma tela conforme mostra a figura
abaixo:

Caixa de dilogo - Virtual Settings

Caixa de

23

Book Apostila.indb 23

27/01/2012 15:13:47

i l e

( J A V A )

ences

contra o Android, que neste


ndroid-sdk-windows, logo,
clicar em OK.

ual, conhecido como AVD


es daqui para frente sero
/ Android SDK and AVD
conforme mostra a figura

I n s t a l a n d o

E c l i p s e

A n d r o i d

Para criarmos um dispositivo virtual clique no boto New, e ser aberta


uma tela conforme mostra a figura abaixo:

Caixa de dilogo - Create new AVD


De inicio, vamos configurar o bsico pra executarmos a nossa aplicao.
Em Name voc define o nome do AVD, vamos cham-lo de Emulador.
Em Target definirmos a plataforma-alvo a ser executada, neste caso s
temos uma o Android 2.1-update1 - API Level 7. Vamos selecion-la.
Em Skin na opo Built-in a opo padro Default (WVGA800). Vamos
mudar essa opo para HVGA.
Depois de preencher todos os campos, a tela de criao do AVD deve estar
de acordo com a figura abaixo:

a conforme mostra a figura

Settings
Caixa de dilogo - Create new AVD

24

Book Apostila.indb 24

27/01/2012 15:13:47

G a m e

M o b i l e

( J A V A )

Para criarmos nosso AVD, clique no boto Create AVD e pronto. O resultado
voc confere na figura seguinte:

AVD Criado com sucesso


At aqui aprendemos a instalar e configurar a plataforma Android no Eclipse.
Agora vamos dar nossos primeiros passos desenvolvendo uma aplicao
bsica no Android.

25

Book Apostila.indb 25

27/01/2012 15:13:48

I n s t a l a n d o

i l e

( J A V A )

I n s t a l a n d o

E c l i p s e

A n d r o i d

ANOTAES

e AVD e pronto. O resultado

sso

taforma Android no Eclipse.


envolvendo uma aplicao

26

Book Apostila.indb 26

27/01/2012 15:13:48

D e s e n v o l v
a p l i c a o
G a m e

M o b i l e

C a p t u l o
D e s e n v o l v e n d o

n o s s a

Captulo 04 Dese
o no Android

( J A V A )

0 4

p r i m e i r a

a p l i c a o

n o

A n d r o i d

Depois de tudo configurad


nossas aplicaes no And
Android indo no menu File
conforme figura abaixo. Dep

Criando um n

Aps clicar em Next na fig


seguinte:

Criando um n

Book Apostila.indb 27

27/01/2012 15:13:48

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

Captulo 04 Desenvolvendo nossa primeira aplicao no Android

i c a o

n o

Depois de tudo configurado e instalado, vamos comear a desenvolver


nossas aplicaes no Android. Para isso, vamos criar um novo projeto
Android indo no menu File / New / Other. Selecione o projeto Android
conforme figura abaixo. Depois de selecionar, clique em Next:

Criando um novo projeto Android no Eclipse


Aps clicar em Next na figura acima, ser exibida uma tela conforme figura
seguinte:

Criando um novo projeto Android no Eclipse

28

Book Apostila.indb 28

27/01/2012 15:13:48

G a m e

M o b i l e

( J A V A )

D e s e n v o l v
a p l i c a o

Vamos preencher os campos citados abaixo:


Project name : HelloWorldAndroid
Application name : Hello World Android
Package name: br.com.apphello
Create Activity : AppHello
Min SDK Version : 7
Os campos preenchidos acima devem estar de acordo com a figura abaixo:

Viso ger

Irei descrever a estrutura d


pasta de projeto HelloWo
dentro dela que ficam os
o arquivo AppHello.java s
(Esse pacote tambm u
Android. Vou descrever em
abaixo):
package br.com.apphello;

import android.app.Activity
import android.os.Bundle;

public class AppHello exten


/** Called when the activi
@Override
public void onCreate(Bun
super.onCreate(savedI
setContentView(R.layo
}
}

Criando um novo projeto Android no Eclipse


Depois de tudo preenchido basta clicar no boto Finish e pronto, nosso
projeto foi criado. Em Package Explorer, vamos dar uma olhada na
estrutura do projeto, simplesmente clicando no boto +, s seguir a
figura abaixo. Aproveite e abra o arquivo AppHello.java como tambm
demonstra a figura:

29

Book Apostila.indb 29

27/01/2012 15:13:48

Diferentemente das aplica


representa uma aplicao
(Atividade), e possui com
desse mtodo ele invoca o
mesmo parmetro (o saved
mtodo setContentView,
baseado nos layouts xml.

Dentro da pasta HelloWo


onde ficam armazenados to
do diretrio res existem ci
que descreverei agora:

i l e

( J A V A )

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

acordo com a figura abaixo:

id no Eclipse

o Finish e pronto, nosso


amos dar uma olhada na
o boto +, s seguir a
Hello.java como tambm

Viso geral de uma aplicao Android


Irei descrever a estrutura de um projeto Android. Observem que dentro da
pasta de projeto HelloWorldAndroid existe uma pasta chamada src, e
dentro dela que ficam os cdigos fontes das aplicaes. Observem que
o arquivo AppHello.java se encontra dentro do pacote br.com.apphello
(Esse pacote tambm uma pasta). Esse arquivo a nossa aplicao
Android. Vou descrever em detalhes o arquivo AppHello.java (Veja o cdigo
abaixo):
package br.com.apphello;
import android.app.Activity;
import android.os.Bundle;
public class AppHello extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Diferentemente das aplicaes comuns em Java (J2SE), toda classe que
representa uma aplicao Android deve ser derivada da classe Activity
(Atividade), e possui como mtodo principal a funo onCreate. Dentro
desse mtodo ele invoca o mtodo onCreate da super classe passando
mesmo parmetro (o savedInstanceState), logo aps esse mtodo, vem o
mtodo setContentView, responsvel por exibir a tela da minha aplicao
baseado nos layouts xml. Por padro ele chama o arquivo main.xml.
Dentro da pasta HelloWorldAndroid existe um diretrio chamado res,
onde ficam armazenados todos os recursos utilizados pela aplicao. Dentro
do diretrio res existem cinco diretrios, cada um deles com uma finalidade
que descreverei agora:

30

Book Apostila.indb 30

27/01/2012 15:13:48

G a m e

M o b i l e

( J A V A )

D e s e n v o l v
a p l i c a o

Os diretrios drawable-hdpi,drawable-mdpi e drawable-ldpi.


A partir da verso 1.6 da plataforma Android foram adicionados trs diretrios
responsveis pelo gerenciamento de imagens: drawable-hdpi, drawableldpi, drawable-mdpi. Qual a diferena de um para outro ? Cada um desses
diretrios s ser utilizado de acordo com a resoluo do Android em uso,
ou seja, qual modelo de emulador de voc estiver usando. Por exemplo,
quando voc usa uma resoluo de 480x800 no seu emulador, utilizado
o diretrio drawable-hdpi para buscar a imagem que vai representar o
cone da sua aplicao Android. Se voc for usar uma resoluo 320x480
(que normalmente a resoluo padro do emulador Android), utilizado o
diretrio drawable-mdpi. Se voc usar uma resoluo 240x400, utilizado
o diretrio drawable-ldpi.
O diretrio layout armazena todos os layouts da aplicao Android, que
normalmente so arquivos .xml. Para quem conhece a combinao HTML
+ JavaScript, no Android similar, a combinao de XML + Java, logo,
todos os nossos componentes vo ser adicionados usando tags XML. Por
padro o arquivo de layout o main.xml.
Uma coisa interessante que existe nessa verso (e alguma das anteriores do
SDK) a capacidade de voc ter um preview de como ficar a sua aplicao
antes mesmo de voc rodar o emulador Android, para confirmarmos isso,
simplesmente v no diretrio res/layout e de um duplo clique no arquivo
main.xml, e voc ver o seu preview conforme demonstra a figura seguinte:

Previe
Veja o seu cdigo abaixo:

<?xml version=1.0 encod


<LinearLayout
xmlns
android
android:orientation=vert
android:layout_width=fil
android:layout_height=fi
>
<TextView
android:layout_width=fil
android:layout_height=w
android:text=@string/he
/>
</LinearLayout>

Observe que
aps a prim
LinearLayout, responsve
tela, por padro os compo
android:orientation=ver

Dentro desta tag existe um c


um texto a ser exibido na te
World, AppHello, atravs d
o valor @string/hello equiv
strings.xml, que se encon
agora.

Preview da aplicao Android


Para visualizarmos o cdigo do arquivo main.xml simplesmente clique na
guia main.xml, que se encontra abaixo da seo Views como demonstra
a figura seguinte:

31

Book Apostila.indb 31

27/01/2012 15:13:48

O diretrio values armaze


utilizados por um arquivo .x
ser armazenados no arquiv
um duplo clique no arquiv
desse arquivo conforme mo

i l e

( J A V A )

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

dpi e drawable-ldpi.

m adicionados trs diretrios


drawable-hdpi, drawableara outro ? Cada um desses
oluo do Android em uso,
tiver usando. Por exemplo,
o seu emulador, utilizado
gem que vai representar o
ar uma resoluo 320x480
lador Android), utilizado o
oluo 240x400, utilizado

da aplicao Android, que


nhece a combinao HTML
ao de XML + Java, logo,
dos usando tags XML. Por

(e alguma das anteriores do


como ficar a sua aplicao
d, para confirmarmos isso,
um duplo clique no arquivo
demonstra a figura seguinte:

droid

ml simplesmente clique na
o Views como demonstra

Preview da aplicao Android


Veja o seu cdigo abaixo:
<?xml version=1.0 encoding=utf-8?>
<LinearLayout
xmlns:android=http://schemas.android.com/apk/res/
android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello
/>
</LinearLayout>
Observe que
aps a primeira linha (prlogo xml), existe uma tag chamada
LinearLayout, responsvel por organizar os componentes exibidos na
tela, por padro os componentes so distribudos na vertical pelo atributo
android:orientation=vertical.
Dentro desta tag existe um componente chamado TextView, que representa
um texto a ser exibido na tela que por padro, j vem escrito a frase Hello
World, AppHello, atravs do atributo android:text=@string/hello, onde
o valor @string/hello equivale a uma constante que est definida no arquivo
strings.xml, que se encontra no diretrio values, que iremos descrev-lo
agora.
O diretrio values armazena valores estticos (constantes) que podem ser
utilizados por um arquivo .xml. Normalmente esses valores estticos devem
ser armazenados no arquivo strings.xml. V no diretrio res/values e de
um duplo clique no arquivo strings.xml, e ser mostrado o gerenciador
desse arquivo conforme mostra a figura seguinte:

32

Book Apostila.indb 32

27/01/2012 15:13:48

G a m e

M o b i l e

( J A V A )

D e s e n v o l v
a p l i c a o

Bom, o que nos interessa


clique na seo AndroidMa

<?xml version=1.0 encod


<manifest xmlns:android=h
package=br.com.andro
android:versionCode=1
android:versionName=
<application android:icon
name>
<activity android:name
android:label=@
<intent-filter>
<action android:n
<category android
</intent-filter>
</activity>

Propriedades do arquivo strings.xml


Observe que nas propriedades do atributo hello est atribudo um valor a
ela, que o valor Hello World, AppHello!. Isso quer dizer que l no arquivo
XML no componente TextView, tem uma propriedade chama android:text,
com o valor @string/hello , que equivale a na verdade a string Hello World,
AppHello!. Para ver a sua estrutura , clique na guia strings.xml. O cdigo
desse arquivo igual ao que demonstra o cdigo abaixo:
<?xml version=1.0 encoding=utf-8?>
<resources>
<string name=hello>Hello World, AppHello!</string>
<string name=app_name>Hello World Android</string>
</resources>
Observem que dentro desse arquivo eu declaro um valor esttico chamado
app_name, cujo valor Hello World Android.
Dentro da pasta HelloWorldAndroid existe um arquivo chamado
AndroidManifest.xml Esse arquivo o sistema nervoso de uma aplicao
Android. nele que ficam as definies referentes aplicao. De um duplo
clique nesse arquivo para abri-lo, feito isso ser mostrado o seu gerenciador,
conforme mostra a figura abaixo:

</application>
</manifest>

Observem algumas tags int


android:icon, no qual esp
anteriormente, todas as im
diretrio existe um arquivo
minha aplicao. Logo, par
o valor @drawable/icon .O
deve ser informado sem a e

Observem agora a tag <act


desta tag, eu possuo o atrib
da minha aplicao. O ttulo
no valor esttico app_name
string/app_name.

Como havia falado a aplica


Java + XML. Agora, como
que est escrito em XML ?
fica dentro do pacote gen
interface entre o cdigo Ja
em tempo de execuo um
com esse arquivo. Em breve

OBS: O arquivo R.java


modificado automaticamen

Agora iremos executar no


Configurations, conforme m

33

Book Apostila.indb 33

Propriedades do arquivo AndroidManifest.xml

27/01/2012 15:13:48

i l e

( J A V A )

ings.xml

o est atribudo um valor a


quer dizer que l no arquivo
edade chama android:text,
erdade a string Hello World,
guia strings.xml. O cdigo
o abaixo:

/string>
oid</string>

um valor esttico chamado

e um arquivo chamado
a nervoso de uma aplicao
es aplicao. De um duplo
mostrado o seu gerenciador,

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

Bom, o que nos interessa aqui o cdigo. Para visualizarmos seu cdigo
clique na seo AndroidManifest.xml. Veja seu cdigo abaixo:
<?xml version=1.0 encoding=utf-8?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package=br.com.android
android:versionCode=1
android:versionName=1.0>
<application android:icon=@drawable/icon android:label=@string/app_
name>
<activity android:name=.AppHello
android:label=@string/app_name>
<intent-filter>
<action android:name=android.intent.action.MAIN />
<category android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>
</application>
</manifest>
Observem algumas tags interessantes. A tag <application> possui o atributo
android:icon, no qual especifico o cone da aplicao. Como havia citado
anteriormente, todas as imagens ficam no diretrio drawable e nesse
diretrio existe um arquivo de chamado icon.png que ser o cone da
minha aplicao. Logo, para usar esse cone neste atributo, deve-se passar
o valor @drawable/icon .Observem que quando informamos o cone, ele
deve ser informado sem a extenso (nesse caso, PNG).
Observem agora a tag <activity>, ela define uma atividade (Activity). Dentro
desta tag, eu possuo o atributo chamado android:label que define o ttulo
da minha aplicao. O ttulo que ser exibido o valor que est armazenado
no valor esttico app_name. Isso obtido pela atribuio android:label=@
string/app_name.
Como havia falado a aplicao Android nada mais do que a combinao
Java + XML. Agora, como um cdigo Java vai acessar um componente
que est escrito em XML ? Ah, essa a finalidade do arquivo R.java (que
fica dentro do pacote gen , situado no projeto), ele funciona como uma
interface entre o cdigo Java e o cdigo XML, logo, se eu quiser manipular
em tempo de execuo um componente via Java, tenho que fazer interface
com esse arquivo. Em breve vamos ver como.
OBS: O arquivo R.java no pode ser modificado manualmente. Ele
modificado automaticamente de acordo com as mudanas feitas no projeto.
Agora iremos executar nossa aplicao. Vamos no menu
Configurations, conforme mostra a figura abaixo:

dManifest.xml

Run / Run

34

Book Apostila.indb 34

27/01/2012 15:13:48

G a m e

M o b i l e

( J A V A )

D e s e n v o l v
a p l i c a o

Pra voc que est executan


que o emulador uma esp
a tela do dispositivo e no l
conforme mostra a figura se

Run Configurations
Feito isso, ser aberta uma caixa de dilogo com vrios itens. Clique com
o boto direito do mouse no item Android Application e selecione a opo
New, conforme a figura abaixo:

Criando um novo Android Application


Feito isso, na propriedade Name ao lado digite AppHello. Em Project
selecione o projeto que criamos em clicando no boto Browse, com o
nome de HelloWorldAndroid. E por ltimo, em Launch Action, deixe
marcada a opo Lauch Default Activity. Qualquer dvida siga a figura
abaixo:

Emulado

No incio da execuo do em
na figura acima. Depois vem
cinza em animao. Isso de
da sua mquina. recome
memria e um processado
execuo) para a aplicao
muito simples.

Passado o tempo que cit


tambm algumas mensage
nessa tela abaixo:

Propriedades do Android Application


Agora s clicar em Run e rodar a aplicao. Quando o emulador Android
executado, possivelmente, poder abrir junto com ele uma caixa de dialogo,
conforme a figura abaixo. Normalmente eu desmarco a opo Send usage
statistics to Google e clico em Proceed.

35

Book Apostila.indb 35

Emulado

Caixa de dilogo do Android SDK

27/01/2012 15:13:48

i l e

( J A V A )

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

Pra voc que est executando pela primeira vez o emulador do Android, v
que o emulador uma espcie de SmartPhone. Lado esquerdo ns temos
a tela do dispositivo e no lado direito temos o teclado com suas funes,
conforme mostra a figura seguinte:

om vrios itens. Clique com


cation e selecione a opo

pplication

ite AppHello. Em Project


no boto Browse, com o
em Launch Action, deixe
alquer dvida siga a figura

Emulador do Android em Execuo


No incio da execuo do emulador mostra o ttulo Android, conforme voc v
na figura acima. Depois vem um outro ttulo escrito Android, com um titulo
cinza em animao. Isso demora em torno de 2 a 10 minutos (dependendo
da sua mquina. recomendvel que voc tenha no mnimo 512 MB de
memria e um processador bem rpido para um bom desempenho da
execuo) para a aplicao ser exibida, mesmo sendo essa aplicao algo
muito simples.
Passado o tempo que citei acima, ser mostrada a nossa aplicao e
tambm algumas mensagens, s cancel-las. Quando o emulador chegar
nessa tela abaixo:

pplication

uando o emulador Android


m ele uma caixa de dialogo,
marco a opo Send usage

Emulador do Android em Execuo

id SDK

36

Book Apostila.indb 36

27/01/2012 15:13:48

G a m e

M o b i l e

( J A V A )

D e s e n v o l v
a p l i c a o

Clique no boto redondo com o titulo MENU para desbloquear a tela e a


aplicao continuar a processar at ser carregada com sucesso, conforme
mostra a figura abaixo:

P
Emulador do Android em Execuo
Esse emulador j vem com uma srie de recursos como Navegador,
Aplicaes de demonstrao, Mapas, Lista de contatos e etc.
Se voc neste exato momento fechou o emulador aps a execuo da
aplicao, vou te dizer uma coisa: No era para voc ter feito isso. Se voc
esperou muito tempo para ver essa aplicao em execuo, ao executar
novamente a aplicao, voc vai esperar o mesmo tempo. Ao executar pela
primeira vez o emulador, e caso v executar outros programas, minimize
o emulador ao invs de fechar, pois se voc esperou muito tempo para
executar esse programa, com ele minimizado, ao executar outro programa,
o Eclipse vai fazer uso do emulador j aberto em vez de abrir outro, com
isso a aplicao levar em torno de 7 a 12 segundos em mdia para ser
executada. Nunca esquea isso!
Vamos modificar essa aplicao. Minimize o emulador e vamos abrir o arquivo
main.xml. Na tag TextView que j havia explicado a vocs, possui um
atributo chamado android:text, onde nele defino o ttulo que ser exibido,
modifique agora essa propriedade com o seguinte valor (ttulo), conforme o
cdigo abaixo:
android:text=Fala cara, beleza ???
Feito isso, salve a aplicao e veja seu preview, clicando na seo
Graphical Layout. Veja na figura abaixo:

37

Book Apostila.indb 37

27/01/2012 15:13:48

Vamos fazer mais uma o


novamente o arquivo main.
? Vamos colocar mais dois
no atributo android:text te
ter o ttulo Segunda Fras
cdigo do arquivo main.xm

<?xml version=1.0 encod


<LinearLayout
xmlns
android
android:orientation=vert
android:layout_width=fil
android:layout_height=fi
>
<TextView
android:layout_width=fil
android:layout_height=w
android:text=Primeira Fr
/>

<TextView
android:layout_width=fil
android:layout_height=w
android:text=Segunda F
/>

<TextView
android:layout_width=fil
android:layout_height=w
android:text=Terceira Fra
/>
</LinearLayout>

i l e

( J A V A )

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

para desbloquear a tela e a


da com sucesso, conforme

xecuo

ecursos como Navegador,


ontatos e etc.

ador aps a execuo da


voc ter feito isso. Se voc
em execuo, ao executar
mo tempo. Ao executar pela
utros programas, minimize
esperou muito tempo para
o executar outro programa,
em vez de abrir outro, com
gundos em mdia para ser

ador e vamos abrir o arquivo


licado a vocs, possui um
no o ttulo que ser exibido,
nte valor (ttulo), conforme o

eview, clicando na seo

Preview da aplicao
Vamos fazer mais uma outra modificao na nossa aplicao. Abra
novamente o arquivo main.xml, observe que ele possui um TextView certo
? Vamos colocar mais dois componentes TextView, a primeira TextView,
no atributo android:text ter o ttulo Primeira frase, o segundo TextView
ter o ttulo Segunda Frase e assim sucessivamente. Veja como ficar o
cdigo do arquivo main.xml :
<?xml version=1.0 encoding=utf-8?>
<LinearLayout
xmlns:android=http://schemas.android.com/apk/res/
android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Primeira Frase.
/>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Segunda Frase
/>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Terceira Frase???
/>
</LinearLayout>

38

Book Apostila.indb 38

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

Feito isso, salve o arquivo e veja seu preview, como demonstra a figura
abaixo:

Preview da aplicao
E ai, est entendo aos poucos como se faz aplicaes Android ? Com
certeza que sim!
Como podemos ver nessa verso do Android, ele j oferece um utilitrio que
permite a criao de aplicaes de forma rpida, simplesmente arrastando
e soltando os componentes. Isso acelera o processo de desenvolvimento de
nossas aplicaes (jogos).
Como podemos ver, para que possamos desenvolver nossas aplicaes no
Google Android preciso o conhecimento da linguagem Java . No prximo
captulo, vamos conhecer a linguagem Java e toda sua estrutura, para que
possamos entender daqui pra frente o desenvolvimento e o cdigo de toda
e qualquer aplicao desenvolvida nessa linguagem.

39

Book Apostila.indb 39

27/01/2012 15:13:49

D e s e n v o l v
a p l i c a o

i l e

( J A V A )

D e s e n v o l v e n d o
n o s s a
a p l i c a o
n o
A n d r o i d

p r i m e i r a

ANOTAES

, como demonstra a figura

aplicaes Android ? Com

e j oferece um utilitrio que


a, simplesmente arrastando
sso de desenvolvimento de

volver nossas aplicaes no


guagem Java . No prximo
oda sua estrutura, para que
vimento e o cdigo de toda
gem.

40

Book Apostila.indb 40

27/01/2012 15:13:49

F u n d a m e n t

G a m e

M o b i l e

C a p t u l o
F u n d a m e n t o s

d a

Captulo 05 Fund

( J A V A )

Como j vimos acima, toda a


Java. de grande importn
a sua essncia para que po
plataforma Google Android.
linguagem Java.

0 5

L i n g u a g e m

J a v a

5.1) Sobre a linguagem

A histria da linguagem Jav


Microsystems iniciou um p
tinha como objetivo anteci

No vero de 1992 o grupo


seria a idia inicial. O prot
que consistia em um control
com a habilidade de contro
desenvolvido em linguagem

O prximo passo era enco


que uma boa idia seria
com o equipamento mas in
demanda bem como as e
negcio. A idia que o *7 te
interativos e tambm na
interagir com a emissora
era algo muito visionrio e e
cabo tinham capacidade
idia certa mas na poca er

Quando surgiu a Internet, f


preciso construir uma nov
Com isso James Gosling ad
Internet, batizando-a de Jav

As aplicaes Java inicial


Internet (aplicaes chama
o tempo e hoje j podemo
aplicaes de grande port
aplicaes para dispositivo

5.2 Caractersticas da

Vamos ver agora algumas c

- WORA (Write Once r


linguagem Java so com
operacional (Windows, Linu
Mquina Virtual Java (JVM

Book Apostila.indb 41

27/01/2012 15:13:49

J a v a

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

Captulo 05 Fundamentos da Linguagem Java


Como j vimos acima, toda aplicao em Android desenvolvida na linguagem
Java. de grande importncia o conhecimento da linguagem Java e toda
a sua essncia para que possamos construir os jogos desenvolvidos para a
plataforma Google Android. Veremos aqui todos os conceitos essenciais da
linguagem Java.

5.1) Sobre a linguagem Java


A histria da linguagem Java comeou em 1991, quando um grupo da Sun
Microsystems iniciou um projeto chamado Green (Green Project), que
tinha como objetivo antecipar a prxima onda do mundo digital.
No vero de 1992 o grupo construiu uma demonstrao funcional do que
seria a idia inicial. O prottipo se chamava *7 (pronuncia-se StarSeven),
que consistia em um controle remoto com uma interface grfica touchscreen
com a habilidade de controlar diversos dispositivos e aplicaes. O *7 foi
desenvolvido em linguagem Oak (predecessora da linguagem Java).
O prximo passo era encontrar um mercado para o *7. A equipe achava
que uma boa idia seria controlar televises e vdeo por demanda
com o equipamento mas infelizmente era muito cedo para que o vdeo por
demanda bem como as empresas de TV a cabo pudessem viabilizar o
negcio. A idia que o *7 tentava vender, hoje j realidade em programas
interativos e tambm na televiso digital. Permitir ao telespectador
interagir com a emissora e com a programao em uma grande rede,
era algo muito visionrio e estava muito longe do que as empresas de TV a
cabo tinham capacidade de entender e comprar, ou seja, eles tiveram a
idia certa mas na poca errada.
Quando surgiu a Internet, formou-se uma nova rede e para o *7 j no era
preciso construir uma nova infra-estrutura pois a rede j estava pronta.
Com isso James Gosling adaptou a linguagem de programao Oak para a
Internet, batizando-a de Java.
As aplicaes Java inicialmente eram executadas nos navegadores de
Internet (aplicaes chamadas de applets). A tecnologia Java evoluiu com
o tempo e hoje j podemos desenvolver aplicaes para desktop (J2SE),
aplicaes de grande porte (J2EE) , pginas web (JSP E JSF) e tambm
aplicaes para dispositivos mveis (J2ME e agora Android).

5.2 Caractersticas da linguagem Java


Vamos ver agora algumas caractersticas essenciais da linguagem Java.
- WORA (Write Once run Anywhere) : Os programas escritos na
linguagem Java so compilados e podem rodar em qualquer sistema
operacional (Windows, Linux, MAC) desde que o mesmo tenha instalado a
Mquina Virtual Java (JVM Java Virtual Machine). A Mquina Virtual Java

Book Apostila.indb 42

42

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

uma plataforma que executa as aplicaes desenvolvidas e compiladas


na linguagem Java, visto que, um programa compilado em Java consiste
em um Byte Code (arquivo de extenso .class), que s interpretado pela
Mquina Virtual Java.


- atributos : Atributo
que pertence uma classe.

- Programao Orientada a Objetos : A linguagem Java puramente


Orientada a Objetos. Mas, o que significa uma linguagem Orientada a
Objetos ? Precisamos entender primeiramente que Programao Orientada
a Objetos um Paradigma de linguagem de programao. Paradigma de
linguagem de programao um conjunto de caracterstica que define uma
ou um grupo de linguagens de programao. Veja abaixo a hierarquia do
Paradigma de Linguagens de Programao:


- mtodos : Mtodo
que pertence uma classe.

Objeto: Objeto nada mais


memria. Um objeto tamb

- atributos : Atributo

- mtodos : Mtodo

Herana: Herana uma


atributos e mtodos de outr

Polimorfismo: Polimorfism
determinado mtodo (sabe
classes distintas) de acordo

5.3 Comeando a prog

A partir de agora vamos co


que possamos a construir n
antes de continuarmos com
linguagem Java voltado pa
possamos acompanhar pas
Sintaxe:

public class <nome da clas


}
O Paradigma de Linguagem de Programao est dividido em Paradigma
Imperativo e Paradigma Declarativo. Vamos nos concentrar somente no
Paradigma Imperativo, que est divido em Programao Estruturada,
Programao Orientada a Objetos e Programao Concorrente.
O Paradigma imperativo um paradigma da linguagem de programao
de diz como e quais comandos devem ser executados para que um
determinado objetivo possa ser alcanado.
A Programao Estruturada representa um modelo no qual as instrues
de uma linguagem so executadas seqencialmente , sabendo-se que cada
uma delas precisam estar dentro de seus respectivos blocos de comandos
(while if e etc).

Observe no cdigo acima


(que consiste em uma cla
em classes. Dentro delas p
demonstrar o uso da lingu
J2SE, toda classe que prec
funo main (diferente do
abaixo:
Sintaxe:

public class <nome da clas

A Programao Orientada a Objetos uma evoluo da Programao


Estruturada, onde os objetos so considerados unidades bsicas de dados
e aes de um programa. Vou descrever aqui os conceitos essenciais da
programao orientada a objetos:
Classe: Classe nada mais de do que uma abstrao ou projeto de como um
objeto feito. Toda classe constitua por:

43

Book Apostila.indb 43

27/01/2012 15:13:49

public static void main(Stri


}
}

i l e

( J A V A )

esenvolvidas e compiladas
ompilado em Java consiste
, que s interpretado pela

guagem Java puramente


ma linguagem Orientada a
ue Programao Orientada
rogramao. Paradigma de
racterstica que define uma
Veja abaixo a hierarquia do

st dividido em Paradigma
nos concentrar somente no
Programao Estruturada,
ao Concorrente.

inguagem de programao
executados para que um

odelo no qual as instrues


ente , sabendo-se que cada
ctivos blocos de comandos

F u n d a m e n t o s

L i n g u a g e m

J a v a


- atributos : Atributos so variveis (veremos sobre isso mais adiante)
que pertence uma classe.

- mtodos : Mtodos so funes (veremos sobre isso mais adiante)
que pertence uma classe.
Objeto: Objeto nada mais do que uma instncia da classe carregada em
memria. Um objeto tambm constitudo por:

- atributos : Atributos so variveis que pertence uma objeto.

- mtodos : Mtodos so funes que pertence uma objeto.

Herana: Herana uma tcnica onde uma classe (subclasse) herda


atributos e mtodos de outra classe (super classe).
Polimorfismo: Polimorfismo consiste no comportamento mltiplo de um
determinado mtodo (sabendo-se que esse mtodo se encontra em vrias
classes distintas) de acordo com a instncia da classe carregada sobre ele.

5.3 Comeando a programar em Java


A partir de agora vamos conhecer a linguagem Java e suas estruturas para
que possamos a construir nossos jogos na plataforma Google Android. Mas
antes de continuarmos com a plataforma Android, vamos programar com a
linguagem Java voltado para a plataforma J2SE (Para Desktop), para que
possamos acompanhar passo a passo a execuo (EM CONSOLE) .
Sintaxe:
public class <nome da classe> {
}
Observe no cdigo acima que possumos uma estrutura chamada class
(que consiste em uma classe), pois toda aplicao Java fica estruturada
em classes. Dentro delas podemos ter atributos e mtodos. Como iremos
demonstrar o uso da linguagem Java voltado para o desenvolvimento de
J2SE, toda classe que precisa ser executada tem como mtodo principal a
funo main (diferente do mtodo onCreate do Android). Confira na sintaxe
abaixo:
Sintaxe:
public class <nome da classe> {

evoluo da Programao
unidades bsicas de dados
os conceitos essenciais da

o ou projeto de como um

d a

public static void main(String arg[]) {


}
}

44

Book Apostila.indb 44

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

Vejamos um exemplo:

public class Hello {


public static void main(String arg[]) {
System.out.println(Hello World);
}
}
Dentro do mtodo main existe uma instruo chamada System.out.
println, que tem por finalidade mostrar dados na tela. Neste caso o que o
mtodo mostrar na tela uma mensagem chamada Hello World.
Vamos ver esse exemplo acima rodando no Eclipse. Com o Eclipse aberto
vamos no menu File / New / Java Project. O resultado voc confere na
figura seguinte:

Proje

Agora vamos criar uma nov


direito do mouse sobre o p
isso ser mostrado um form

Java Project
Em Project name especificamos o nome do nosso projeto. Vamos chamlo de AplicacoesJava e em seguida, vamos clicar no boto Finish. Feito
isso, o projeto ser criado, como demonstra a figura abaixo:

Criando um

45

Book Apostila.indb 45

27/01/2012 15:13:49

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

o chamada System.out.
na tela. Neste caso o que o
mada Hello World.

ipse. Com o Eclipse aberto


O resultado voc confere na

Projeto criado com sucesso


Agora vamos criar uma nova classe para esse projeto. Clique com o boto
direito do mouse sobre o projeto criado e vamos em New/Class. Feito
isso ser mostrado um formulrio como demonstra a figura abaixo:

sso projeto. Vamos chamcar no boto Finish. Feito


gura abaixo:

Criando uma nova classe (New Java Class)

46

Book Apostila.indb 46

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

Em Name definimos o nome da nossa classe, vamos cham-la de


Exemplo1 e em seguida marcaremos a opo public static void
main(String[] args). Feito isso, vamos clicar no boto Finish para que a
classe seja criada.

Feito isso, o programa ser


execuo na figura abaixo:

Voc ver aps a criao da classe seu cdigo para edio, conforme mostra
a figura abaixo:

Classe criada com sucesso


Agora dentro do mtodo main, vamos colocar a seguinte linha de cdigo:
System.out.println(Hello World);
O resultado dessa alterao voc confere na figura abaixo:

Ap

5.4 Dados e informa

Toda aplicao de compu


dados e informaes. V
informao:
Dado: Dado nada mais
computado e etc.

Cdigo inserida na classe


Vamos agora executar a nossa aplicao. Para executarmos nossa aplicao
basta irmos no menu Run/Run As/Java Application, como demonstra
a figura abaixo:

Informao: o dado que

Ex: Fazer um programa q


programa dever mostrar a

Dado: As duas notas de um

Informao: A mdia do a

5.5 Variveis e mem


Fazendo uma analogia

Rodando a aplicao

Imaginemos que a memria

47

Book Apostila.indb 47

27/01/2012 15:13:49

i l e

( J A V A )

asse, vamos cham-la de


opo public static void
boto Finish para que a

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

Feito isso, o programa ser executado com sucesso. Veja o resultado dessa
execuo na figura abaixo:

ra edio, conforme mostra

esso

a seguinte linha de cdigo:

ura abaixo:

sse

xecutarmos nossa aplicao


plication, como demonstra

Aplicao em Execuo

5.4 Dados e informaes


Toda aplicao de computador (como um jogo), sempre trabalha com
dados e informaes. Vamos aprender agora o conceito de dado e
informao:
Dado: Dado nada mais do que um fato a ser registrado, processado,
computado e etc.
Informao: o dado que foi processado.
Ex: Fazer um programa que leia duas notas de um aluno, e no final, o
programa dever mostrar a mdia desse aluno.
Dado: As duas notas de um aluno.
Informao: A mdia do aluno.

5.5 Variveis e memria


Fazendo uma analogia
Imaginemos que a memria seja um armrio com vrias gavetas, e que cada

Book Apostila.indb 48

48

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

gaveta possui um rtulo (nome) que em determinado momento guarda um


contedo (informao).

F u n d a m e n t

Exemplo:
String nome_aluno;
float nota1, nota2, media;
int peso1, peso2;

public class Classe {

public static void main(St


{
String nome;
float nota1, nota2;
int peso1, peso2;

Armrio com vrias gavetas (simulando variveis)


Podemos concluir que:
Varivel um endereo de memria que pode ter seu contedo alterado a
qualquer momento durante a execuo do programa.

}}

Como foi explicado, cada v


so guardadas informaes
o nome da varivel.

Tipos de dados
Cada dado armazenado na memria possui um tipo. Os tipos de dados mais
comuns em Java so:
int : Armazena valores nmeros inteiros de 32 bits na faixa de -2147483648
at 2147483647 .
long : Armazena valores nmeros inteiros de 64 bits na faixa de
-9223372036854775808 at 9223372036854775807.

5.7 Manipulando var

5.7.1 Comando de atribu

Permite que voc atribua u


durante a execuo. Veja su

byte : Armazena valores nmeros inteiros de 8 bits na faixa de -128 at 127 .


short : Armazena valores nmeros inteiros de 16 bits na faixa de -32768 at
32767.

<varivel> = <valor>;

float : Armazena valores nmeros de ponto flutuante de 32 bits na faixa de


-3.4E38 at 3.4E38 .

Exemplos:

double : Armazena valores nmeros de ponto flutuante de 64 bits na faixa


de -1.7E308 at 1.7E308 .
char : Armazena valores alfanumricos de 16 bits de ponto na faixa de 0 at
65535 .

Nome = Joo Pedro


Media = 7.5
opcao = a
ValorMaximo = 100

String : Armazena uma cadeia de caracteres.


PodeFechar = true

boolean : Armazena valores lgicos true e false.

5.6 Declarando variveis


Toda varivel antes de ser utilizada no programa precisa ser antes declarada.
Vamos ver como se declarar uma varivel :

49

Book Apostila.indb 49

<tipo> <varivel1> [, <varivel2>,....,<variveln> ];

27/01/2012 15:13:49

5.7.2 Comando de leitura

i l e

( J A V A )

inado momento guarda um

F u n d a m e n t o s

L i n g u a g e m

J a v a

Exemplo:
String nome_aluno;
float nota1, nota2, media;
int peso1, peso2;

public class Classe {


public static void main(String arg[])
{
String nome;
float nota1, nota2;
int peso1, peso2;

ando variveis)

er seu contedo alterado a


ama.

d a

}}
Como foi explicado, cada varivel como se fosse uma gaveta onde nela
so guardadas informaes e cada gaveta possui um rtulo, identificando
o nome da varivel.

po. Os tipos de dados mais

5.7 Manipulando variveis

ts na faixa de -2147483648

de 64 bits na faixa de
5807.

5.7.1 Comando de atribuio


Permite que voc atribua um valor a uma varivel em um dado momento
durante a execuo. Veja sua sintaxe:

ts na faixa de -128 at 127 .

6 bits na faixa de -32768 at

<varivel> = <valor>;

uante de 32 bits na faixa de

Exemplos:

flutuante de 64 bits na faixa

s de ponto na faixa de 0 at

ecisa ser antes declarada.

Nome = Joo Pedro


Media = 7.5
opcao = a
ValorMaximo = 100
PodeFechar = true

5.7.2 Comando de leitura de dados via teclado

];

50

Book Apostila.indb 50

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

A classe Scanner
A classe Scanner uma classe da linguagem Java que permite fazer a
entrada de dados via teclado. Ela se encontra dentro do pacote java.util
Vamos conhecer as rotinas disponveis :

F u n d a m e n t

programa fazer uso do p


vrias classes disponvel on
por ler dados via teclado.
import java.util.*;

nextInt(): L do teclado valores numricos inteiros. Os dados retornados


por essa funo devem ser atribudas a uma varivel do tipo int.
nextLong(): L do teclado valores numricos inteiros. Os dados retornados
por essa funo devem ser atribudas a uma varivel do tipo long.

Observe que dentro da fun


varivel do tipo String cham
na linha seguinte:

nextByte(): L do teclado valores numricos inteiros. Os dados retornados


por essa funo devem ser atribudas a uma varivel do tipo byte.

String nome_jogador;

readShort(): L do teclado valores numricos inteiros. Os dados retornados


por essa funo devem ser atribudas a uma varivel do tipo short.

Depois crio uma instncia


conforme voc confere na l

nextFloat(): L do teclado valores numricos de ponto flutuante. Os dados


retornados por essa funo devem ser atribudas a uma varivel do tipo
float.

Scanner teclado = new Sca

nextDouble(): L do teclado valores numricos de ponto flutuante. Os


dados retornados por essa funo devem ser atribudas a uma varivel do
tipo double.
nextLine(): L do teclado valores alfanumricos. Os dados retornados por
essa funo devem ser atribudas a uma varivel do tipo String.

Depois, mostrado na tela


do jogador, atravs do co
abaixo:
System.out.println(Digite o

Na linha seguinte, feito o


instncia da classe est atri
ler dados do teclado. Aps
varivel nome_jogador, co

Exemplo:

nome_jogador = teclado.ne
Para este exemplo, vamos criar uma outra classe dentro do nosso projeto
chamada LeituraDados. Para isso, basta seguir as instrues j passadas.
Depois de criar a classe, coloque o cdigo conforme mostrado abaixo:

Finalmente, mostrado na
conforme voc confere aba

System.out.println(O nome
import java.util.*;
public class LeituraDados {

Observe que, para mostrar


das aspas. Vamos entend
isso:

public static void main(String arg[]) {


String nome_jogador;

System.out.println(O nome

Scanner teclado = new Scanner(System.in);

Ao executar o programa sai

System.out.println(Digite o nome do jogador);

O nome do jogador : nom


nome_jogador = teclado.nextLine();
System.out.println(O nome do jogador : + nome_jogador);

Porque isso ? Porque tudo o


escreveu, e como precisam
POR REGRA, estar fora da
indica concatenao, ou se
o contedo da varivel.

Vamos analisar o cdigo acima. Observe que a primeira instruo do nosso

Veja o resultado da execu

51

Book Apostila.indb 51

27/01/2012 15:13:49

i l e

( J A V A )

Java que permite fazer a


dentro do pacote java.util

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

programa fazer uso do pacote java.util.*, dentro desse pacote existem


vrias classes disponvel onde faremos uso da classe Scanner, responsvel
por ler dados via teclado.
import java.util.*;

eiros. Os dados retornados


vel do tipo int.

eiros. Os dados retornados


vel do tipo long.

Observe que dentro da funo main, a primeira linha de cdigo cria uma
varivel do tipo String chamada nome_jogador, conforme voc pode ver
na linha seguinte:

eiros. Os dados retornados


vel do tipo byte.

String nome_jogador;

teiros. Os dados retornados


vel do tipo short.

Depois crio uma instncia da classe Scanner e atribuo ao objeto teclado,


conforme voc confere na linha abaixo:

e ponto flutuante. Os dados


das a uma varivel do tipo

Scanner teclado = new Scanner(System.in);

os de ponto flutuante. Os
tribudas a uma varivel do

s. Os dados retornados por


do tipo String.

se dentro do nosso projeto


r as instrues j passadas.
orme mostrado abaixo:

Depois, mostrado na tela um texto informando que o usurio digite o nome


do jogador, atravs do comando System.out.println, conforme voc v
abaixo:
System.out.println(Digite o nome do jogador);
Na linha seguinte, feito o uso do mtodo nextLine da classe Scanner (cujo
instncia da classe est atribuda a varivel teclado), que tem a finalidade de
ler dados do teclado. Aps a leitura dos dados, esse contedo atribudo a
varivel nome_jogador, conforme voc confere abaixo:
nome_jogador = teclado.nextLine();
Finalmente, mostrado na tela o nome do jogador digitado pelo usurio,
conforme voc confere abaixo:
System.out.println(O nome do jogador : + nome_jogador);
Observe que, para mostrar o contedo de uma varivel ela deve estar fora
das aspas. Vamos entender melhor: se escrevesse no comando println
isso:
System.out.println(O nome do jogador : nome_jogador);
Ao executar o programa sairia assim:

);
O nome do jogador : nome_jogador

nome_jogador);

Porque isso ? Porque tudo o que escreve dentro das aspas sair como voc
escreveu, e como precisamos mostrar o contedo da varivel , ela precisa,
POR REGRA, estar fora das aspas junto com um smbolo de +, que
indica concatenao, ou seja, esse smbolo junta o contedo da string com
o contedo da varivel.

primeira instruo do nosso

Veja o resultado da execuo dessa aplicao na figura abaixo:

Book Apostila.indb 52

52

27/01/2012 15:13:49

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

5.8 Operadores aritm

Vamos conhecer agora os


Java. Confira na tabela aba

Resultado da execuo
Vamos agora modificar o programa que fizemos acima para ler tambm a
idade do jogador. Confira o cdigo da modificao abaixo:
import java.util.*;
public class LeituraDados {
public static void main(String arg[]) {
String nome_jogador;
int idade;

Exemplo

Scanner teclado = new Scanner(System.in);


System.out.println(Digite o nome do jogador);

Media = ((nota1 + nota2) / )2

nome_jogador = teclado.nextLine();

AreaTriangulo = ((base * altu

System.out.println(Digite a idade do jogador);

C = (F 32) * (5 / 9);

idade = teclado.nextInt();

Bom, para o prximo e


MediaPontuacao, que con

System.out.println(O nome do jogador : + nome_jogador);


System.out.println(A idade do jogador : + idade);

import java.util.*;

public class MediaPontuaca

}
}

public static void main(Stri

Praticamente o cdigo desse programa similar ao do programa anterior. O


que muda que nesse programa solicitado ao usurio que ele entre com o
nome a idade do jogador. O resultado da execuo desse programa voc
confere na figura abaixo:

String nome_jogador;
double ponto1, ponto2,
Scanner teclado = new

System.out.println(O no
nome_jogador = teclado
System.out.println(Qua
ponto1= teclado.nextInt

System.out.println(Qua
ponto2= teclado.nextInt

media = ((ponto1 + pon


System.out.println(A m
: + media);

Resultado da execuo

}}

53

Book Apostila.indb 53

27/01/2012 15:13:50

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

5.8 Operadores aritmticos


Vamos conhecer agora os operadores aritmticos existentes na linguagem
Java. Confira na tabela abaixo:

s acima para ler tambm a


o abaixo:

nome_jogador);
dade);

Exemplo
Media = ((nota1 + nota2) / )2;
AreaTriangulo = ((base * altura) / 2);
C = (F 32) * (5 / 9);
Bom, para o prximo exemplo vamos criar uma classe chamada
MediaPontuacao, que conter o cdigo conforme abaixo:
import java.util.*;
public class MediaPontuacao {
public static void main(String arg[]) {

ao do programa anterior. O
usurio que ele entre com o
uo desse programa voc

String nome_jogador;
double ponto1, ponto2, media;
Scanner teclado = new Scanner(System.in);
System.out.println(O nome do jogador:);
nome_jogador = teclado.nextLine();
System.out.println(Quantos pontos ele fez na 1 fase:);
ponto1= teclado.nextInt();
System.out.println(Quantos pontos ele fez na 2 fase:);
ponto2= teclado.nextInt();
media = ((ponto1 + ponto2) / 2);
System.out.println(A mdia de pontos do jogador + nome_jogador +
: + media);
}}

Book Apostila.indb 54

54

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

Execute o programa. O resultado dessa execuo voc confere na figura


abaixo:

F u n d a m e n t

int numero[];
numero = new int[3];

A instruo seguinte, arma


que no caso, tem que ser
o segundo ndice um,
tiver um vetor para armaz
ser indexados de 0 9. Se
significa que eles precisam
para armazenar n nmero
instrues seguintes so ar
vetor os respectivos valores
numero[0] = 23;
numero[1] = 59;
numero[2] = 68;

Resultado da execuo

5.9 Arrays

Depois, mostro os valores im

Array nada mais do que uma estrutura de dados homognea, que consiste
em uma varivel que armazena vrios valores de um mesmo tipo.
Sintaxe:

System.out.println(numero[0
System.out.println(numero[1
System.out.println(numero[2

Execute o programa. O resu

<tipo> <varivel>[];

Exemplo:
int numero[];
Vamos ver um exerccio que demonstre o uso de vetores. Crie uma classe
chamada Vetor e coloque o cdigo abaixo:
public class Vetor {

5.10 Classes empac

public static void main(String arg[]) {

A linguagem Java oferece


float, short, byte, boolean e
uma classe que representa
Classes Empacotadoras.

int numero[];
numero = new int[3];
numero[0] = 23;
numero[1] = 59;
numero[2] = 68;
System.out.println(numero[0]);
System.out.println(numero[1]);
System.out.println(numero[2]);
}}
Vamos entender o cdigo acima. Observe que eu declarei um vetor (array)
chamado numero do tipo inteiro e em seguida crio a sua instncia, para pode
armazenar somente 3 nmeros, conforme demonstrado abaixo:

55

Book Apostila.indb 55

Re

27/01/2012 15:13:50

i l e

( J A V A )

o voc confere na figura

s homognea, que consiste


um mesmo tipo.

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

int numero[];
numero = new int[3];
A instruo seguinte, armazena o nmero 23 no primeiro ndice do array,
que no caso, tem que ser zero. Em um array , todo primeiro ndice zero,
o segundo ndice um, e assim sucessivamente. Isso que dizer se eu
tiver um vetor para armazenar dez nmeros, significa que eles precisam
ser indexados de 0 9. Se eu tiver um vetor para armazenar 99 nmeros,
significa que eles precisam ser indexados de 0 98. Logo se tiver um array
para armazenar n nmeros , eles precisam ser indexados de 0 (n-1). Nas
instrues seguintes so armazenados no segundo e no terceiro ndice do
vetor os respectivos valores 59 e 68, conforme e mostrado abaixo:
numero[0] = 23;
numero[1] = 59;
numero[2] = 68;
Depois, mostro os valores impressos na tela, conforme mostrado abaixo:
System.out.println(numero[0]);
System.out.println(numero[1]);
System.out.println(numero[2]);
Execute o programa. O resultado voc confere na figura abaixo:

de vetores. Crie uma classe

Resultado da execuo

5.10 Classes empacotadoras


A linguagem Java oferece 8 tipos primitivos de dados : int, long, double,
float, short, byte, boolean e char. Para cada tipo primitivo de dado, existe
uma classe que representa e manipula dados desse tipo, essas classes so
Classes Empacotadoras. Veja a tabela abaixo:

eu declarei um vetor (array)


o a sua instncia, para pode
monstrado abaixo:

56

Book Apostila.indb 56

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

Observe que este tipo pode ser manipulado, normalmente, como se fosse
um tipo primitivo sem problemas.

Como podemos ver na ta


(exceto o tipo Character) p
String para o seu respectivo

Exemplo:
public class ClasseEmpacotadora {
public static void main(String arg[]) {
Integer numero = new Integer(12);
System.out.println(numero);
}
}

Vamos analisar o cdigo do programa acima. Na primeira eu declaro uma


varivel chamada numero do tipo Integer e depois ela recebe uma instncia
da classe Integer com o valor inicial 12, conforme mostrado abaixo:

import java.util.*;
public class Conversao {

Integer numero = new Integer(12);

public static void main(Stri

String strnum;
int numero;
Scanner teclado = new S

UMA REGRA: Toda classe antes de ser usada , precisa antes ser instanciada.
Por ser o tipo Integer uma classe e no um tipo primitivo, como int, ela no
alocada automaticamente na memria. Por isso precisamos fazer uso da
palavra chave new, cuja finalidade instanciar uma classe alocando para
ela um espao na memria.

System.out.println(Digit

strnum = teclado.nextLin

No final, mostrado na tela o valor da varivel nmero, que ser 12, atravs
da instruo abaixo:

numero = Integer.parseIn

System.out.println(nume

System.out.println(numero);
5.10.1 Mtodos de converso

}
}

As classes empacotadoras possuem um mtodo para converso de tipos.


Por exemplo, vamos supor que voc entrasse com um valor numrico no
formato String e que, voc precisasse converter esse tipo String para int.
Como voc faria isso ?

Vamos analisar o cdigo a


uma chamada strnum, p
outra chamada numero do

Como havia explicado, cada classe possui um mtodo de converso, vamos


conhec-los:

Observe que na linha onde


nextLine() que l uma Strin
nesta linha somente nm
instruo anterior. O conted
mostrado abaixo:

numero = Integer.parseInt(s

Como preciso retornar o co


preciso de um mtodo que c
isso, precisamos fazer uso
Observe na instruo abaix

57

Book Apostila.indb 57

27/01/2012 15:13:50

i l e

( J A V A )

ormalmente, como se fosse

Na primeira eu declaro uma


is ela recebe uma instncia
e mostrado abaixo:

F u n d a m e n t o s

J a v a

import java.util.*;
public class Conversao {
public static void main(String arg[]) {
String strnum;
int numero;
Scanner teclado = new Scanner(System.in);
System.out.println(Digite um nmero);
strnum = teclado.nextLine();

mero, que ser 12, atravs

todo de converso, vamos

L i n g u a g e m

Como podemos ver na tabela acima, todas as classes empacotadoras


(exceto o tipo Character) possuem um mtodo de converso de um tipo
String para o seu respectivo em tipo primitivo. Vamos ver um exemplo abaixo:

cisa antes ser instanciada.


primitivo, como int, ela no
so precisamos fazer uso da
uma classe alocando para

o para converso de tipos.


com um valor numrico no
er esse tipo String para int.

d a

numero = Integer.parseInt(strnum);
System.out.println(numero);
}
}
Vamos analisar o cdigo acima. Observe que declaramos duas variveis,
uma chamada strnum, para armazenar um nmero no formato String e
outra chamada numero do tipo int.
Observe que na linha onde feita a leitura de um nmero, utilizado o mtodo
nextLine() que l uma String do teclado, mas, o que tem que ser digitado
nesta linha somente nmeros, conforme a mensagem exibida atravs da
instruo anterior. O contedo retornado para a varivel strnum, conforme
mostrado abaixo:
numero = Integer.parseInt(strnum);
Como preciso retornar o contedo dessa varivel para a varivel numero,
preciso de um mtodo que converta dados do tipo String para o tipo int. Para
isso, precisamos fazer uso do mtodo parseInt, existente na classe Integer.
Observe na instruo abaixo que a varivel numero recebe o contedo da

58

Book Apostila.indb 58

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

varivel strnum convertido para inteiro.


numero = Integer.parseInt(strnum);
No final, mostro o valor da varivel nmero, conforme a instruo abaixo:

O que acontece no cdigo


uma expresso (int) inform
inteiro.

System.out.println(numero);

Vamos ver outro exemplo d


public class Soma {

public static void main(Stri

5.11 Converso entre tipos primitivos

short num1,num2,soma;

possvel a realizao de converses entre tipos primitivos sem o uso de


classes empacotadoras. Vamos aprender como fazer isso. Analise o seguinte
cdigo abaixo:

num1 = 8;
num2 = 10;
soma = num1 + num2;

public class Conversao {

}
}

public static void main(String arg[]) {


float valorfloat;
int valorint;

Declaramos trs variveis d


num2 e soma. As variv
como atribuio os valore
atribuio da soma de nu
varivel soma. Por incrve

valorfloat = 12;
valorint = valorfloat;

Espere ai, as variveis so


na soma ? Vou explicar:

}
}

Aparentemente o cdigo acima parece est certo, porm, possui um erro.


Se observarmos acima criamos duas variveis, uma do tipo int e outra do
tipo float. A varivel do tipo float recebe um valor nmerico como atribuio.
Em seguida, no cdigo destacado em negrito, fao uma atribuio do valor
numrico que est na varivel valorfloat para a varivel valorint. Ai est
o erro.
Uma varivel do tipo float pode receber valores que esto armazenadas em
uma varivel do tipo int porm, ao contrrio isso j no permitido.
Como ento fazer uma atribuio de um valor float para um valor do tipo int
? Utilizando cast (converso).
Como fazer um cast ? Veja a sintaxe abaixo:

soma = ((short) (num1 + num

Vamos ver um outro exemp


public class Soma {

public static void main(Stri


float num1, num2;

(<tipo>) <valor>

num1 = 7;

Como aplicaramos o cast no cdigo destacado em negrito ? Desta forma:


valorint = (int) valorfloat;

num2 = 7.5;
}

59

Book Apostila.indb 59

Qualquer expresso em qu
cdigo destacado em verm
acima, em um tipo int (inteir
variveis do tipo short (um ti
retornada em um tipo int(
muita gente no sabe.
Ento como retornar o resu
Veja como ficaria o cdigo:

27/01/2012 15:13:50

i l e

( J A V A )

orme a instruo abaixo:

F u n d a m e n t o s

L i n g u a g e m

Vamos ver outro exemplo de converso. Analise o seguinte cdigo abaixo:


public class Soma {
public static void main(String arg[]) {
short num1,num2,soma;

os primitivos sem o uso de


azer isso. Analise o seguinte

num1 = 8;
num2 = 10;
soma = num1 + num2;
}
}
Declaramos trs variveis do tipo short (nmero inteiro de 16 bits), num1,
num2 e soma. As variveis num1 e num2 recebem, respectivamente,
como atribuio os valores 8 e 10. Agora na linha seguinte, ocorre a
atribuio da soma de num1 com num2, cujo resultado atribudo a
varivel soma. Por incrvel que parea existe um erro nesse cdigo.
Espere ai, as variveis so do mesmo tipo. Por que ento est dando erro
na soma ? Vou explicar:
Qualquer expresso em que ocorram operaes aritmticas, como o do
cdigo destacado em vermelho, o resultado sempre retornado, no caso
acima, em um tipo int (inteiro de 32 bits). No cdigo acima trabalhamos com
variveis do tipo short (um tipo inteiro de 16 bits) porm, a soma dos nmeros
retornada em um tipo int( inteiro de 32 bits). Essa uma pegadinha que
muita gente no sabe.
Ento como retornar o resultado para a varivel soma ? Utilizando cast.
Veja como ficaria o cdigo:
soma = ((short) (num1 + num2));

que esto armazenadas em


j no permitido.

Vamos ver um outro exemplo de converso. Veja o cdigo abaixo:

oat para um valor do tipo int

public class Soma {

em negrito ? Desta forma:

J a v a

O que acontece no cdigo acima ? Antes da varivel valorfloat coloquei


uma expresso (int) informando que o valor float ser convertido para tipo
inteiro.

os

to, porm, possui um erro.


uma do tipo int e outra do
nmerico como atribuio.
ao uma atribuio do valor
a varivel valorint. Ai est

d a

public static void main(String arg[]) {


float num1, num2;
num1 = 7;
num2 = 7.5;
}

Book Apostila.indb 60

60

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

}
}}
Observe o cdigo acima. Declaramos duas variveis do tipo float, a primeira
varivel recebe como valor o nmero 7 e a segunda varivel recebe o valor
7.5. Espere, o cdigo dessa ultima atribuio est com erro. Por que ? Uma
constante que representa um nmero com casa decimal interpretada como
double (nmero de ponto flutuante de 64 bits). Esse valor atribudo a uma
varivel do tipo float (nmero de ponto flutuante de 32 bits). Para solucionar
esse problema basta utilizarmos o cast, como mostra o cdigo abaixo:
num2 = (float) 7.5;

5.13 Estruturas condicio

At aqui desenvolvemos
instrues, mas , vamos s
programa onde haver uma i
condio for satisfeita, com
agora. Vamos conhecer ago
que executam comandos s
estruturas condicionais sup

5.12 Enumerao
Enumerao um tipo de estrutura onde dentro dela podemos ter um ou
vrios rtulos, sendo eles o prprio valor.

5.13.1 Estrutura condici

Sintaxe:

A estrutura condicional i
determinada condio for s

enum <Tipo> { <Rotulo1>, <Rotulo2,...,<Rotulon> };

Sintaxe:
if (<condio>)
<comando>;

Demonstrao:
enum Sinal { VERDE, AMARELO, VERMELHO };

Exemplo

Exemplos:

public class Condicao1 {


public class ClasseEnum {

public static void main(Stri

public static void main(String arg[]) {

int numero;
numero = 3;
if(numero > 5)
System.out.println(

enum Sinal {VERDE, AMARELO, VERMELHO };


Sinal s;
s = Sinal.VERMELHO;

}}

Vamos analisar o cdigo


instruo if, conforme mo

}}

if(numero > 5)
public class ClasseEnum2 {

Essa instruo avalia o valo


5, se for verdadeiro, execut

public static void main(String arg[]) {

System.out.println(Valor m

enum Naipe {OURO, ESPADA, COPAS, PAUS };

Caso falso, no faz nada. S


nada na tela pois o valor
modificar o valor da varive

Naipe carta;

61

Book Apostila.indb 61

carta = Naipe.OURO;

27/01/2012 15:13:50

i l e

( J A V A )

veis do tipo float, a primeira


nda varivel recebe o valor
com erro. Por que ? Uma
decimal interpretada como
sse valor atribudo a uma
de 32 bits). Para solucionar
mostra o cdigo abaixo:

o dela podemos ter um ou

n> };

F u n d a m e n t o s

L i n g u a g e m

J a v a

}}

5.13 Estruturas condicionais


At aqui desenvolvemos programas que seguiam uma seqncia de
instrues, mas , vamos supor que queira agora desenvolver um dado
programa onde haver uma instruo que ser executada se uma determinada
condio for satisfeita, como faremos isso ? o que ns iremos aprender
agora. Vamos conhecer agora as estruturas condicionais, que so estruturas
que executam comandos se alguma condio for satisfeita. Vamos ver as
estruturas condicionais suportadas pela linguagem Java.
5.13.1 Estrutura condicional if
A estrutura condicional if executa um bloco de comandos se uma
determinada condio for satisfeita.
Sintaxe:
if (<condio>)
<comando>;

Ou

if (<condio>) {
<comando1>;
<comando2>;
:
<comandon>;
}

Exemplo
public class Condicao1 {
public static void main(String arg[]) {
int numero;
numero = 3;
if(numero > 5)
System.out.println(Valor maior que 5);

};

S };

d a

}}
Vamos analisar o cdigo acima. Observe que no programa existe uma
instruo if, conforme mostrado abaixo:
if(numero > 5)
Essa instruo avalia o valor da varivel numero e confere se ela maior que
5, se for verdadeiro, executa a instruo abaixo:
System.out.println(Valor maior que 5);
Caso falso, no faz nada. Sabemos que o nosso programa no vai mostrar
nada na tela pois o valor da varivel nmero menor que 5. Se voc
modificar o valor da varivel nmero atribuindo um nmero maior que 5, vai

62

Book Apostila.indb 62

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

ser mostrado uma mensagem na tela.


5.13.2 Estrutura condicional if/else
A estrutura condicional if/else executa um bloco de comandos se uma
determinada condio for satisfeita e outra, caso a condio no seja
satisfeita.
Sintaxe:
if (<condio>)
<comando>;
else
<comando>;

Ou

if (<condio>) {
<comando1>;
<comando2>;
:
<comandon>;
} else {
<comando1>;
<comando2>;
:
<comandon>;

5.13.4 Operadores lgico

muito comum em estru


avaliao condicional. Par
lgicos para tal finalidade.
existentes na linguagem Ja

O operador lgico E (&


Exemplo:

Retorna verdadeiro quando

public class Condicao2 {


public static void main(String arg[]) {
int numero;
numero = 3;
if(numero > 5)
System.out.println(Valor maior que 5);
else
System.out.println(Valor menor ou igual 5);

O operador lgico OU (

}}

Retorna verdadeiro quando


O cdigo desse programa similar ao do anterior, a diferena que feito o
uso da instruo else, mostrando uma mensagem caso a condio no seja
satisfeita.
5.13.3 Operadores relacionais
A linguagem Java, como qualquer outra linguagem, possui seus operadores
relacionais, que podem ser utilizados dentro de uma avaliao condicional.
Veja na tabela abaixo os operadores relacionais pertencentes linguagem
Java.

63

Book Apostila.indb 63

27/01/2012 15:13:50

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

oco de comandos se uma


caso a condio no seja

f (<condio>) {
<comando1>;
<comando2>;
:
<comandon>;

} else {

<comando1>;
<comando2>;
:
<comandon>;

5.13.4 Operadores lgicos


muito comum em estruturas condicionais efetuarmos mais de uma
avaliao condicional. Para isso, precisamos conhecer os operadores
lgicos para tal finalidade. Vejamos agora alguns dos operadores lgicos
existentes na linguagem Java.
O operador lgico E (&&)
Retorna verdadeiro quando todas as condies forem Verdadeiras.

al 5);
O operador lgico OU (||)
Retorna verdadeiro quando pelo menos uma das condies for verdadeira.

r, a diferena que feito o


m caso a condio no seja

em, possui seus operadores


uma avaliao condicional.
s pertencentes linguagem

64

Book Apostila.indb 64

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

Ele funciona como inversor de uma condio, retornando falso se uma


condio for verdadeira e retorna verdadeiro se uma condio for falsa.

int numero;
numero = 3;
if (!(numero > 5))
System.out.println(

O operador lgico NO (!)

}}

5.13.5 Estrutura de mlt

A estrutura switch/case e
(definido em case) for igual

Exemplos:
public class Condicao3{

switch (<varivel>) {
case <valor1> : <comando
case <valor2> : <comando
:
case <valorn> : <comando

public static void main(String arg[]) {


int numero;
numero = 26;
if((numero >= 10) && (numero <=90 ))
System.out.println(Valor dentro da faixa);
else
System.out.println(Valor fora da faixa);

[default : <comando>;]
}

}}
Exemplo:
public class Switch {
public class Condicao4 {

public static void main(Stri

public static void main(String arg[]) {

int numero;
numero = 3;
switch (numero) {
case 1: System.out.prin
case 2: System.out.prin
case 3: System.out.prin

char sexo;
sexo = m;
if((sexo == m) || (sexo == f ))
System.out.println(Sexo vlido);
else
System.out.println(Sexo invlido);

}
}}

}}

Vamos analisar o cdigo ac


switch/case para avaliar o v
o valor 3 a nossa varivel e
ser executada caso o valor
teremos o seguinte resultad

public class Condicao5 {


public static void main(String arg[]) {

65

Book Apostila.indb 65

27/01/2012 15:13:50

i l e

( J A V A )

F u n d a m e n t o s

L i n g u a g e m

J a v a

int numero;
numero = 3;
if (!(numero > 5))
System.out.println(Valor menor ou igual 5);

, retornando falso se uma


uma condio for falsa.

a);

d a

}}

5.13.5 Estrutura de mltipla escolha switch/case


A estrutura switch/case executa um comando se um determinado valor
(definido em case) for igual ao valor da varivel.
switch (<varivel>) {
case <valor1> : <comando>;
case <valor2> : <comando>;
:
case <valorn> : <comando>;
[default : <comando>;]
}

a);

Exemplo:
public class Switch {
public static void main(String arg[]) {
int numero;
numero = 3;
switch (numero) {
case 1: System.out.println(Voc digitou 1); break;
case 2: System.out.println(Voc digitou 2); break;
case 3: System.out.println(Voc digitou 3); break;
}
}}
Vamos analisar o cdigo acima. Nesse programa fazemos uso da estrutura
switch/case para avaliar o valor da varivel numero. Por padro, atribumos
o valor 3 a nossa varivel e na estrutura switch/case existe uma instruo a
ser executada caso o valor da varivel seja 3. Se executarmos o programa,
teremos o seguinte resultado:

66

Book Apostila.indb 66

27/01/2012 15:13:50

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

O que aconteceu, porque e


switch ao encontrar a prime
a entrar nas instrues segu
varivel. Isso no problem
foi projetada para funcionar
execute o programa e voc

Agora experimente mudar o valor da varivel nmero para 1, voc ter o


seguinte resultado.

Agora vamos repetir o mesm


instruo default.
Se observarmos a estrutura switch/case, em cada opo existe uma
instruo chamada break, para que ela serve? Se uma instruo da estrutura
for executada, aps a sua execuo o break tem a finalidade de sair da
estrutura.

public class Switch {

public static void main(Stri

int numero;
numero = 3;
switch (numero) {
case 1: System.out.prin
case 2: System.out.prin
case 3: System.out.prin
default: System.out.prin

Agora, remova todos os breaks do nosso programa, ficando assim:


public class Switch {
public static void main(String arg[]) {
int numero;
numero = 3;
switch (numero) {
case 1: System.out.println(Voc digitou 1);
case 2: System.out.println(Voc digitou 2);
case 3: System.out.println(Voc digitou 3);

}
}}

Ao executar esse programa


mudar o valor da varivel par

5.14 Estruturas de re

}}
Assumindo que o valor da varivel numero seja 1, execute o programa e
voc ter o resultado abaixo:

Estruturas de repetio so
repetidas vezes , caso a c
satisfatria. Vamos conhec
linguagem Java.
5.14.1 Estrutura while

A estrutura while repete um c


condio for verdadeira.
Sintaxe:

67

Book Apostila.indb 67

27/01/2012 15:13:50

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

O que aconteceu, porque ele imprimiu todas as trs opes ? A estrutura


switch ao encontrar a primeira opo que atenda o valor da varivel , passar
a entrar nas instrues seguintes, mesmo que elas no atendam ao valor da
varivel. Isso no problema da ferramenta em uso, a estrutura switch/case
foi projetada para funcionar assim. Agora mude o valor da varivel para 2,
execute o programa e voc ter o seguinte resultado:

mero para 1, voc ter o

cada opo existe uma


e uma instruo da estrutura
tem a finalidade de sair da

Agora vamos repetir o mesmo exemplo acima s que agora fazendo uso da
instruo default.
public class Switch {
public static void main(String arg[]) {
int numero;
numero = 3;
switch (numero) {
case 1: System.out.println(Voc digitou 1); break;
case 2: System.out.println(Voc digitou 2); break;
case 3: System.out.println(Voc digitou 3); break;
default: System.out.println(Voc digitou um nmero diferente); break;

rama, ficando assim:

a 1, execute o programa e

}
}}
Ao executar esse programa j sabemos qual o resultado. Agora experimente
mudar o valor da varivel para um valor acima de 3. Execute e veja o resultado.

5.14 Estruturas de repetio


Estruturas de repetio so estruturas que executa um bloco de comandos
repetidas vezes , caso a condio para a execuo dessa repetio seja
satisfatria. Vamos conhecer as estruturas de repetio suportadas pela
linguagem Java.
5.14.1 Estrutura while
A estrutura while repete um conjunto de instruo enquanto uma determinada
condio for verdadeira.
Sintaxe:

68

Book Apostila.indb 68

27/01/2012 15:13:50

G a m e

while (<condio>)
<comando>;

M o b i l e

Ou

( J A V A )

F u n d a m e n t

while (<condio>){
<comando1>;
<comando2>;
:
<comandon>;
}

Exemplo:
public class Loop1 {

5.14.2 Estrutura do/whil

public static void main(String arg[]) {

A estrutura do/while repe


determinada condio for v
dessa estrutura para a que
condio da estrutura do/w
estrutura while feita no ini

int numero;
numero = 1;
while (numero <= 10) {
System.out.println(numero);
numero = numero + 1;
}

Sintaxe:

}}
Vamos analisar o cdigo. Primeiramente, declaramos a varivel nmero do
tipo int e em seguida, atribumos o valor 1 a ela, conforme mostrado
abaixo:
int numero;
numero = 1;

do {
<comando1>;
<comando2>;
:
<comandon>;
} while (<condio>);
Exemplo:

Depois iniciado o loop while, que avalia no inicio se a varivel nmero


menor ou igual a 10, caso verdade, entra dentro do loop. Dentro desse
loop existem duas instrues, a primeira imprime na tela o valor da varivel
nmero, que inicialmente 1, conforme mostrado abaixo:

public class Loop2 {

public static void main(Stri

int numero;
numero = 1;
do {
System.out.println
numero = numero
} while (numero <=

System.out.println(numero);
Logo em seguida, a varivel nmero recebe um incremento passando a
assumir o valor 2, conforme mostrado abaixo:
numero = numero + 1;
Depois disso ocorre uma nova avaliao no loop while, verificando
novamente se o valor da varivel nmero menor ou igual a 10. Sabemos
que a varivel nmero assume no momento o valor 2, ento, novamente
entramos no loop. Esse processo ocorrer sempre enquanto a varivel
nmero for menor ou igual a 10. Execute o programa e voc ter o seguinte
resultado:

69

Book Apostila.indb 69

27/01/2012 15:13:51

}}

Vamos analisar o cdigo ac


anterior, s muda a estrutur

Se executarmos esse prog


anterior, a diferena esta em
avaliao feita no inicio d
feita no final da estrutura.

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

while (<condio>){
<comando1>;
<comando2>;
:
<comandon>;

amos a varivel nmero do


a ela, conforme mostrado

inicio se a varivel nmero


ntro do loop. Dentro desse
e na tela o valor da varivel
ostrado abaixo:

5.14.2 Estrutura do/while


A estrutura do/while repete um conjunto de instruo enquanto uma
determinada condio for verdadeira, como na estrutura while. A diferena
dessa estrutura para a que foi vista anteriormente, que a avaliao da
condio da estrutura do/while feita no final e a avaliao da condio na
estrutura while feita no inicio.
Sintaxe:
do {
<comando1>;
<comando2>;
:
<comandon>;
} while (<condio>);
Exemplo:
public class Loop2 {
public static void main(String arg[]) {
int numero;
numero = 1;
do {
System.out.println(numero);
numero = numero + 1;
} while (numero <= 10);

m incremento passando a
o:

loop while, verificando


or ou igual a 10. Sabemos
alor 2, ento, novamente
empre enquanto a varivel
rama e voc ter o seguinte

}}
Vamos analisar o cdigo acima. Observe que esse programa o mesmo do
anterior, s muda a estrutura de repetio.
Se executarmos esse programa o resultado ser o mesmo do programa
anterior, a diferena esta em onde feita a avaliao. Na estrutura while, a
avaliao feita no inicio da estrutura, na estrutura do/while a avaliao
feita no final da estrutura.

70

Book Apostila.indb 70

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

F u n d a m e n t

Ento se, por exemplo, iniciarmos o valor da nossa varivel numero com o
valor 11, na estrutura while o loop nunca seria executado, pois a avaliao
feita no inicio, ou seja antes de executar o loop. J no loop do/while, o
loop ser executado somente uma vez, pois a avaliao feita no final da
estrutura.

System.out.println(numero);

Como j terminei de execut


a terceira expresso, que
numero++

5.14.3 Estrutura for

A expresso numero++ o

A estrutura for repete um conjunto de instrues um certo nmero de vezes,


determinados no seu parmetro.

numero = numero + 1;

a forma simplificada da ex
Sintaxe:
Se tivssemos:
for (<inicializao> ; <condio> ; <incrementos>) {
numero-<comando1>;
<comando2>;
:
<comandon>;

Seria a mesma coisa que:


numero = numero - 1;

Logo depois, e executada a


varivel nmero menor ou
loop executar novamente

public class Loop3 {

Todo esse processo se repe


public static void main(String arg[]) {

Os loops de repetio so b
Veja um exemplo abaixo:

for(int numero=1; numero <= 10; numero++) {


System.out.println(numero);
}

import java.util.*;
public class Loop4 {

}}

public static void main(Stri


Agora vamos analisar o programa acima. O resultado da execuo desse
programa tambm ser o mesmo dos anteriores, o que muda novamente a
estrutura. Bom, a estrutura for composta por trs expresses, a expresso
de inicializao, a de condio e a de incremento.

String nome[];
Scanner teclado = new

Quando o loop for executado, a primeira expresso a ser executada a de


inicializao, que tem a instruo:

for(int indice=0; indice

nome = new String[10]

System.out.println(D
nome[ndice] = teclad

int numero=1
que cria a varivel nmero e atribui a ela o valor 1. Essa expresso s
executada uma vez.

Logo em seguida, executada a expresso de condio, que avalia se o valor


da varivel nmero menor ou igual a 10, conforme voc confere abaixo:

for(int indice=0; indice <


System.out.println(O

numero <= 10
}
Se a condio for verdadeira, ento executada a instruo dentro do loop,
conforme mostrado abaixo:
}}

71

Book Apostila.indb 71

27/01/2012 15:13:51

i l e

( J A V A )

ssa varivel numero com o


executado, pois a avaliao
op. J no loop do/while, o
avaliao feita no final da

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

System.out.println(numero);
Como j terminei de executar a instruo dentro do loop, executado agora
a terceira expresso, que a de incremento, conforme mostrado abaixo:
numero++
A expresso numero++ o mesmo que:

um certo nmero de vezes,

numero = numero + 1;
a forma simplificada da expresso de soma.
Se tivssemos:

>) {
numero-Seria a mesma coisa que:
numero = numero - 1;
Logo depois, e executada a expresso de condio, que avalia se o valor da
varivel nmero menor ou igual a 10. Neste o valor da varivel ser 2, o
loop executar novamente a instruo.
Todo esse processo se repetir at que o valor da varivel seja maior que 10.
{

Os loops de repetio so bastante usados quando trabalhamos com arrays.


Veja um exemplo abaixo:
import java.util.*;
public class Loop4 {
public static void main(String arg[]) {

sultado da execuo desse


o que muda novamente a
s expresses, a expresso
o.

String nome[];
Scanner teclado = new Scanner(System.in);

sso a ser executada a de

for(int indice=0; indice <= 9; indice++) {

nome = new String[10];

System.out.println(Digite o + ndice + nome);


nome[ndice] = teclado.nextLine();

r 1. Essa expresso s

ndio, que avalia se o valor


rme voc confere abaixo:

for(int indice=0; indice <= 9; indice++) {


System.out.println(O + ndice + nome digitado foi: + nome[ndice]);
}

a instruo dentro do loop,


}}

72

Book Apostila.indb 72

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

Aqui temos um programa que l dez nomes do teclado e no final, mostra


todos esses nomes lidos na tela. Se tivssemos que fazer esse programa
sem usar loops de repetio, com certeza, gastaramos muitas linhas de
cdigo.

73

Book Apostila.indb 73

27/01/2012 15:13:51

F u n d a m e n t

i l e

( J A V A )

F u n d a m e n t o s

d a

L i n g u a g e m

J a v a

ANOTAES

o teclado e no final, mostra


s que fazer esse programa
taramos muitas linhas de

74

Book Apostila.indb 74

27/01/2012 15:13:51

P r o g r a m a

G a m e

M o b i l e

C a p t u l o
P r o g r a m a o

Captulo 06 Prog

( J A V A )

Vimos anteriormente os co
orientada a objetos. Agora
aprendidos agora na lingua

0 6

o r i e n t a d a

o b j e t o s

6.1 Estrutura geral d

Vamos conferir abaixo a est

public class <NomeDaClass


<atributos>
<mtodos>
}
Exemplo:
public class Classe {

}
Como voc pode ver, para d
chave class, que tem essa
palavra chave chamada pub
um modificador de escopo,

6.2 Usando atributos

O que so atributos? Atribut


a uma determinada classe,
public class Triangulo {

private double base, altura


}

Analisando a classe acima


double : largura e altura. Ob
atributo , ela precisa estar d
for declarada dentro de uma
uma varivel de uso local d

Um outro detalhe que ante


de escopo do tipo private, d

6.3 Usando mtodos

Book Apostila.indb 75

27/01/2012 15:13:51

P r o g r a m a o

o r i e n t a d a

o b j e t o s

Captulo 06 Programao orientada a objetos

e t o s

Vimos anteriormente os conceitos bsicos e essenciais da programao


orientada a objetos. Agora vamos aplicar, na prtica, todos os conceitos
aprendidos agora na linguagem Java.

6.1 Estrutura geral de uma classe em Java


Vamos conferir abaixo a estrutura geral de uma classe.
public class <NomeDaClasse> {
<atributos>
<mtodos>
}
Exemplo:
public class Classe {
}
Como voc pode ver, para declararmos uma classe precisamos usar a palavra
chave class, que tem essa finalidade. Se observarmos tambm, existe uma
palavra chave chamada public, que vem antes da palavra chave class. Ela
um modificador de escopo, ns iremos ver isso mais a frente.

6.2 Usando atributos


O que so atributos? Atributos nada mais so do que variveis que pertencem
a uma determinada classe, veja um exemplo abaixo:
public class Triangulo {
private double base, altura;
}
Analisando a classe acima, vimos que ela possui dois atributos do tipo
double : largura e altura. Observe que para uma varivel seja denominada um
atributo , ela precisa estar declarada dentro de uma classe. Se uma varivel
for declarada dentro de uma funo, como main, ela no um atributo, mas
uma varivel de uso local dentro da funo.
Um outro detalhe que antes da palavra chave double, existe um modificador
de escopo do tipo private, daqui a pouco vamos ver isso em detalhes.

6.3 Usando mtodos


76

Book Apostila.indb 76

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

P r o g r a m a

O que so mtodos? Atributos nada mais so do que funes que pertencem


a uma determinada classe, como a funo main. Veja um exemplo abaixo:

Veja na sintaxe abaixo, com


<Classe> <varivel> = new

public class Triangulo {


Exemplo:
private double base, altura;
public double calculaArea() {
public class Classe {
return ((base * altura) / 2);

public static void main(Strin


}

Triangulo t = new Triangu


public void setBase(double b) { base = b; }
}
public void setAltura(double a) { altura = a; }
}

}
Observando o cdigo acima, temos trs mtodos um mtodo chamado
calculaArea, cuja finalidade e retornar a rea do tringulo, setBase,
responsvel por definir o valor da base do tringulo e setAltura, responsvel
por definir o valor da altura do tringulo.

Vamos por esses exemplos


e coloque o cdigo abaixo:
public class Triangulo {

6.4 Usando construtores

private double base, altura

O que so construtores ? Construtores so mtodos que possuem o mesmo


nome da classe e so invocados quando a classe instanciada. Veja o
exemplo abaixo:

public Triangulo() {
base=0;
altura = 0;
}
public double calculaArea(

public class Triangulo {


private double base, altura;

return ((base * altura) / 2)

public Triangulo() {
base=0;
altura = 0;
}
public double calculaArea() {

public void setBase(double


public void setAltura(doub
}

Depois, crie uma classe cha

return ((base * altura) / 2); }

import java.util.*;

public void setBase(double b) { base = b; }


public void setAltura(double a) { altura = a; }

public class ExecTriangulo {

public static void main(Stri

Se observarmos o programa acima, ns temos um construtor chamado


Triangulo, pois como foi falado, o construtor, OBRIGATORIAMENTE, deve
ter o mesmo nome da classe e , no deve possuir nenhum valor de retorno.

double base, altura;

Quando a classe Triangulo for instanciada, o construtor , AUTOMATICAMENTE,


ser executado iniciando os valores das variveis base e altura com o valor
zero.

Scanner teclado = new S

System.out.println(Digite

base = teclado.nextDoub

77

Book Apostila.indb 77

Triangulo t = new Triangu

27/01/2012 15:13:51

i l e

( J A V A )

que funes que pertencem


Veja um exemplo abaixo:

dos um mtodo chamado


ea do tringulo, setBase,
ulo e setAltura, responsvel

P r o g r a m a o

utor , AUTOMATICAMENTE,
is base e altura com o valor

o b j e t o s

Veja na sintaxe abaixo, como instanciar uma classe.


<Classe> <varivel> = new <Classe>();
Exemplo:

public class Classe {


public static void main(String arg[]) {
Triangulo t = new Triangulo();
}
}
Vamos por esses exemplos em prtica. Crie uma classe chamada Triangulo
e coloque o cdigo abaixo:
public class Triangulo {
private double base, altura;
public Triangulo() {
base=0;
altura = 0;
}
public double calculaArea() {

dos que possuem o mesmo


asse instanciada. Veja o

s um construtor chamado
OBRIGATORIAMENTE, deve
ir nenhum valor de retorno.

o r i e n t a d a

return ((base * altura) / 2); }


public void setBase(double b) { base = b; }
public void setAltura(double a) { altura = a; }
}
Depois, crie uma classe chamada ExecTriangulo e coloque o cdigo abaixo:
import java.util.*;
public class ExecTriangulo {
public static void main(String arg[]) {
double base, altura;
Triangulo t = new Triangulo();
Scanner teclado = new Scanner(System.in);
System.out.println(Digite o valor da base);
base = teclado.nextDouble();

Book Apostila.indb 78

78

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

P r o g r a m a

}
System.out.println(Digite o valor da altura);
Exemplo:
altura = teclado.nextDouble();
public class ClassePai {
t.setBase(base);

private int atributo1, atribu


t.setAltura(altura);
protected int atributo3;
System.out.println(A rea do triangulo e: + t.calculaArea());

public void metodo1() { }


public void metodo2() { }

}
}
}
Vamos a explicao do cdigo acima. Na primeira instruo, declaramos
duas variveis chamadas base e altura, conforme mostrado abaixo:

public class ClasseFilha ext


private int atributo4;

double base, altura;


public void metodo3() { }
Em seguida, crio uma varivel chamada t, do tipo Triangulo e em seguida,
crio sua instancia, conforme mostrado abaixo:

Triangulo t = new Triangulo();


Depois de obter os valores da base e altura do triangulo, por meio da entrada
de dados via teclado, defino os valores da base e altura, atravs dos mtodos
setBase e setAltura, da classe triangulo, conforme mostrado abaixo:

Vamos analisar as duas


(Superclasse), onde nela te
atributos (atributo1, atributo

Depois temos a ClasseFilha


todos os mtodos e atribut
(metodo3) e atributos (atribu

t.setBase(base);
t.setAltura(altura);
E finalmente, mostro na tela o valor da rea do triangulo atravs do mtodo
calculaArea, conforme mostrado abaixo:
System.out.println(A rea do triangulo e: + t.calculaArea());

6.5.1 Modificadores de e

Execute o programa e faa os testes.

Modificadores de escopo
viso de um mtodo ou atri

6.5 Herana

private: Determina que o m


qual o mesmo foi declarado

Como j foi explicado, herana uma tcnica de se aproveitar mtodos e


atributos de uma classe (Superclasse) para que possam ser usadas em uma
outra classe (Subclasse). Agora vamos ver como implementamos isso na
linguagem Java.

public: Determina que o m


tanto pelo programa que ir

Sintaxe:
public class <nomedasubclasse> extends <superclasse>{

protected: Determina que o


e suas derivadas.

Analisando novamente as d
da ClassePai.

79

Book Apostila.indb 79

Se lembra que a gente ia ve


ver o que vem a ser modific

27/01/2012 15:13:51

i l e

( J A V A )

P r o g r a m a o

o b j e t o s

}
Exemplo:
public class ClassePai {
private int atributo1, atributo2;
protected int atributo3;

calculaArea());

meira instruo, declaramos


e mostrado abaixo:

o r i e n t a d a

public void metodo1() { }


public void metodo2() { }
}
public class ClasseFilha extends ClassePai {
private int atributo4;
public void metodo3() { }

ipo Triangulo e em seguida,

angulo, por meio da entrada


altura, atravs dos mtodos
me mostrado abaixo:

}
Vamos analisar as duas classes. Primeiramente temos a ClassePai
(Superclasse), onde nela temos dois mtodo (metodo1 e metodo2) e trs
atributos (atributo1, atributo2 e atributo3).
Depois temos a ClasseFilha, classe derivada da ClassePai, ou seja, herdar
todos os mtodos e atributos da ClassePai, alm de possuir seus mtodos
(metodo3) e atributos (atributo4).

riangulo atravs do mtodo

Se lembra que a gente ia ver sobre modificadores de escopo ? Agora vamos


ver o que vem a ser modificadores de escopo.

lculaArea());

6.5.1 Modificadores de escopos

de se aproveitar mtodos e
ossam ser usadas em uma
mo implementamos isso na

rclasse>{

Modificadores de escopo um meio pelo qual determinamos o campo de


viso de um mtodo ou atributos. Os tipos de resoluo de escopo so:
private: Determina que o mtodo ou atributo s pode ser visto pela classe na
qual o mesmo foi declarado.
public: Determina que o mtodo ou atributo pode ser visto tanto pela classe
tanto pelo programa que ir usar a classe.
protected: Determina que o mtodo ou atributo s pode ser visto pela classe
e suas derivadas.
Analisando novamente as duas classes vamos ver os mtodos e atributos
da ClassePai.

80

Book Apostila.indb 80

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

P r o g r a m a

private int atributo1, atributo2;

protected int atributo3;

public class Tabuada extend

public void metodo1() { }

public void MostrarTabua

public void metodo2() { }

for(int x=1; x<=10; x++)


System.out.println(num
Multiplicacao(numero,x
}

Ns temos dois mtodos de escopo public, isto significa que eles podem ser
vistos tanto pelas classes quanto pelo programa que far uso dela.
Ns demos dois atributos de escopo private, isto significa que somente a
ClassePai poder trabalhar com eles, e esses atributos no sero visveis
pelo programa que far uso da classe e nem pelas suas classes derivadas
(como a ClasseFilha).
Ns demos um atributo de escopo protected, isto significa que a ClassePai
e as suas classes derivadas (como a ClasseFilha) podero trabalhar com
esse atributo, e esse atributo no ser visvel pelo programa que far uso da
classe.

}
}
public class Executa {

public static void main(Stri

Agora vamos para a ClasseFilha

int numero = 9;

public class ClasseFilha extends ClassePai {

Tabuada.MostrarTabuada

private int atributo4;

public void metodo3() { }

}
De acordo com a explicao sobre modificadores de escopo, todos os
mtodos e atributos que sero herdados da ClassePai e que podero ser
usados na ClasseFilha so os mtodos metodo1 e metodo2 e o atributo
atributo3.

6.6 Sobrecarga de m

Agora vamos um exemplo prtico que envolve herana.

public class OperacoesBas

Sobrecarga de mtodos q
mesmo nome e tipo, porm

public double Adicao(dou


return (n1 + n2);
}

public class OperacoesBasicas {

81

Book Apostila.indb 81

protected double Adicao(double n1, double n2) {


return (n1 + n2);
}

public double Adicao(dou


return (n1 + n2 + n3);
}

protected double Subtracao(double n1, double n2) {


return (n1 - n2);
}

public double Adicao (dou


return (n1 + n2 + n3 + n
}

protected double Multiplicacao(double n1, double n2) {


return (n1 * n2);
}

protected double Divisao(double n1, double n2) {


return (n1 / n2);
}

public class Executa {

27/01/2012 15:13:51

i l e

( J A V A )

P r o g r a m a o

o r i e n t a d a

o b j e t o s

}
public class Tabuada extends OperacoesBasicas {
public void MostrarTabuada(double numero) {
for(int x=1; x<=10; x++) {
System.out.println(numero + * + x + = +
Multiplicacao(numero,x));
}

significa que eles podem ser


que far uso dela.

to significa que somente a


atributos no sero visveis
elas suas classes derivadas

to significa que a ClassePai


ha) podero trabalhar com
o programa que far uso da

}
}
public class Executa {
public static void main(String arg[]) {
int numero = 9;
Tabuada.MostrarTabuada(numero);
}
}

ores de escopo, todos os


assePai e que podero ser
1 e metodo2 e o atributo

6.6 Sobrecarga de mtodos

erana.

public class OperacoesBasicas {

Sobrecarga de mtodos quando uma classe possui mais de um mtodo de


mesmo nome e tipo, porm, de parmetros diferentes, exemplo:

public double Adicao(double n1, double n2) {


return (n1 + n2);
}

2) {

public double Adicao(double n1, double n2, double n3) {


return (n1 + n2 + n3);
}

n2) {

public double Adicao (double n1, double n2, double n3, double n4) {
return (n1 + n2 + n3 + n4);
}

ble n2) {

){

public class Executa {

82

Book Apostila.indb 82

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

P r o g r a m a

public static void main(String arg[]) {


Exemplo:
double soma1,soma2,soma3;
public interface Tarefas {
soma1 = OperacoesBasicas.Adicao(12,3);

public void executaTarefa(


soma2 = OperacoesBasicas.Adicao(53,17,9);
}
soma3 = OperacoesBasicas.Adicao(6,8,34,56);
System.out.println(Primeira soma: + soma1);
System.out.println(Segunda soma: + soma2);
System.out.println(Terceira soma: + soma3);

public class ClasseFilho imp

public void executaTarefa


}

System.out.println(Filho
}
}
}

6.7 Interfaces
A interface funciona como se fosse uma estrutura onde nela s tem assinatura
de mtodos , ou seja, mtodos sem estrutura de blocos de execuo. A
interface nada mais do que uma soluo para implementao de herana
mltipla, ou seja, quando uma classe pode ser derivada de mais de uma
classe. Um exemplo de linguagem que suporta herana mltipla entre
classes a linguagem C++. Vamos ver a sintaxe de uma interface

Como a ClasseFilho imple


o mtodo executaTarefa co
prximas classes abaixo:

public class ClassePai impl

public void executaTarefa

public interface <Nome da interface> {

System.out.println(Pai v

// Assinatura de mtodos

Exemplo:

public class ClasseMae imp

public void executaTarefa


public interface Tarefas {

System.out.println(Mae

public void executaTarefa();

}
public class Exec {

Como usar a interface em uma classe ?

public static void main(Strin


public class <Nome da
<Interface2>,...,<Interfacen>] {

classe>

implements

<Interface1>

[,

ClassePai cp = new Class

ClasseMae cm = new Clas

83

Book Apostila.indb 83

Tarefas t;

27/01/2012 15:13:51

i l e

( J A V A )

P r o g r a m a o

o r i e n t a d a

o b j e t o s

Exemplo:
public interface Tarefas {
public void executaTarefa();
}

);
public class ClasseFilho implements Tarefas {
public void executaTarefa() {
System.out.println(Filho vai jogar o lixo);
}
}

onde nela s tem assinatura


de blocos de execuo. A
implementao de herana
derivada de mais de uma
rta herana mltipla entre
de uma interface

ements

Como a ClasseFilho implementa a interface Tarefas precisa ter definido


o mtodo executaTarefa com algum cdigo. A mesma regra vale para as
prximas classes abaixo:
public class ClassePai implements Tarefas {
public void executaTarefa() {
System.out.println(Pai vai preparar relatorio);
}
}
public class ClasseMae implements Tarefas {
public void executaTarefa() {
System.out.println(Mae vai lavar roupa);
}
}
public class Exec {
public static void main(String arg[]) {

<Interface1>

[,

Tarefas t;
ClassePai cp = new ClassePai();
ClasseMae cm = new ClasseMae();

84

Book Apostila.indb 84

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

P r o g r a m a

ClasseFilho cf = new ClasseFilho();

Na instruo seguinte a var


da classe ClasseMae, que
confere abaixo:

//Recebe a referncia da ClassePai


t = cp;
//Executa o mtodo executaTarefa da ClassePai
t.executaTarefa();

t = cm;

Na instruo seguinte, por m


e como a varivel t aponta
disparado o mtodo execu
abaixo:

//Recebe a referncia da ClasseMae


t = cm;
//Executa o mtodo executaTarefa da ClasseMae
t.executaTarefa();

t.executaTarefa();

//Recebe a referncia da ClasseFilho


t = cf;

O procedimento ser o me
veja o resultado.

//Executa o mtodo executaTarefa da ClasseFilho


t.executaTarefa();
}

6.8 Polimorfismo

Como j foi falado, polimorfi


mesmo nome e parmetro
ou seja, esse mtodo se en
essas classes dever uma
abaixo:

Vamos analisar o cdigo do programa acima. Observe que declaramos uma


varivel do tipo Tarefas, que uma interface, conforme voc confere abaixo:
Tarefas t;
Essa varivel vai funcionar como se fosse um ponteiro, que ira receber como
atributo instncias de classes , ou melhor varivel de um tipo classe, que
implementam esta interface.

public class Animal {


public void ruido() {

Nas instrues seguintes , crio as instncias das classes ClassePai, ClaseMae


e ClasseFilho, conforme voc confere abaixo:

System.out.println(Qual
}

ClassePai cp = new ClassePai();

ClasseMae cm = new ClasseMae();


ClasseFilho cf = new ClasseFilho();
Na instruo seguinte a varivel t, que uma interface, recebe como
atribuio a instncia da classe ClassePai, que implementa a interface
Tarefa, conforme voc confere abaixo:

Acima nos declaramos uma


mtodo chamado rudo, que
Qualquer rudo, pois um a

public class Cachorro exten

t = cp;

public void ruido() {

Como havia falado, essa varivel esta na verdade apontando para aquela
classe, que tem implementado a interface Tarefa.
}

Na instruo seguinte, por meio da varivel t, eu invoco o mtodo


executaTarefa e como a varivel t aponta para uma instncia da classe
ClassePai, ser disparado o mtodo executaTarefa da ClassePai, conforme
voc confere abaixo:

t.executaTarefa();

Bom, acima criamos uma c


Animal (pois logicamente, um

85

Book Apostila.indb 85

System.out.println(Au a

27/01/2012 15:13:51

i l e

( J A V A )

Pai

P r o g r a m a o

o r i e n t a d a

o b j e t o s

Na instruo seguinte a varivel t, agora recebe como atribuio a instncia


da classe ClasseMae, que implementa a interface Tarefa, conforme voc
confere abaixo:
t = cm;
Na instruo seguinte, por meio da varivel t, eu invoco o mtodo executaTarefa
e como a varivel t aponta para uma instncia da classe ClasseMae, ser
disparado o mtodo executaTarefa da ClasseMae, conforme voc confere
abaixo:

Mae
t.executaTarefa();
O procedimento ser o mesmo para a ClasseFilho. Execute a aplicao e
veja o resultado.

Filho

bserve que declaramos uma


nforme voc confere abaixo:

nteiro, que ira receber como


vel de um tipo classe, que

6.8 Polimorfismo
Como j foi falado, polimorfismo a tcnica de um determinado mtodo, de
mesmo nome e parmetros, possuir diversos comportamentos diferentes,
ou seja, esse mtodo se encontra em vrias classes distintas, porm, entre
essas classes dever uma relao de herana. Vamos ver um exemplo
abaixo:
public class Animal {
public void ruido() {

lasses ClassePai, ClaseMae

ma interface, recebe como


e implementa a interface

System.out.println(Qualquer rudo);
}
}
Acima nos declaramos uma classe chamada Animal, onde nela possui um
mtodo chamado rudo, que tem como finalidade mostrar na tela a mensagem
Qualquer rudo, pois um animal, qualquer que seja, faz qualquer rudo.
public class Cachorro extends Animal{
public void ruido() {

ade apontando para aquela


.

l t, eu invoco o mtodo
ra uma instncia da classe
efa da ClassePai, conforme

System.out.println(Au au);
}
}
Bom, acima criamos uma classe chamada Cachorro, que deriva da classe
Animal (pois logicamente, um cachorro um animal). Bom o mtodo existente

86

Book Apostila.indb 86

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

na classe Animal se chama rudo. Na classe Cachorro estamos redefinindo


o mtodo rudo para a classe Cachorro, que mostrar a tela o seu rudo, que
o latido : Au Au.

P r o g r a m a

Espera um pouco, a varive


da uma classe do tipo Cach
disso.

public class Gato extends Animal{

Por que a varivel a p


Simplesmente pelo fato de
no ocorrer nenhum erro.
Existe um detalhe: Se a va
uma instncia da classe A
tipo subclasse (Cachorro q
instncias de suas superclas
orientada a objetos.

public void ruido() {


System.out.println(Miau);
}
}
Bom, acima criamos uma classe chamada Gato, que deriva da classe Animal
(pois logicamente, um gato um animal). Bom o mtodo existente na classe
Animal se chama rudo. Na classe Gato estamos redefinindo o mtodo rudo
para a classe Gato, que mostrar a tela o seu rudo o Miau.

Ento conclusse que a va


receber instncias de suas
subclasses da classe Anima

Logo em seguida, cham


carregada na varivel do
classe Cachorro, conforme

public class Classe {


public static void main(String arg[]) {

a.ruido();
Animal a;
a = new Animal();

A linha seguinte cria a inst


a varivel a, que tipo An

a.ruido();
Animal a = new Gato();
a = new Cachorro();
a.ruido();
a = new Gato();

Logo em seguida, cham


carregada na varivel do ti
Gato, conforme voc confe

a.ruido();

a.ruido();

}
}

Execute a aplicao e veja

Vamos a explicao do cdigo acima. A primeira linha de cdigo cria a


instncia da classe Animal e atribui essa instncia para a varivel a, que
tipo Animal, conforme mostrado abaixo:

Vamos agora fazer a seguint


o mtodo puloDoGato, co

Animal a = new Animal();

public class Gato extends A

Logo em seguida, chamado o mtodo rudo da classe Animal, que mostrar


na tela a mensagem Qualquer ruido, conforme mostrado abaixo:

public void ruido() {

System.out.println(Miau
a.ruido();
}
A linha seguinte cria a instncia da classe Cachorro e atribui essa instncia
para a varivel a, que tipo Animal, conforme mostrado abaixo:

87

Book Apostila.indb 87

Animal a = new Cachorro();

27/01/2012 15:13:51

i l e

( J A V A )

chorro estamos redefinindo


trar a tela o seu rudo, que

que deriva da classe Animal


mtodo existente na classe
redefinindo o mtodo rudo
do o Miau.

eira linha de cdigo cria a


ia para a varivel a, que

classe Animal, que mostrar


mostrado abaixo:

P r o g r a m a o

o r i e n t a d a

o b j e t o s

Espera um pouco, a varivel a, que do tipo Animal, pode receber instncia


da uma classe do tipo Cachorro ? Pode sim e vamos saber agora o porqu
disso.
Por que a varivel a pode receber instncia da classe Cachorro ?
Simplesmente pelo fato de a classe Cachorro derivar da classe Animal, logo,
no ocorrer nenhum erro.
Existe um detalhe: Se a varivel a fosse do tipo Cachorro e recebesse
uma instncia da classe Animal ocorreria um erro. Porque variveis do
tipo subclasse (Cachorro que deriva da classe Animal), no pode receber
instncias de suas superclasses (classe Animal). Isso regra da programao
orientada a objetos.
Ento conclusse que a varivel a, do tipo Animal (Superclasse), pode
receber instncias de suas derivadas (classe Cachorro e Gato, que so
subclasses da classe Animal).
Logo em seguida, chamado o mtodo rudo, porm, como a instncia
carregada na varivel do tipo Cachorro, ser invocado o mtodo rudo da
classe Cachorro, conforme voc confere abaixo:
a.ruido();
A linha seguinte cria a instncia da classe Gato e atribui essa instncia para
a varivel a, que tipo Animal, conforme mostrado abaixo:
Animal a = new Gato();
Logo em seguida, chamado o mtodo rudo, porm, como a instncia
carregada na varivel do tipo Gato, ser invocado o mtodo rudo da classe
Gato, conforme voc confere abaixo:
a.ruido();

Execute a aplicao e veja os resultados.


Vamos agora fazer a seguinte modificao na classe Gato, vamos adicionar
o mtodo puloDoGato, conforme demonstra o cdigo abaixo:
public class Gato extends Animal{
public void ruido() {
System.out.println(Miau);
}

orro e atribui essa instncia


mostrado abaixo:

88

Book Apostila.indb 88

27/01/2012 15:13:51

G a m e

M o b i l e

( J A V A )

public void puloDoGato() {


System.out.println(Pulo do Gato);
}
}
Voltando ao programa anterior, analise que conseguimos carregar todas as
verses do mtodo rudo tanto com a instncia da classe Animal, Cachorro
e Gato. Observe que nesta nova verso da classe Gato existe um mtodo
chamado puloDoGato, que s existe na classe Gato.
Observe o cdigo abaixo do programa anterior:
Animal a;
Observe que a varivel declarada acima do tipo Animal, que possui
o mtodo rudo. As classes Cachorro e Gato, ambas derivadas da classe
Animal, possuem tambm o mtodo rudo logo, o mtodo poder ser
acessado por esta varivel com qualquer uma das instncias de classes
carregadas, mas, o mtodo puloDoGato, existente somente na classe
Gato , no enxergado pela varivel a, pois como foi falado, ela do
tipo Animal e s enxergar o mtodo rudo .
Como podemos acessar o mtodo puloDoGato quando a instncia da
classe Gato estiver carregada na varivel ? Simples. Basta utilizar o cast,
como mostra o cdigo abaixo:
((Gato) a).puloDoGato();
Lembre-se que o mtodo acima ser executado com sucesso se a instncia
carregada na varivel for da classe Gato.

Com o que j vimos at aqui , a respeito dos fundamentos da linguagem


Java, podemos dar continuidade com o aprendizado a respeito da plataforma
Android voltado para o desenvolvimento de jogos.

89

Book Apostila.indb 89

27/01/2012 15:13:52

P r o g r a m a

i l e

( J A V A )

P r o g r a m a o

o r i e n t a d a

o b j e t o s

ANOTAES

seguimos carregar todas as


da classe Animal, Cachorro
sse Gato existe um mtodo
Gato.

tipo Animal, que possui


ambas derivadas da classe
go, o mtodo poder ser
a das instncias de classes
istente somente na classe
s como foi falado, ela do

to quando a instncia da
ples. Basta utilizar o cast,

com sucesso se a instncia

fundamentos da linguagem
ado a respeito da plataforma
s.

90

Book Apostila.indb 90

27/01/2012 15:13:52

C o n h e c e n d

G a m e

M o b i l e

C a p t u l o
C o n h e c e n d o

a s

Captulo 07 Conh

( J A V A )

Uma aplicao Android co


que componentes que con
widgets essenciais da plata
nossos jogos.

0 7

W i d g e t s

d o

A n d r o i d

A widget TextView

A widget TextView funcion


podemos mostrar alguma i
aplicao tivemos a oportun
A widget EditText

A widget EditText funciona


dados do teclado.
A widget Button

A widget Button nada mais


clicado, dispara uma ao,

7.1 Desenvolvendo n

Agora neste tpico vamos


que vai consistir no jogo do
um nmero qualquer, cujo
mgico) que o computador
10 tentativas para adivinhar
o usurio, acertar de prime
usurio errar na primeira e
cada erro ele perder 10 po

Vamos agora iniciar o noss


os seguintes dados abaixo:

Project name : JogoDosNum

Application name : Jogo do

Package name: br.com.app

Create Activity : AppNumero


Min SDK Version : 7

Depois de criado o projeto v


tela de layout dele, conform

Book Apostila.indb 91

27/01/2012 15:13:52

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Captulo 07 Conhecendo as Widgets do Android

d r o i d

Uma aplicao Android constituda por vrias widgets, que so nada mais
que componentes que constitui uma aplicao. Vamos agora conhecer as
widgets essenciais da plataforma Android para que possamos desenvolver
nossos jogos.
A widget TextView
A widget TextView funciona como se fosse uma Label (rotulo), onde nele
podemos mostrar alguma informao, mensagem e etc. Na nossa primeira
aplicao tivemos a oportunidade de usarmos esse componente.
A widget EditText
A widget EditText funciona como se fosse caixa onde podemos digitar nela
dados do teclado.
A widget Button
A widget Button nada mais do que um Boto de comando , que quando
clicado, dispara uma ao, um evento.

7.1 Desenvolvendo nosso primeiro jogo (Nmero mgico)


Agora neste tpico vamos criar nosso primeiro jogo na plataforma Android,
que vai consistir no jogo do nmero mgico. Nesse jogo o usurio informa
um nmero qualquer, cujo objetivo e tentar adivinhar o nmero (nmero
mgico) que o computador escolheu (nmero entre 1 e 20). O usurio ter
10 tentativas para adivinhar o nmero mgico gerado pelo computador. Se
o usurio, acertar de primeira o nmero gerado, ganha 100 pontos, se o
usurio errar na primeira e acertar a segunda, ganha 90 pontos, ou seja, a
cada erro ele perder 10 pontos.
Vamos agora iniciar o nosso projeto. Crie um novo projeto no Android com
os seguintes dados abaixo:
Project name : JogoDosNumerosMgicos
Application name : Jogo dos nmeros mgicos
Package name: br.com.appjogonumeros
Create Activity : AppNumerosMagicos
Min SDK Version : 7
Depois de criado o projeto vamos no arquivo main.xml para carregarmos a
tela de layout dele, conforme voc confere na figura abaixo:

92

Book Apostila.indb 92

27/01/2012 15:13:52

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

Agora vamos fazer as modi


de incio, ele mostra a frase
TextView. Vamos carregar as
com o boto direito sobre
Properties, como voc con

Tela
Tela de layout da aplicao
Primeiramente, antes de qualquer modificao no programa, vamos mudar
a resoluo da visualizao do layout da nossa aplicao, para que esteja
de acordo com a resoluo do emulador Android. Na opo onde est
selecionada como padro 2.7in QVGA , e vamos selecionar a opo 3.2in
HVGA slider (ADP1) (Essa ser a resoluo que passaremos a trabalhar
daqui pra frente). Voc ver que a resoluo mudar , como demonstra a
figura abaixo:

93

Book Apostila.indb 93

Em seguida as propriedade
chamada Properties, na q
figura seguinte:

Agora vamos na guia Pro


Text, que indica o conte
no caso a frase Hello W
propriedade Text, substitua
nmero mgico. Digite abaix
e depois disso, de ENTER.

Tela de layout da aplicao

27/01/2012 15:13:52

i l e

( J A V A )

no programa, vamos mudar


aplicao, para que esteja
oid. Na opo onde est
os selecionar a opo 3.2in
ue passaremos a trabalhar
udar , como demonstra a

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Agora vamos fazer as modificaes iniciais no programa. Observe que logo


de incio, ele mostra a frase Hello World,AppNumeros mgicos! na widget
TextView. Vamos carregar as propriedades (Properties) dessa widget clicando
com o boto direito sobre ele e em seguida selecione o menu Show in /
Properties, como voc confere na figura seguinte:

Tela de layout da aplicao


Em seguida as propriedades do componente sero carregadas em uma guia
chamada Properties, na qual iremos trabalhar daqui para frente. Confira na
figura seguinte:

Guia Properties
Agora vamos na guia Properties encontrar uma propriedade chamada
Text, que indica o contedo assumido pelo componente TextView, que
no caso a frase Hello World,AppCalculadora!. Depois de encontrar a
propriedade Text, substitua o valor corrente pela frase Bem vindo ao jogo do
nmero mgico. Digite abaixo o nmero mgico escolhido pelo computador:
e depois disso, de ENTER. O resultado voc confere na figura abaixo:

Book Apostila.indb 94

94

27/01/2012 15:13:52

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

Bom, agora vamos modifica

Encontre a propriedade id
o valor @+id/ednumero. E
componente, caso ele seja

O nome de um widget deve


@+<nome>/<nome>

Se observamos, o valor de
representasse um grupo e
Voc ir entender essa nota

Depois disso, vamos na pr


de um componente e irem
componente ir ocupar tod

Para finalizar, vamos agora


contedo em branco. O res

Tela de layout da aplicao


timo, agora vamos inserir a widget EditText (Que se encontra na guia Form
Widgets), que funciona como um campo para preenchermos com valores
numricos ou alfanumricos. Como vamos adicionar esse componente? Se
voc observar na figura acima, existe uma seo chamada Form Widgets,
nela onde ficam os componentes bsicos que constituem uma aplicao
Android.
Primeiramente, encontre o componente (widget) EditText, depois de
encontr-lo, simplesmente voc vai clicar sobre ele e arrastar at a tela do
dispositivo, para adicion-lo. O resultado voc confere na figura abaixo:

Tela

Agora vamos inserir um But


guia Form Widgets). Depo
com os seus respectivos va
Button

Tela de layout da aplicao

95

Book Apostila.indb 95

27/01/2012 15:13:52

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Bom, agora vamos modificar duas propriedades desse componente.


Encontre a propriedade id do componente EditText e nela voc vai inserir
o valor @+id/ednumero. Essa propriedade serve para darmos um nome ao
componente, caso ele seja trabalhado no cdigo Java.
O nome de um widget deve estar nesse formato:
@+<nome>/<nome>
Se observamos, o valor desse atributo : @+id/numero. como se id
representasse um grupo e numero representasse o nome do componente.
Voc ir entender essa notao mais a frente.
Depois disso, vamos na propriedade Layout width, que define a largura
de um componente e iremos definir o valor fill_parent, que indica que o
componente ir ocupar toda a largura do dispositivo.
Para finalizar, vamos agora modificar a propriedade Text, deixando seu
contedo em branco. O resultado voc confere na figura abaixo:

e se encontra na guia Form


preenchermos com valores
onar esse componente? Se
o chamada Form Widgets,
constituem uma aplicao

get) EditText, depois de


ele e arrastar at a tela do
onfere na figura abaixo:

Tela de layout da aplicao


Agora vamos inserir um Button na nossa aplicao (Tambm se encontra na
guia Form Widgets). Depois de inserido, modifique as propriedades abaixo
com os seus respectivos valores:
Button

96

Book Apostila.indb 96

27/01/2012 15:13:52

G a m e

M o b i l e

( J A V A )

Aps inserir todas as widgets solicitadas anteriormente, a nossa aplicao


deve estar de acordo com a figura abaixo:

C o n h e c e n d

import java.math.*;

As duas linhas acima imp


widget, onde neles esto
nossa aplicao. Tambm
existe uma classe que trab
ser utilizado para gerar no
Agora, substitua a linha:

import android.app.Activity
Por:
import android.app.*;

Espere a, porque substitum


do pacote android.app ex
anterior estaramos dizendo
dentro desse pacote, porm
ao pacote android.app. P
*, indicando que podemo
pacote.

Agora dentro da classe, ant

Tela de layout da aplicao


At aqui criamos a tela da nossa aplicao. Vamos agora definir as aes
que nosso jogo ir executar. Para isso, d um duplo clique no arquivo
AppNumerosMagicos.java (situado no diretrio src). Veja seu cdigo
abaixo:
package br.com.appjogonumeros;

EditText ednumero;
Button btjogar;
int numero_magico;
int pontuacao;

Observe que declaramos d


referncia um componen
componente XML definido
cdigo Java. Por exemplo
Button, para acess-lo dev
que tambm declaramos du
por armazenar o nmero m
para armazenar a pontua

import android.app.Activity;
import android.os.Bundle;
public class AppNumerosMagicos extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Agora, aps a linha:

setContentView(R.layout.ma

Digite as seguintes linhas d


Agora vamos da inicio a codificao do nosso jogo. Siga todo o passo a
passo. Logo aps a linha:
import android.os.Bundle;

Vou explicar agora as linhas a


XML inserido na estrutura d
componente XML de mesm
varivel btjogar tambm fa
XML atravs do mesmo m

Digite:
import android.widget.*;
import android.view.*;

97

Book Apostila.indb 97

ednumero = (EditText) findV


btjogar = (Button) findViewB

27/01/2012 15:13:52

i l e

( J A V A )

ormente, a nossa aplicao

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

import java.math.*;
As duas linhas acima importam os pacotes android.view e android.
widget, onde neles esto contidos os componentes que iremos usar em
nossa aplicao. Tambm fazemos uso do pacote java.math , onde ele
existe uma classe que trabalha com gerao de nmeros randmicos (que
ser utilizado para gerar nosso nmero mgico).
Agora, substitua a linha:
import android.app.Activity;
Por:
import android.app.*;
Espere a, porque substitumos o Activity pelo * ? Existe uma razo. Dentro
do pacote android.app existem inmeras classes, se deixssemos a forma
anterior estaramos dizendo para o Java somente usar a classe Activity
dentro desse pacote, porm, vamos utilizar uma outra classe que pertence
ao pacote android.app. Por isso tivemos que substituir o Activity pelo
*, indicando que podemos utilizar qualquer classe que pertena a aquele
pacote.

mos agora definir as aes


m duplo clique no arquivo
io src). Veja seu cdigo

tivity {

tate) {

Agora dentro da classe, antes da linha @Override, digite:


EditText ednumero;
Button btjogar;
int numero_magico;
int pontuacao;
Observe que declaramos duas variveis, onde cada uma dela far uma
referncia um componente XML definido na nossa aplicao. Para cada
componente XML definido no arquivo de layout, existe o seu respectivo em
cdigo Java. Por exemplo: Se um arquivo XML possui definido um widget
Button, para acess-lo devo fazer uso da classe Button e assim vai. Veja
que tambm declaramos duas variveis inteiras, onde uma ser responsvel
por armazenar o nmero mgico (chamada de numero_magico) e outra
para armazenar a pontuao (chamada de pontuacao).
Agora, aps a linha:
setContentView(R.layout.main);
Digite as seguintes linhas de cdigo:

jogo. Siga todo o passo a

ednumero = (EditText) findViewById(R.id.ednumero);


btjogar = (Button) findViewById(R.id.btjogar);
Vou explicar agora as linhas acima. Cada linha faz referncia um componente
XML inserido na estrutura de layout. A varivel ednumero faz referencia ao
componente XML de mesmo nome, atravs do mtodo findViewById, e a
varivel btjogar tambm faz referncia ao componente de mesmo nome no
XML atravs do mesmo mtodo.

98

Book Apostila.indb 98

27/01/2012 15:13:52

G a m e

M o b i l e

( J A V A )

Em seguida, vamos adicionar a seguinte linha de cdigo abaixo:


numero_magico = (int) (Math.round(Math.random() * 19) + 1);
pontuacao = 100;
A linha de cdigo acima retorna para a varivel numero_magico um
nmero aleatrio entre 1 e 20, que o jogador precisa acertar para obter uma
pontuao. Na instruo seguinte a varivel pontuacao atribuda com
seu valor padro que 100.
Bom, antes de continuarmos com a codificao do programa dentro do
mtodo onCreate, vamos criar um mtodo chamado mostrarMensagem,
com o seguinte cdigo conforme abaixo:
public void mostrarMensagem(String msg) {

AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);
dialogo.setMessage(msg);
dialogo.setTitle(Aviso);
dialogo.setNeutralButton(OK, null);
dialogo.show();

}
O mtodo acima foi criado com o objetivo de mostrar uma mensagem na
tela. Vejamos seu cdigo abaixo. A primeira linha:
AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);
A linha acima cria uma instncia da classe AlertDialog.Builder (classe
situada dentro do pacote android.app), cujo objetivo mostrar uma
mensagem na tela. A linha:
dialogo.setMessage(msg);
Define uma mensagem a ser exibida na caixa de dilogo atravs do mtodo
setMessage. O contedo da mensagem est na varivel msg. A linha:
dialogo.setTitle(Aviso);
Define um ttulo a ser exibido na barra de ttulo da caixa de dilogo atravs
do mtodo setTitle. A linha:

C o n h e c e n d

btjogar.setOnClickListener(n

@Override
public void onClick(View

int numero_jogador;

numero_jogador = Intege

//Compara e verifica se e

if(numero_jogador == nu


mostrarMensagem(
numero_magico + . Voc

} else if(pontuacao == 10


mostrarMensagem(
numero_magico);

} else if(numero_jogador


mostrarMensagem
nmero mgico.);


ednumero.setText(

//Desconta 10 pon
pontuacao-=10;

} else {


mostrarMensagem
mgico.);

ednumero.setText(

//Desconta 10 pontos
pontuacao-=10;



}
});

dialogo.setNeutralButton(OK, null);
Define o boto OK da caixa de dilogo, que ser exibido na tela, atravs
do mtodo setNeutralButton. Por ltimo, exibido a mensagem na tela
atravs do mtodo show, conforme mostra a linha de cdigo abaixo:
dialogo.show();

btjogar.setOnClickListen
:
: });

Bom, agora vamos voltar para a nossa codificao do programa. Muito bem,
logo aps a linha:
pontuacao = 100;
Digite o seguinte cdigo abaixo:

99

Book Apostila.indb 99

Irei explicar agora o cdigo i


abaixo:

27/01/2012 15:13:52

Observe que chamados o


btjogar , que define uma
existe um mtodo (chama
clicarmos no boto. Vamos

i l e

( J A V A )

e cdigo abaixo:

m() * 19) + 1);

vel numero_magico um
cisa acertar para obter uma
ontuacao atribuda com

o do programa dentro do
mado mostrarMensagem,

s);

mostrar uma mensagem na


a:

s);

AlertDialog.Builder (classe
objetivo mostrar uma

dilogo atravs do mtodo


a varivel msg. A linha:

da caixa de dilogo atravs

er exibido na tela, atravs


xibido a mensagem na tela
nha de cdigo abaixo:

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

btjogar.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {

int numero_jogador;

numero_jogador = Integer.parseInt(ednumero.getText().toString());

//Compara e verifica se ele acertou

if(numero_jogador == numero_magico) {


mostrarMensagem(Parabens, voc acertou. O nmero mgico +
numero_magico + . Voc fez + pontuacao + pontos);

} else if(pontuacao == 10) {


mostrarMensagem(Voc perdeu. O nmero mgico era +
numero_magico);

} else if(numero_jogador > numero_magico) {


mostrarMensagem(O nmero informado maior do que o
nmero mgico.);

ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

} else {


mostrarMensagem(O nmero informado menor do que o nmero
mgico.);

ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

}

}
});
Irei explicar agora o cdigo inserido passo a passo. Veja o bloco de comandos
abaixo:
btjogar.setOnClickListener(new View.OnClickListener() {
:
: });

o do programa. Muito bem,


Observe que chamados o mtodo setOnClickListener do objeto(boto)
btjogar , que define uma interface ouvidora onde dentro dessa interface
existe um mtodo (chamado onClick) que ser invocado toda vez que
clicarmos no boto. Vamospara o cdigo dentro do mtodo onClick.

100

Book Apostila.indb 100

27/01/2012 15:13:52

G a m e

M o b i l e

( J A V A )

int numero_jogador;

numero_jogador = Integer.parseInt(ednumero.getText().toString());
Nas linhas de cdigo acima defino uma varivel chamada numero_jogador,
que vai receber como contedo o nmero digitado convertido em int (pois
o contedo digitado est em String). A converso conseguida atravs do
mtodo parseInt da classe empacotado Integer. Em seguida comparo o
valor informado pelo jogador com o valor do nmero mgico, pela instruo
IF, conforme mostrado abaixo:
if(numero_jogador == numero_magico) {
:
Se ambas as variveis forem iguais, ento o usurio acertou o valor do
nmero mgico, logo, ser mostrada uma mensagem informando ao usurio
que ele acertou o valor do nmero mgico, conforme mostrado abaixo:

C o n h e c e n d

Agora se por acaso o nme


gerado pelo computador, se
e ser mostrada uma men
informado menor do que
na figura abaixo:

mostrarMensagem(O nme
mgico.);
ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

Vamos agora conferir


AppNumerosMagicos.java

package br.com.appjogonu
mostrarMensagem(Parabens, voc acertou. O nmero mgico +
numero_magico + . Voc fez + pontuacao + pontos);
Se por acaso os valores das variveis numero_jogador e numero_magico
forem diferentes, ento vou verificar se a pontuao dele igual a 10 (pois a
medida que o usurio erra o nmero mgico, vai perdendo 10 pontos). Veja
a comparao abaixo:

import android.app.Activity
import android.app.AlertDi
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import java.math.*;

else if(pontuacao == 10) {


:
Ento se a condio acima for verdadeira, mostrar uma mensagem na tela
informando ao usurio que ele perdeu o jogo e, tambm, mostra o valor do
nmero mgico gerado pelo computador. Veja no cdigo abaixo:
mostrarMensagem(Voc perdeu. O nmero mgico era +
numero_magico);
Se por acaso a pontuao no for igual a 10, significa que o usurio errou
o nmero mgico mais ainda no perdeu o jogo, logo, vou verificar se o
nmero informado pelo usurio maior do que o nmero mgico, conforme
podemos ver abaixo:

Se a condio acima for verdadeira, sero descontados 10 pontos da


pontuao geral e ser mostrada uma mensagem informando ao usurio
que o nmero informado maior do que o nmero mgico, conforme voc
pode conferir na figura abaixo:
mostrarMensagem(O nmero informado maior do que o
nmero mgico.);
ednumero.setText();
//Desconta 10 pontos
pontuacao-=10;

Book Apostila.indb 101

ednumero = (EditText)
btjogar = (Button) findV

numero_magico = (int)
pontuacao = 100;

else if(numero_jogador > numero_magico) {


:

101

public class AppNumeros


/** Called when the activi

EditText ednumero;

Button btjogar;

int numero_magico

int pontuacao;

@Override
public void onCreate(Bu
super.onCreate(saved
setContentView(R.layo

Se observarmos no cdigo acima, existe um comando chamado setText ,


cujo valor passado no parmetro uma String vazia. O setText permite que
alterar o contedo de uma EditText, em tempo de execuo.

27/01/2012 15:13:52

btjogar.setOnClickListe

@O
public void

int numer


numero_jo
.toString());


//Compara

if(numero_

i l e

( J A V A )

tText().toString());

hamada numero_jogador,
do convertido em int (pois
o conseguida atravs do
er. Em seguida comparo o
mero mgico, pela instruo

usurio acertou o valor do


gem informando ao usurio
orme mostrado abaixo:

O nmero mgico +
+ pontos);

ogador e numero_magico
o dele igual a 10 (pois a
i perdendo 10 pontos). Veja

rar uma mensagem na tela


tambm, mostra o valor do
o cdigo abaixo:

gico era +

gnifica que o usurio errou


go, logo, vou verificar se o
o nmero mgico, conforme

escontados 10 pontos da
em informando ao usurio
ero mgico, conforme voc

or do que o

mando chamado setText ,


zia. O setText permite que
de execuo.

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Agora se por acaso o nmero informado for menor do que o nmero mgico
gerado pelo computador, sero descontados 10 pontos da pontuao geral
e ser mostrada uma mensagem informando ao usurio que o nmero
informado menor do que o nmero mgico, conforme voc pode conferir
na figura abaixo:
mostrarMensagem(O nmero informado menor do que o nmero
mgico.);
ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;
Vamos agora conferir abaixo,
AppNumerosMagicos.java:

cdigo

completo

do

arquivo

package br.com.appjogonumeros;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import java.math.*;
public class AppNumerosMagicos extends Activity {
/** Called when the activity is first created. */

EditText ednumero;

Button btjogar;

int numero_magico;

int pontuacao;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ednumero = (EditText) findViewById(R.id.ednumero);
btjogar = (Button) findViewById(R.id.btjogar);
numero_magico = (int) (Math.round(Math.random() * 19) + 1);
pontuacao = 100;
btjogar.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {

int numero_jogador;


numero_jogador = Integer.parseInt(ednumero.getText()
.toString());


//Compara e verifica se ele acertou

if(numero_jogador == numero_magico) {

Book Apostila.indb 102

102

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

mostrarMensagem(Parabens, voc acertou. O nmero


mgico + numero_magico + . Voc fez

+ pontuacao + pontos);



} else if(pontuacao == 10) {


mostrarMensagem(Voc perdeu. O nmero mgico era
+
numero_magico);



} else if(numero_jogador > numero_magico) {


mostrarMensagem(O nmero informado maior do que o
nmero mgico.);

ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

} else {


mostrarMensagem(O nmero informado menor do que o
nmero mgico.);


ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

}

}
});

C o n h e c e n d

Colocand

Quando o emulador do And


que ele uma espcie de S
do dispositivo e no lado dire
mostra a figura seguinte:

}
public void mostrarMensagem(String msg) {

AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);
dialogo.setMessage(msg);
dialogo.setTitle(Aviso);
dialogo.setNeutralButton(OK, null);
dialogo.show();

}

Emulado

}
Agora vamos executar o nosso jogo. Para isso siga os passos descritos.
Para executarmos o nosso projeto, basta clicar com o boto direito sobre a
pasta JogoDosNumerosMagicos e ser exibido um menu. Selecione Run
As e em seguida selecione Android Application, conforme voc confere
na figura seguinte:

No incio da execuo do e
v na figura acima. Depois
cinza em animao. Isso de
da sua mquina. recome
memria e um processado
execuo) para a aplicao
muito simples.

Passado o tempo que cit


tambm algumas mensage
nessa tela abaixo:

103

Book Apostila.indb 103

27/01/2012 15:13:53

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

, voc acertou. O nmero


fez

rdeu. O nmero mgico era

mero_magico) {

informado maior do que o

nformado menor do que o

Colocando nosso jogo para executar


Quando o emulador do Android executado pela primeira vez, podemos ver
que ele uma espcie de SmartPhone. Do lado esquerdo ns temos a tela
do dispositivo e no lado direito temos o teclado com suas funes, conforme
mostra a figura seguinte:

s);

ga os passos descritos.

com o boto direito sobre a


o um menu. Selecione Run
on, conforme voc confere

Emulador do Android em Execuo


No incio da execuo do emulador mostra o ttulo Android, conforme voc
v na figura acima. Depois vem outro ttulo escrito Android, com um titulo
cinza em animao. Isso demora em torno de 2 a 10 minutos (dependendo
da sua mquina. recomendvel que voc tenha no mnimo 512 MB de
memria e um processador bem rpido para um bom desempenho da
execuo) para a aplicao ser exibida, mesmo sendo essa aplicao algo
muito simples.
Passado o tempo que citei acima, ser mostrada a nossa aplicao e
tambm algumas mensagens, s cancel-las. Quando o emulador chegar
nessa tela abaixo:

104

Book Apostila.indb 104

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

Agora vamos nas propried


adicionar e mudar os seguin
TextView

O resultado voc confere na

Emulador do Android em Execuo


Clique no boto redondo com o titulo MENU para desbloquear a tela e a
aplicao continuar a processar at ser carregada com sucesso, conforme
mostra a figura abaixo:

Agora iremos adicionar


AppNumerosMagicos.java
vamos declarar o seguinte o
TextView txtpontuacao;

Jogo em execuo
At aqui conseguimos desenvolver o nosso primeiro jogo. Isso j foi
um grande salto. Poderamos muito bem dar uma melhorada no jogo
desenvolvido acima. Por exemplo, observe que a pontuao s exibida
quando o usurio ganha o jogo. Vamos no arquivo de layout para adicionar
uma TextView logo abaixo do Button. O resultado voc confere na figura
seguinte:

Dentro do mtodo onCrea

btjogar = (Button) findViewB


Insira o seguinte cdigo:

txtpontuacao = (TextView) fi

Agora logo aps a linha (ain


pontuacao = 100;
Insira a linha:

txtpontuacao.setText(Pont

Nas linhas de cdigo ond


condies que verificam se
que o nmero mgico, exist

105

Book Apostila.indb 105

Layout da aplicao

27/01/2012 15:13:53

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Agora vamos nas propriedades abaixo do componente que acabamos de


adicionar e mudar os seguintes valores:
TextView

O resultado voc confere na figura abaixo:

xecuo

para desbloquear a tela e a


da com sucesso, conforme

primeiro jogo. Isso j foi


r uma melhorada no jogo
e a pontuao s exibida
ivo de layout para adicionar
ado voc confere na figura

Layout da aplicao
Agora iremos adicionar pequenas linhas de cdigo no arquivo
AppNumerosMagicos.java. Na seo onde declaramos os nossos objetos,
vamos declarar o seguinte objeto abaixo:
TextView txtpontuacao;
Dentro do mtodo onCreate, logo aps a linha:
btjogar = (Button) findViewById(R.id.btjogar);
Insira o seguinte cdigo:
txtpontuacao = (TextView) findViewById(R.id.txtpontuacao);
Agora logo aps a linha (ainda dentro do mtodo onCreate):
pontuacao = 100;
Insira a linha:
txtpontuacao.setText(Pontuao: + pontuacao);
Nas linhas de cdigo onde so executados blocos de comandos nas
condies que verificam se o valor informado pelo usurio maior/menor do
que o nmero mgico, existe a seguinte linha de cdigo:

106

Book Apostila.indb 106

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

pontuacao-=10;

C o n h e c e n d

mostrarMensagem pela
mostrar uma mensagem na
mostrado que o usurio a
opo se ele quer continua
precisa clicar no boto SIM
setPositiveButton, conform

Para cada uma delas, logo em seguida, insira a linha:


Insira a linha:
txtpontuacao.setText(Pontuao: + pontuacao);
A seguinte linha de cdigo atualiza o valor da pontuao do jogador no
componente TextView inserido.
Agora dentro da condio que verifica se o nmero informado pelo usurio
igual ao do nmero mgico:
if(numero_jogador == numero_magico) {
:
Vamos substituir o cdigo dentro dessa condio pelo seguinte cdigo
abaixo:
AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);

dialogo.setTitle(Aviso);

dialogo.setMessage(Parabens, voc acertou. O nmero mgico +
numero_magico + . Voc fez + pontuacao + pontos. Deseja
continuar ?);

dialogo.setPositiveButton(SIM, new
DialogInterface.OnClickListener() {


@Override

public void onClick(DialogInterface arg0, int arg1) {


//Gera um novo nmero aleatorio e restaura os pontos

numero_magico =(int) (Math.round(Math.random() * 19) + 1);

pontuacao = 100;

txtpontuacao.setText(Pontuao: + pontuacao);

}
});

Book Apostila.indb 107

Observe que esse mtodo


colocamos com SIM mas
que ser executada se ele
executada caso o boto se
interface DialogInterface
onClick que ser executa
Vejamos abaixo o cdigo do

numero_magico =(int) (Math


pontuacao = 100;
txtpontuacao.setText(Pont

O cdigo acima j tivemos


outras partes do programa.
e atualiza a pontuao.

Tambm definimos para a


mtodo setNegativeButton

dialogo.setNegativeButton(
:

Observe que esse mtodo


colocamos com NO ma
que ser executada se ele
executada caso o boto se
interface DialogInterface
onClick que ser executa
Vejamos abaixo o cdigo do

AppNumerosMagicos.this.fi

O comando acima finaliza (f


dialogo.setNegativeButton(NO, new
DialogInterface.OnClickListener() {


@Override

public void onClick(DialogInterface arg0, int arg1) {


//Sai da aplicao

AppNumerosMagicos.this.finish();

}
});

dialogo.show();

107

dialogo.setPositiveButton(S
:

Agora dentro da condio


voc confere abaixo:
else if(pontuacao == 10) {
:

Substitua o cdigo dentro d

Vamos entender o cdigo acima. Observe que substitumos a funo

27/01/2012 15:13:53

AlertDialog.Builder dialogo
AlertDialog.Builder(AppNum

dialogo.setTitle(Aviso);

i l e

( J A V A )

inha:

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

mostrarMensagem pela classe AlertDialog, cuja funo de ambas


mostrar uma mensagem na tela. A diferena que nessa mensagem, ser
mostrado que o usurio acertou o nmero mgico e tambm lhe dar a
opo se ele quer continuar ou no. Para que o usurio continue o jogo ele
precisa clicar no boto SIM, e esse boto foi inserido atravs do mtodo
setPositiveButton, conforme voc confere abaixo:

;
pontuao do jogador no

ro informado pelo usurio

dialogo.setPositiveButton(SIM, new
:
Observe que esse mtodo possui dois parmetros : o ttulo do boto (que
colocamos com SIM mas tambm poderia ser outra palavra) e uma ao
que ser executada se ele for clicado. Aqui definimos uma ao que ser
executada caso o boto seja clicado, e essa ao foi definida atravs da
interface DialogInterface onde dentro dela existe um mtodo chamado
onClick que ser executado toda vez que o boto SIM for acionado.
Vejamos abaixo o cdigo do mtodo onClick.

io pelo seguinte cdigo


numero_magico =(int) (Math.round(Math.random() * 19) + 1);
pontuacao = 100;
txtpontuacao.setText(Pontuao: + pontuacao);
O cdigo acima j tivemos a oportunidade de coment-lo anteriormente em
outras partes do programa. Ele simplesmente gera um novo nmero mgico
e atualiza a pontuao.
nmero mgico +
pontos. Deseja

ce arg0, int arg1) {



o e restaura os pontos
nd(Math.random() * 19) + 1);

o: + pontuacao);

ace arg0, int arg1) {


sh();

ue substitumos a funo

Tambm definimos para a nossa mensagem o boto NO atravs do


mtodo setNegativeButton, conforme voc confere abaixo:
dialogo.setNegativeButton(NO, new
:
Observe que esse mtodo possui dois parmetros : o ttulo do boto (que
colocamos com NO mas tambm poderia ser outra palavra) e uma ao
que ser executada se ele for clicado. Aqui definimos uma ao que ser
executada caso o boto seja clicado, e essa ao foi definida atravs da
interface DialogInterface onde dentro dela existe um mtodo chamado
onClick que ser executado toda vez que o boto NO for acionado.
Vejamos abaixo o cdigo do mtodo onClick.
AppNumerosMagicos.this.finish();
O comando acima finaliza (fecha) o jogo atravs do mtodo finish.
Agora dentro da condio que verifica se a pontuao igual a 10, como
voc confere abaixo:
else if(pontuacao == 10) {
:
Substitua o cdigo dentro dele pelo cdigo seguinte:
AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);

dialogo.setTitle(Aviso);

Book Apostila.indb 108

108

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

dialogo.setMessage(Voc perdeu. O nmero mgico +


numero_magico + . Deseja continuar ?);

dialogo.setPositiveButton(SIM, new
DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface arg0, int arg1) {


//Gera um novo nmero aleatorio e restaura os pontos

numero_magico = (int)
(Math.round(Math.random() * 19) + 1);

@Override
public void onCreate(Bun
super.onCreate(savedI
setContentView(R.layo

ednumero = (EditText)
btjogar = (Button) findV
txtpontuacao = (TextVi

numero_magico = (int)
pontuacao = 100;


pontuacao = 100;

txtpontuacao.setText(Pontuao: + pontuacao);


}
});

txtpontuacao.setText(

dialogo.setNegativeButton(NO, new
DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface arg0, int arg1) {

//Sai da aplicao
AppNumerosMagicos.this.finish();

}
});

dialogo.show();
O cdigo dentro dessa condio similar ao cdigo j inserido anteriormente
, logo, todas as funcionalidades presentes dentro desse cdigo j foram
devidamente explicadas em demonstraes anteriores.
Veja como ficou o novo cdigo do arquivo AppNumerosMgicos.java :
package br.com.appjogonumeros;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.*;
import android.view.*;

public class AppNumerosMagicos extends Activity {


EditText ednumero;
Button btjogar;
TextView txtpontuacao;
int numero_magico;
int pontuacao;

Book Apostila.indb 109

btjogar.setOnClickListe


@Override

public void onClic

int numero_


numero_jog
toString());


//Compara


if(numero_j


AlertDialog
AlertDialog.Builder


dialogo.se


dialogo.se
mgico + numer

+ pontuaca

dialogo.set
DialogInterface.OnC


@Override

public void


//Gera um

numero_m
1);


pontuaca

txtpontuacao.

}
});

import java.math.*;

109

C o n h e c e n d

dialogo.set
DialogInterface.OnC

@O

27/01/2012 15:13:53

i l e

( J A V A )

gico +

ce arg0, int arg1) {



o e restaura os pontos

o: + pontuacao);

ogInterface arg0, int arg1) {



o
agicos.this.finish();

go j inserido anteriormente
ntro desse cdigo j foram
eriores.

NumerosMgicos.java :

ity {

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ednumero = (EditText) findViewById(R.id.ednumero);
btjogar = (Button) findViewById(R.id.btjogar);
txtpontuacao = (TextView) findViewById(R.id.txtpontuacao);
numero_magico = (int) (Math.round(Math.random() * 19) + 1);
pontuacao = 100;
txtpontuacao.setText(Pontuao: + pontuacao);
btjogar.setOnClickListener(new View.OnClickListener() {


@Override

public void onClick(View arg0) {

int numero_jogador;


numero_jogador = Integer.parseInt(ednumero.getText().
toString());


//Compara e verifica se ele acertou


if(numero_jogador == numero_magico) {


AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);


dialogo.setTitle(Aviso);


dialogo.setMessage(Parabens, voc acertou. O nmero
mgico + numero_magico + . Voc fez

+ pontuacao + pontos. Deseja continuar ?);

dialogo.setPositiveButton(SIM, new
DialogInterface.OnClickListener() {


@Override

public void onClick(DialogInterface arg0, int arg1) {


//Gera um novo nmero aleatorio e restaura os pontos

numero_magico = (int) (Math.round(Math.random() * 19) +
1);

pontuacao = 100;

txtpontuacao.setText(Pontuao: + pontuacao);

}
});

dialogo.setNegativeButton(NO, new
DialogInterface.OnClickListener() {

@Override

Book Apostila.indb 110

110

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

public void onClick(DialogInterface arg0, int arg1) {

//Sai da aplicao
AppNumerosMagicos.this.finish();

}
});

dialogo.show();


} else if(pontuacao == 10) {

AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);


dialogo.setTitle(Aviso);


dialogo.setMessage(Voc perdeu. O nmero mgico
+
numero_magico + . Deseja continuar ?);


dialogo.setPositiveButton(SIM, new
DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface arg0, int arg1) {


//Gera um novo nmero aleatorio e restaura os
// Pontos

numero_magico = (int) (Math.round(Math.random()
* 19) + 1);

pontuacao = 100;

txtpontuacao.setText(Pontuao: + pontuacao);

}
});

public void mostrarMens



AlertDialog.Builder dialo
AlertDialog.Builder(App
dialogo.setMessage(ms
dialogo.setTitle(Aviso
dialogo.setNeutralButto
dialogo.show();

}
}

Agora vamos colocar a no


resultado na figura abaixo:

111

Book Apostila.indb 111

dialogo.setNegativeButton(NO, new
DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface arg0, int arg1){


//Sai da aplicao


AppNumerosMagicos.this.finish();

}
});

dialogo.show();



} else if(numero_jogador > numero_magico) {


mostrarMensagem(O nmero informado maior do que o
nmero mgico.);

ednumero.setText();


//Descont

pontuacao

ednumero


} else {


mostrarMe
nmero mgico.);
ednumero.

//Desconta
pontuacao

ednumero.

}

}
});

27/01/2012 15:13:53

Nova ve

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

ogInterface arg0, int arg1) {

o
agicos.this.finish();

os.this);

rdeu. O nmero mgico


//Desconta 10 pontos

pontuacao-=10;

ednumero.setText(Pontuao: + pontuacao);


} else {


mostrarMensagem(O nmero informado menor do que o
nmero mgico.);
ednumero.setText();

//Desconta 10 pontos
pontuacao-=10;

ednumero.setText(Pontuao: + pontuacao);

}

}
});

?);

M, new

public void mostrarMensagem(String msg) {



AlertDialog.Builder dialogo = new
AlertDialog.Builder(AppNumerosMagicos.this);
dialogo.setMessage(msg);
dialogo.setTitle(Aviso);
dialogo.setNeutralButton(OK, null);
dialogo.show();

}

ogInterface arg0, int arg1) {



o aleatorio e restaura os

Math.round(Math.random()
}

Pontuao: + pontuacao);

}

Agora vamos colocar a nova verso do nosso jogo para executar. Veja o
resultado na figura abaixo:

NO, new

ogInterface arg0, int arg1){



Nova verso do jogo em execuo


ro_magico) {

informado maior do que o

112

Book Apostila.indb 112

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

Depois disso, selecione o c


as suas propriedades, confo

A widget RadioButton
A widget RadioButon um componente que funciona
normalmente utilizado em questes de mltipla escolha.

C o n h e c e n d

como opo ,
TextView

A widget ImageView
A widget ImageView um componente onde ele podemos visualizar/carregar
imagens que desejamos.

Veja como ficou na figura se

7.2 Desenvolvendo um jogo do Joquemp


Agora vamos desenvolver um jogo baseado no Joquemp. O Joquemp
normalmente conhecido como o jogo do pedra/papel/tesoura. As regras do
jogo so a seguinte:

Agora vamos adicionar, o


propriedades abaixo:
TextView

Nesse jogo que iremos desenvolver, o jogador ira competir com o computador.
Primeiramente o jogador ir efetuar a sua jogada e em seguida, clica no
boto para jogar com o computador onde ser mostrada em uma outra
tela, a jogada de ambos e a situao do jogo. Bom, mos a obra.

Em seguida, insira um co
propriedades:
RadioGroup

Crie um projeto com os seguintes dados abaixo:


Project name : JogoDoJoquempo

Dentro da RadioGroup exist


um deles est respectivam
Vamos alterar as proprieda
a tabela abaixo:

Application name : Jogo do Joquemp


Package name: br.com.appjoquempo
Create Activity : AppJoquempo

radio0 (RadioButton)

Min SDK Version : 7


Agora vamos carregar o arquivo main.xml. Feito isso, selecione a estrutura
LinearLayout para mudarmos a sua cor de fundo. Para mudarmos a cor de
fundo da estrutura basta irmos na propriedade Background e informamos a
cor desejada. Um detalhe que precisa ser mencionado aqui que a dor deve
ser informado em seu valor hexadecimal. No nosso caso vamos trabalhar
com a cor de fundo branca, logo, sua representao em hexadecimal ser
#ffffff (com # na frente). Veja como ficou na tabela abaixo:
LinearLayout

113

Book Apostila.indb 113

27/01/2012 15:13:53

radio1 (RadioButton)

i l e

funciona
escolha.

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Depois disso, selecione o componente TextView j inserido e vamos mudar


as suas propriedades, conforme tabela abaixo:
como opo ,
TextView

podemos visualizar/carregar

uemp

Veja como ficou na figura seguinte:

Joquemp. O Joquemp
papel/tesoura. As regras do

competir com o computador.


da e em seguida, clica no
r mostrada em uma outra
om, mos a obra.

o isso, selecione a estrutura


do. Para mudarmos a cor de
ackground e informamos a
onado aqui que a dor deve
nosso caso vamos trabalhar
ao em hexadecimal ser
ela abaixo:

Tela da aplicao
Agora vamos adicionar, o componentes TextView e alterar as seguintes
propriedades abaixo:
TextView

Em seguida, insira um componente RadioGroup e altere as seguintes


propriedades:
RadioGroup

Dentro da RadioGroup existem trs componentes do tipo RadioButton , cada


um deles est respectivamente com as Ids radio0, radio1 e radio2.
Vamos alterar as propriedades de cada um deses componentes conforme
a tabela abaixo:
radio0 (RadioButton)

radio1 (RadioButton)

114

Book Apostila.indb 114

27/01/2012 15:13:53

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

radio2 (RadioButton)

Vejamos agora como ficou a tela da aplicao na figura seguinte:

Tela da aplicao
Agora vamos inserir um componente Button, e alterar em seguida as
seguintes propriedades:
Button

Agora se por acaso o me


preocupe, siga este procedi
layout e em seguida selec
uma caixa de dilogo. Expa
XML File, conforme mostra

Vejamos agora como ficou a tela final da primeira tela do nosso jogo:

Tela da aplicao
At agora terminamos a primeira tela do nosso jogo, porm, nosso jogo ter
duas telas. Para criamos mais uma tela (arquivo XML) para a nosso jogo, siga
os passos aqui descritos. Vamos clicar com o boto direito do mouse sobre
a pasta layout, situada em nosso projeto, e em seguida seleciona New /
Android XML File, conforme mostrado na figura seguinte:

Selecionan

115

Book Apostila.indb 115

27/01/2012 15:13:54

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

a figura seguinte:

e alterar em seguida as

Agora se por acaso o menu Android XML File no aparecer, no se


preocupe, siga este procedimento. Clique com o boto direito sobre a pasta
layout e em seguida selecione New/Others, que em seguida ser aberta
uma caixa de dilogo. Expanda a pasta Android e l voc ver o Android
XML File, conforme mostra a figura seguinte:

a tela do nosso jogo:

ogo, porm, nosso jogo ter


XML) para a nosso jogo, siga
oto direito do mouse sobre
m seguida seleciona New /
ra seguinte:

Selecionando a opo Android XML File

Book Apostila.indb 116

116

27/01/2012 15:13:54

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

Depois de selecionar a opo Android XML File ser aberta uma caixa de
dilogo conforme mostra a figura abaixo:

Com a estrutura LinearLayo


conforme a tabela abaixo:
LinearLayout

A propriedade Gravity tem


ou vertical) a disposio do
Escolhermos o valor cen
centralizados dentro da estru
do valor da propriedade O

Agora dentro dessa estrutu


padro linearLayout01),
conforme podemos ver na fi

Layo

Para esse jogo vamos fa


jogadas do computador e d

Android XML File


No Campo File vamos digitar o nome do nosso arquivo que ser a segunda
tela da nossa aplicao. O nome desse arquivo ser resultado (sem a
extenso .xml). Em seguida basta clicam em Finish para que ele crie o
arquivo.
Depois de criado o arquivo, vamos mudar as seguintes propriedades da
estrutura LinearLayout.
LinearLayout

Depois de alterado as propriedades acima, vamos adicionar dentro dessa


tela (estrutura) uma outra estrutura LinearLayout (que se encontra na seo
Layouts). Veja o resultado na figura abaixo:

Essas imagens que utilizare


pasta drawable-mdpi. Pa
copi-las do seu lugar de o
sobre a pasta drawable-m
Agora vamos colocar dentro
LinearLayout, abaixo da ou
abaixo:

Adicionando a estrutura LinearLayout

117

Book Apostila.indb 117

27/01/2012 15:13:54

i l e

( J A V A )

e ser aberta uma caixa de

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

Com a estrutura LinearLayout adicionada, vamos alterar uma propriedade ,


conforme a tabela abaixo:
LinearLayout

A propriedade Gravity tem a finalidade de organizar (de forma horizontal


ou vertical) a disposio dos componentes de acordo com sua orientao.
Escolhermos o valor center fazendo com que os componentes sejam
centralizados dentro da estrutura (de forma horizontal ou vertical, dependendo
do valor da propriedade Orientation).
Agora dentro dessa estrutura que adicionamos agora (que se chama por
padro linearLayout01), vamos adicionar um componente TextView ,
conforme podemos ver na figura seguinte:

Layout da tela da aplicao


Para esse jogo vamos fazer o uso de imagens que vo representar as
jogadas do computador e do jogador. Confira as imagens abaixo:

arquivo que ser a segunda


vo ser resultado (sem a
Finish para que ele crie o

seguintes propriedades da

mos adicionar dentro dessa


(que se encontra na seo

Essas imagens que utilizaremos em nosso jogo tero que estar dentro da
pasta drawable-mdpi. Para adicionar as imagens dentro da pasta basta
copi-las do seu lugar de origem e em seguida, clicar com o boto direito
sobre a pasta drawable-mdpi e em seguida selecionar Paste (colar).
Agora vamos colocar dentro da tela da nossa aplicao uma nova estrutura
LinearLayout, abaixo da outra que colocamos, conforme mostra a figura
abaixo:

earLayout
Layout da aplicao

118

Book Apostila.indb 118

27/01/2012 15:13:54

G a m e

M o b i l e

( J A V A )

C o n h e c e n d

Agora vamos alterar as propriedades dessa estrutura, conforme a tabela


abaixo:
LinearLayout

Agora vamos adicionar dois componentes do tipo ImageView dentro dessa


estrutura (o componente ImageView se encontra na seo Images &
Media). O resultado voc confere na figura abaixo:

Agora vamos alterar a prop


LinearLayout

Layout da aplicao
Na imagem da esquerda, vamos alterar as seguintes propriedades abaixo:

Vamos inserir dentro dessa


alterar suas propriedades c

ImageView

TextView

Na outra imagem vamos alterar as seguintes propriedades abaixo:


ImageView

E por ultimo, vamos adic


estrutura que possui a TextV
alterar as propriedades con

Confira o resultado na figura seguinte:

Button

Veja como ficou a tela da no

Layout da aplicao
Agora vamos adicionar novamente uma estrutura LinearLayout abaixo da
estrutura na qual comporta as imagens, conforme mostra a figura abaixo.

119

Book Apostila.indb 119

27/01/2012 15:13:54

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

strutura, conforme a tabela

po ImageView dentro dessa


ontra na seo Images &
xo:

Layout da aplicao
Agora vamos alterar a propriedade conforme a tabela abaixo:
LinearLayout

ntes propriedades abaixo:


Vamos inserir dentro dessa estrutura um componente TextView e em seguida
alterar suas propriedades conforme a tabela abaixo:
TextView

priedades abaixo:

E por ultimo, vamos adicionar um componente Button logo abaixo da


estrutura que possui a TextView modificada anteriormente. Feito isso vamos
alterar as propriedades conforme a tabela abaixo:
Button

Veja como ficou a tela da nossa aplicao na figura abaixo:

ura LinearLayout abaixo da


me mostra a figura abaixo.

Layout da aplicao

Book Apostila.indb 120

120

27/01/2012 15:13:54

G a m e

M o b i l e

( J A V A )

Agora vamos no arquivo AppJoquempo.java para inserir o cdigo abaixo:


package br.com.appjoquempo;
import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import java.math.*;

private void Carrega



setConten


imagem_jo
findViewById(R.id.im


imagem_co
findViewById(R.id.im

Book Apostila.indb 121

public class AppJoquempo extends Activity {


/** Called when the activity is first created. */


final int OPCAO_PAPEL = 1;

final int OPCAO_PEDRA = 2;

final int OPCAO_TESOURA = 3;


int opcao_jogador, opcao_computador, opcao_escolhida;


RadioGroup rgopcoes;

ImageView imagem_jogador, imagem_computador;

Button btjogar, btvoltar;

TextView txtstatus;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CarregarTelaPrincipal();

121

C o n h e c e n d

public void CarregarTelaPrincipal() {




setContentView(R.layout.main);


rgopcoes = (RadioGroup) findViewById(R.id.rgopcoes);

btjogar = (Button) findViewById(R.id.btjogar);


btjogar.setOnClickListener(new View.OnClickListener() {


public void onClick(View v) {

// TODO Auto-generated method stub


opcao_escolhida = rgopcoes.getCheckedRadioButtonId();


switch(opcao_escolhida) {


case R.id.rbtpapel : opcao_jogador = OPCAO_PAPEL; break;

case R.id.rbtpedra : opcao_jogador = OPCAO_PEDRA; break;

case R.id.rbttesoura : opcao_jogador = OPCAO_TESOURA;
break;


}


opcao_computador = (int) Math.round(Math.random() * 2) + 1;


CarregarTelaResultado();

27/01/2012 15:13:54

txtstatus =


btvoltar = (B


if(opcao_jo


imagem_jo
(R.drawable.papel_

if(opcao_c


imagem
(R.drawable.pape


txtstatus

} el

im
(R.drawable.ped
txt

} el
{


im
(R.drawable.te


tx

}


} else if(op

ima
(R.drawable.ped

i l e

( J A V A )

ara inserir o cdigo abaixo:

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d





}
});

}
private void CarregarTelaResultado() {

setContentView(R.layout.resultado);


imagem_jogador = (ImageView)
findViewById(R.id.imagem_jogador);

opcao_escolhida;

imagem_computador = (ImageView)
findViewById(R.id.imagem_computador);

omputador;

State) {

R.id.rgopcoes);
gar);

ClickListener() {

kedRadioButtonId();

OPCAO_PAPEL; break;
= OPCAO_PEDRA; break;
ador = OPCAO_TESOURA;

(Math.random() * 2) + 1;

txtstatus = (TextView) findViewById(R.id.txtstatus);


btvoltar = (Button) findViewById(R.id.btvoltar);


if(opcao_jogador == OPCAO_PAPEL) {


imagem_jogador.setImageResource
(R.drawable.papel_jogador);

if(opcao_computador == OPCAO_PAPEL) {


imagem_computador.setImageResource
(R.drawable.papel_computador);

txtstatus.setText(Empate);

} else if(opcao_computador == OPCAO_PEDRA) {

imagem_computador.setImageResource
(R.drawable.pedra_computador);
txtstatus.setText(Voc ganhou);

} else if(opcao_computador == OPCAO_TESOURA)
{


imagem_computador.setImageResource
(R.drawable.tesoura_computador);

txtstatus.setText(Voc perdeu);

}


} else if(opcao_jogador == OPCAO_PEDRA) {

imagem_jogador.setImageResource
(R.drawable.pedra_jogador);

Book Apostila.indb 122

122

27/01/2012 15:13:54

G a m e

M o b i l e

( J A V A )


if(opcao_computador == OPCAO_PAPEL) {

imagem_computador.setImageResource
(R.drawable.papel_computador);
txtstatus.setText(Vco perdeu);

} else if(opcao_computador == OPCAO_PEDRA) {


imagem_computador.setImageResource
(R.drawable.pedra_computador);

C o n h e c e n d



}
});





}
}


txtstatus.setText(Empate);

} else if(opcao_computador == OPCAO_TESOURA)
{


imagem_computador.setImageResource
(R.drawable.tesoura_computador);

txtstatus.setText(Voc ganhou);

}


} else if(opcao_jogador == OPCAO_TESOURA) {

imagem_jogador.setImageResource
(R.drawable.tesoura_jogador);

if(opcao_computador == OPCAO_PAPEL) {

imagem_computador.setImageResource
(R.drawable.papel_computador);

123

Book Apostila.indb 123


txtstatus.setText(Voc ganhou);

} else if(opcao_computador == OPCAO_PEDRA) {


imagem_computador.setImageResource
(R.drawable.pedra_computador);

txtstatus.setText(Voc perdeu);

} else if(opcao_computador == OPCAO_TESOURA)
{


imagem_computador.setImageResource
(R.drawable.tesoura_computador);

txtstatus.setText(Empate);

}


}


btvoltar.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0) {
// TODO Auto-generated method stub

27/01/2012 15:13:54

Irei comentar algumas


neste programa existem
CarregaResultado. O m
por carregar a tela inicia
das opes e efetuar a
de cdigo importantes de
dentro do mtodo onCl
btjogar:

opcao_escolhida = rgopcoe

Na linha de cdigo acima, a


como atribuio o valor ret
do objeto rgopcoes, que
selecionado (que armazen

switch(opcao_escolhida)


case R.id.rbtpap

case R.id.rbtped

case R.id.rbtt
break;


}
avaliada na estrutura swit
o usurio jogar papel a va
o valor contido na constante
as outras jogadas. Na linha

opcao_computador = (int) M

A escolhida aleatoriamente
3, onde cada um representa
no programa : OPCAO_PA
linha seguinte:
CarregarTelaResultado();

Carrega a tela onde ser e


e com o resultado do jogo
mtodo CarregarTelaResult

if(opcao_jogador == OPCAO

i l e

( J A V A )

= OPCAO_PAPEL) {

etImageResource

perdeu);

ador == OPCAO_PEDRA) {

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

CarregarTelaPrincipal();

}
});





}

setImageResource
}

ate);

ador == OPCAO_TESOURA)

setImageResource

ganhou);

Irei comentar algumas linhas de cdigo acima. Observe que


neste programa existem dois mtodos: CarregaTelaPrincipal e
CarregaResultado. O mtodo CarregaTelaPrincipal responsvel
por carregar a tela inicial do jogo onde o usurio pode escolher uma
das opes e efetuar a jogada. Iri comentar aqui algumas linhas
de cdigo importantes dentro desse mtodo. Observe a linha abaixo
dentro do mtodo onClick implementado no componente (boto)
btjogar:
opcao_escolhida = rgopcoes.getCheckedRadioButtonId();

CAO_TESOURA) {

geResource

Na linha de cdigo acima, a varivel opo_escolhida (do tipo int) recebe


como atribuio o valor retornado pelo mtodo getCheckedRadioButtonId
do objeto rgopcoes, que retorna o nome do componente RadioButon
selecionado (que armazenado em um tipo int). no cdigo abaixo:

= OPCAO_PAPEL) {

etImageResource
ganhou);

ador == OPCAO_PEDRA) {

setImageResource

perdeu);

switch(opcao_escolhida) {


case R.id.rbtpapel : opcao_jogador = OPCAO_PAPEL; break;

case R.id.rbtpedra : opcao_jogador = OPCAO_PEDRA; break;

case R.id.rbttesoura : opcao_jogador = OPCAO_TESOURA;
break;


}
avaliada na estrutura switch a opo escolhida pelo jogador. Se por acaso
o usurio jogar papel a varivel opo_jogador receber como atribuio
o valor contido na constante OPCAO_PAPEL e assim sucessivamente para
as outras jogadas. Na linha seguinte:

ador == OPCAO_TESOURA)

setImageResource

pate);

View.OnClickListener() {

w arg0) {
generated method stub

opcao_computador = (int) Math.round(Math.random() * 2) + 1;


A escolhida aleatoriamente a jogada do computador (valor nmero entre 1 e
3, onde cada um representa uma jogada conforme as constantes declaradas
no programa : OPCAO_PAPEL, OPCAO_PEDRA e OPCAO_TESOURA). A
linha seguinte:
CarregarTelaResultado();
Carrega a tela onde ser exibida as jogadas do usurio e do computador
e com o resultado do jogo. Irei comentar agora alguns cdigos dentro do
mtodo CarregarTelaResultado. Vejamos o bloco de condies abaixo:
if(opcao_jogador == OPCAO_PAPEL) {

Book Apostila.indb 124

124

27/01/2012 15:13:55

G a m e

M o b i l e

( J A V A )

imagem_jogador.setImageResource
(R.drawable.papel_jogador);


if(opcao_computador == OPCAO_PAPEL) {

imagem_computador.setImageResource
(R.drawable.papel_computador);

txtstatus.setText(Empate);


} else if(opcao_computador == OPCAO_PEDRA) {


imagem_computador.setImageResource
(R.drawable.pedra_computador);

txtstatus.setText(Voc ganhou);

} else if(opcao_computador == OPCAO_TESOURA) {


imagem_computador.setImageResource
(R.drawable.tesoura_computador);
txtstatus.setText(Voc perdeu);

}
}
A primeira condio acima verifica se a jogada feita pelo usurio foi PAPEL.
Se a condio acima for verdadeira, carregada a imagem referente ao
usurio efetuando a jogada PAPEL, e em seguida, so feitas trs avaliaes
a respeito da jogada efetuada pelo computador. A primeira condio que
analisa a jogador do computador verifica o computador jogou PAPEL, logo,
papel com papel, ocorre um empate. Dentro dessa condio carregada a
imagem referente ao computador efetuando a jogada PAPEL e o status do
jogo (neste caso, empate). Se o computador no efetuou a jogada PAPEL,
verificado se ele jogou PEDRA. Se a condio for verdadeira, carregada
a imagem referente ao computador efetuando a jogada PEDRA e o status
do jogo (neste caso, o usurio vence pois PAPEL come PEDRA).
As demais condies sero executadas de acordo com as jogadas efetuadas
pelo usurio e pelo computador.
Vamos executar o nosso jogo. O resultado voc pode conferir nas figuras
seguintes:

125

Book Apostila.indb 125

Tela Principal do Jogo

27/01/2012 15:13:55

C o n h e c e n d

i l e

( J A V A )

C o n h e c e n d o

a s

W i d g e t s

d o

A n d r o i d

L) {

_PEDRA) {

ce

_TESOURA) {

Situao do Jogo

ce

ta pelo usurio foi PAPEL.


ada a imagem referente ao
da, so feitas trs avaliaes
r. A primeira condio que
utador jogou PAPEL, logo,
ssa condio carregada a
gada PAPEL e o status do
o efetuou a jogada PAPEL,
o for verdadeira, carregada
jogada PEDRA e o status
L come PEDRA).

o com as jogadas efetuadas

pode conferir nas figuras

126

Book Apostila.indb 126

27/01/2012 15:13:55

G a m e

M o b i l e

( J A V A )

ANOTAES

127

Book Apostila.indb 127

27/01/2012 15:13:55

G a m e

M o b i l e

C a p t u l o
A

e s t r u t u r a

d e

l a y o u t

e s t r u t u r

Captulo 08 A est

( J A V A )

A plataforma Google Andro


podemos utilizar em nossa
utilizada normalmente em
agora no desenvolvimento
Essa estrutura organiza e
dela de forma horizontal (u
outro). Agora, se precisarmo
objeto precise estar em um
de organizao ? Pra isso
AbsoluteLayout.

0 8
A b s o l u t e L a y o u t

Vamos aprender aqui como


jogo usando essa estrutura.

8.1 Movimentando um ob

Vamos criar agora uma apli


objeto na tela atravs das t
l, crie um projeto com os s

Project name : MovendoOb

Application name : Movend

Package name: br.com.app

Create Activity : AppObjeto


Min SDK Version : 7

Quando criamos um proje


LinearLayout e dentro dela,
Aqui neste programa, no ir
menos do componente Te
DELETAR o componente a
xml, para visualizarmos o c

<?xml version=1.0 encod


<LinearLayout
xmlns
android
android:orientation=vert
android:layout_width=fil
android:layout_height=fi
</LinearLayout>

Observe que a estrutura tra


ter que fazer uso da estrutu
vamos substituir a palavra L
pode ver em seguida:

<?xml version=1.0 encod


<AbsoluteLayout
xmlns
android
android:orientation=vert
android:layout_width=fil

Book Apostila.indb 128

27/01/2012 15:13:55

e s t r u t u r a

d e

l a y o u t

A b s o l u t e L a y o u t

Captulo 08 A estrutura de layout AbsoluteLayout

L a y o u t

A plataforma Google Android oferece vrios gerenciadores de layout que


podemos utilizar em nossas aplicaes. A estrutura de layout padro que
utilizada normalmente em uma aplicao Android (que trabalhamos at
agora no desenvolvimento de nossos jogos) a estrutura LinearLayout.
Essa estrutura organiza e disponibiliza os componentes inseridos dentro
dela de forma horizontal (um ao lado do outro) ou vertical (um ao lado do
outro). Agora, se precisarmos desenvolver um jogo em que um determinado
objeto precise estar em um ponto qualquer da tela, sem seguir uma regra
de organizao ? Pra isso precisaremos utilizar uma estrutura chamada
AbsoluteLayout.
Vamos aprender aqui como dar movimentos aos objetos na tela do nosso
jogo usando essa estrutura.
8.1 Movimentando um objeto na tela
Vamos criar agora uma aplicao em Android cujo objeto e movimentar um
objeto na tela atravs das teclas de direo existentes no emulador. Vamos
l, crie um projeto com os seguintes dados abaixo:
Project name : MovendoObjetos
Application name : Movendo Objetos na Tela
Package name: br.com.appobjeto
Create Activity : AppObjeto
Min SDK Version : 7
Quando criamos um projeto pela primeira vez, ela j cria uma estrutura
LinearLayout e dentro dela, existe um componente TextView com um texto.
Aqui neste programa, no iremos fazer uso da estrutura LinearLayout e muito
menos do componente TextView. A primeira coisa que iremos fazer ser
DELETAR o componente a estrutura e em seguida, vamos na guia main.
xml, para visualizarmos o cdigo XML, conforme voc confere abaixo:
<?xml version=1.0 encoding=utf-8?>
<LinearLayout
xmlns:android=http://schemas.android.com/apk/res/
android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent>
</LinearLayout>
Observe que a estrutura trabalhada acima e a LinearLayout, porm, vamos
ter que fazer uso da estrutura AbsoluteLayout na nossa aplicao. Para isso,
vamos substituir a palavra LinearLayout por AbsoluteLayout, conforme voc
pode ver em seguida:
<?xml version=1.0 encoding=utf-8?>
<AbsoluteLayout
xmlns:android=http://schemas.android.com/apk/res/
android
android:orientation=vertical
android:layout_width=fill_parent

129

Book Apostila.indb 129

27/01/2012 15:13:55

G a m e

M o b i l e

( J A V A )

e s t r u t u r

android:layout_height=fill_parent>
</AbsoluteLayout >

Agora vamos no arquivo


abaixo:

Agora vamos clicar na guia Graphical Layout para trabalharmos com a


parte visual do nosso projeto. Em nossa aplicao, iremos fazer uso de
duas imagens que vo estar situadas no diretrio
drawable-mdpi.
As imagens se chamam ceu.jpg e aviao.png, conforme voc pode ver
abaixo:

package br.com.appobjeto

import android.app.Activity
import android.os.Bundle;
import android.widget.*;
import android.view.*;

public class AppObjeto ex


Selecione a estrutura(tela) AbsoluteLayout e em seguida, altera a seguinte


propriedade conforme mostrado abaixo:
AbsoluteLayout

Em seguida, coloque um componente ImageView na tela da nossa aplicao.


Observe que o componente ficar no ponto da tela at onde foi arrastado
(pois a estrutura AbsoluteLayout me permite isso). Em seguida, altere as
seguintes propriedades conforme a tabela abaixo:

ImageView imgavia
@Override
public void onCreate(Bu
super.onCreate(saved
setContentView(R.layo
imgaviao = (ImageView
}

public boolean onKeyD




int left = imgaviao.g

int top = imgaviao.


switch (keyCode) {
case KeyE


case KeyE
case KeyE
case KeyE

}


//Move o aviao

MoverAviao(left, top


return false;
}

public void MoverAviao



imgaviao.setLayout
LayoutParams(imgaviao.get

imgaviao.getHeight
}
}

ImageView

Veja como ficou o resultado na figura seguinte:

Agora irei comentar as linhas


existe um mtodo chamado
(objeto) na tela. Vejamos ab

imgaviao.setLayoutParams(
AbsoluteLayout.LayoutPara
getHeight(), left, top));

130

Book Apostila.indb 130

O mtodo setLayoutParam
parmetros de um objeto (ne
de layout (que envolvem s
trabalhando sobre a estrutu
o mtodo LayoutParams

Tela da aplicao

27/01/2012 15:13:55

i l e

( J A V A )

para trabalharmos com a


ao, iremos fazer uso de
o
drawable-mdpi.
, conforme voc pode ver

m seguida, altera a seguinte

na tela da nossa aplicao.


tela at onde foi arrastado
sso). Em seguida, altere as
o:

e s t r u t u r a

d e

l a y o u t

A b s o l u t e L a y o u t

Agora vamos no arquivo AppObjeto.java e em seguida inserir o cdigo


abaixo:
package br.com.appobjeto;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
public class AppObjeto extends Activity {

ImageView imgaviao;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgaviao = (ImageView) findViewById(R.id.imgaviao);
}

public boolean onKeyDown(int keyCode, KeyEvent event) {




int left = imgaviao.getLeft();

int top = imgaviao.getTop();


switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: left-=10; break;


case KeyEvent.KEYCODE_DPAD_RIGHT: left+=10; break;
case KeyEvent.KEYCODE_DPAD_UP: top-=10; break;
case KeyEvent.KEYCODE_DPAD_DOWN: top+=10; break;

}


//Move o aviao

MoverAviao(left, top);


return false;
}
public void MoverAviao(int left, int top) {

imgaviao.setLayoutParams(new
LayoutParams(imgaviao.getWidth(),

imgaviao.getHeight(), left, top));
}
}

AbsoluteLayout.

Agora irei comentar as linhas de cdigo desse programa. Se ns observarmos,


existe um mtodo chamado MoverAviao, cuja finalidade deslocar o avio
(objeto) na tela. Vejamos abaixo o cdigo existente desse mtodo.
imgaviao.setLayoutParams(new
AbsoluteLayout.LayoutParams(imgaviao.getWidth(),
getHeight(), left, top));

i m g a v i a o .

O mtodo setLayoutParams, do objeto imgaviao, define um conjunto de


parmetros de um objeto (neste caso, a prpria imagem) sobre uma estrutura
de layout (que envolvem seu tamanho e posicionamento). Como estamos
trabalhando sobre a estrutura AbsoluteLayout , como parmetro, invocamos
o mtodo LayoutParams da classe AbsoluteLayout , cujos argumentos

Book Apostila.indb 131

131

27/01/2012 15:13:55

G a m e

M o b i l e

( J A V A )

desse mtodo so : largura (width), altura (height), posio x (left) e posio


y (top).
Para que possamos movimentar o nosso avio (objeto) na tela, nesta
aplicao, fizemos o uso do teclado. Para que possamos capturar as teclas
pressionadas, fizemos o uso do mtodo onKeyDown (j existente na classe
Activity , onde aqui definimos sua ao). Vejamos o cdigo dentro desse
mtodo.
As linhas de cdigo abaixo:
int left = imgaviao.getLeft();
int top = imgaviao.getTop();

e s t r u t u r

Se voc testou a aplica


pode sair de fora da tela
direes por um certo temp
onKeyDown, conforme voc

public boolean onKeyDow




int left = imgaviao.g

int top = imgaviao.


int largura_tela =
getWindowManager().g

Obtm as coordenadas X e Y, atravs dos mtodos getLeft e getTop , cujos


valores so atribudos para as variveis left e top. O bloco de instruo
seguinte:
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: left-=10; break;

case KeyEvent.KEYCODE_DPAD_RIGHT: left+=10; break;

case KeyEvent.KEYCODE_DPAD_UP: top-=10; break;

case KeyEvent.KEYCODE_DPAD_DOWN: top+=10; break;

}
Detecta o pressionamento das teclas. De acordo com a tecla de direo
pressionada, alterado o valor da varivel left ou top. J em seguida, no
cdigo abaixo:
MoverAviao(left, top);
Desloca (move) o avio na tela, passando como argumentos para a funo
acima as variveis left e top. Execute o programa e veja os resultados,
conforme a figura seguinte:

int altura_tela =
getWindowManager().g



switch (keyCode) {
case KeyE
case KeyE
case KeyE
case KeyE

}


if(left <= 0)

left = 0;

else if(left >= (larg

left = (largu


if(top <= 0)

top = 0;

else if(top >= ( altu

top = (altura


//Move o aviao

MoverAviao(left, top


return false;
}

Observe que dentro do m


largura_tela e altura_tela
tela do dispositivo. Para obt
getWindowManager.getDef
getDefaultDisplay.getHeight

if(left <= 0)
left = 0;
else if(left >= (largura_t

left = (largura_tela
if(top <= 0)

top = 0;
else if(top >= ( altura_te

top = (altura_tela - i

Aplicao em execuo

Evita que o objeto saia fora d

132

Book Apostila.indb 132

27/01/2012 15:13:55

i l e

( J A V A )

t), posio x (left) e posio

o (objeto) na tela, nesta


ossamos capturar as teclas
Down (j existente na classe
mos o cdigo dentro desse

dos getLeft e getTop , cujos


top. O bloco de instruo

: left-=10; break;
HT: left+=10; break;
op-=10; break;
N: top+=10; break;

do com a tecla de direo


ou top. J em seguida, no

argumentos para a funo


grama e veja os resultados,

e s t r u t u r a

d e

l a y o u t

A b s o l u t e L a y o u t

Se voc testou a aplicao , talvez voc tenha reparado que, o objeto


pode sair de fora da tela, se mantermos pressionado uma das teclas de
direes por um certo tempo. Vamos agora refazer o cdigo do mtodo
onKeyDown, conforme voc pode conferir abaixo:
public boolean onKeyDown(int keyCode, KeyEvent event) {


int left = imgaviao.getLeft();

int top = imgaviao.getTop();


int largura_tela =
getWindowManager().getDefaultDisplay().getWidth();

int altura_tela =
getWindowManager().getDefaultDisplay().getHeight();



switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: left-=10; break;
case KeyEvent.KEYCODE_DPAD_RIGHT: left+=10; break;
case KeyEvent.KEYCODE_DPAD_UP: top-=10; break;
case KeyEvent.KEYCODE_DPAD_DOWN: top+=10; break;

}


if(left <= 0)

left = 0;

else if(left >= (largura_tela - imgaviao.getWidth()) )

left = (largura_tela - imgaviao.getWidth());


if(top <= 0)

top = 0;

else if(top >= ( altura_tela - imgaviao.getHeight()))

top = (altura_tela - imgaviao.getHeight());


//Move o aviao

MoverAviao(left, top);


return false;
}
Observe que dentro do mtodo foram declaras duas variveis chamadas
largura_tela e altura_tela, cuja finalidade armazenar a largura e altura da
tela do dispositivo. Para obter a largura e a altura foram utilizados os mtodos
getWindowManager.getDefaultDisplay.getWidth e getWindowManager.
getDefaultDisplay.getHeight. O cdigo abaixo:
if(left <= 0)
left = 0;
else if(left >= (largura_tela - imgaviao.getWidth()) )

left = (largura_tela - imgaviao.getWidth());

if(top <= 0)

top = 0;
else if(top >= ( altura_tela - imgaviao.getHeight()))

top = (altura_tela - imgaviao.getHeight());
Evita que o objeto saia fora da tela. Execute a aplicao e veja os resultados.

Book Apostila.indb 133

133

27/01/2012 15:13:55

G a m e

M o b i l e

( J A V A )

ANOTAES

134

Book Apostila.indb 134

27/01/2012 15:13:55

C o l i s o

G a m e

M o b i l e

C a p t u l o
C o l i s o

d e

d e

Captulo 09 Colis

( J A V A )

Em um jogo (de qualquer g


a sua execuo alguma
alguma coisa slida (como u
alguma coisa e etc.). No
cdigo que detecta a colis
seja, se o objeto por algum
era ajustada para que ele fic

0 9

O b j e t o s

Agora vamos criar um exe


: Haver dois objetos (sen
situados na tela do disposit
a coliso entre os dois obje

Crie um projeto os com seg

Project name : TesteColisao

Application name : Teste de

Package name: br.com.app

Create Activity : AppColisao


Min SDK Version : 7

Depois de criarmos o proje


componente TextView e em
AbsoluteLayout. Para este e
estaro dentro da pasta dr

Depois de remover o comp


adicionar os seguintes com

TextView

Book Apostila.indb 135

27/01/2012 15:13:55

C o l i s o

d e

O b j e t o s

Captulo 09 Coliso de Objetos


Em um jogo (de qualquer gnero) uma das coisas que sempre ocorre durante
a sua execuo alguma coliso (que pode ser de um personagem com
alguma coisa slida (como uma caixa, parede e etc.) ou de um tiro que atinge
alguma coisa e etc.). No exemplo anterior que fizemos, colocamos um
cdigo que detecta a coliso do objeto para fora da tela do dispositivo, ou
seja, se o objeto por algum motivo sasse fora da tela, a posio do mesmo
era ajustada para que ele ficasse dentro da tela.
Agora vamos criar um exemplo no Android que vai consistir no seguinte
: Haver dois objetos (sendo que um deles ser controlado pelo usurio)
situados na tela do dispositivo, e a aplicao vai detectar quando ir ocorrer
a coliso entre os dois objetos.
Crie um projeto os com seguintes dados abaixo:
Project name : TesteColisao
Application name : Teste de colisao
Package name: br.com.appcolisao
Create Activity : AppColisao
Min SDK Version : 7
Depois de criarmos o projeto, vamos no arquivo main.xml para remover o
componente TextView e em seguida , alterar a estrutura de LinearLayout para
AbsoluteLayout. Para este exemplo faremos uso das seguintes imagens (que
estaro dentro da pasta drawable-mdpi):

Depois de remover o componente e alterar sua estrutura de layout, vamos


adicionar os seguintes componentes, na sequncia:

TextView

136

Book Apostila.indb 136

27/01/2012 15:13:56

G a m e

M o b i l e

( J A V A )

C o l i s o

d e

Agora vamos no arquivo Ap

package br.com.appcolisa

TextView

import android.app.Activity
import android.graphics.Co
import android.os.Bundle;
import android.view.*;
import android.widget.*;

ImageView

public class AppColisao e


/** Called when the activi

TextView txtstatus;

ImageView imgbloc


@Override
public void onCreate(Bu
super.onCreate(saved
setContentView(R.layo

txtstatus = (TextView) fi
imgbloco2 = (ImageVie
imgbloco1 = (ImageVie
}
ImageView

public boolean ColisaoO




if( ((v1.getLeft() + v1


((v1.getLeft


((v1.getTop


((v1.getTop() <= (

O resultado deve estar de acordo com a figura seguinte:



ret

else


return fals








}

public boolean onKeyD




int left = imgbloco2

int top = imgbloco2


switch (keyCode) {
case Key
case Key

Layout da aplicao

137

Book Apostila.indb 137

27/01/2012 15:13:56

i l e

eguinte:

( J A V A )

C o l i s o

d e

O b j e t o s

Agora vamos no arquivo AppColisao.java para digitarmos o cdigo abaixo:


package br.com.appcolisao;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
public class AppColisao extends Activity {
/** Called when the activity is first created. */

TextView txtstatus;

ImageView imgbloco1,imgbloco2;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtstatus = (TextView) findViewById(R.id.txtstatus);
imgbloco2 = (ImageView) findViewById(R.id.imgbloco2);
imgbloco1 = (ImageView) findViewById(R.id.imgbloco1);
}
public boolean ColisaoObjeto(View v1, View v2) {


if( ((v1.getLeft() + v1.getWidth()) >= v2.getLeft()) &&


((v1.getLeft() <= (v2.getLeft() + v2.getWidth() )) &&


((v1.getTop() + v1.getHeight()) >= v2.getTop()) &&


((v1.getTop() <= (v2.getTop() + v2.getHeight() )))))


return true;

else


return false;








}
public boolean onKeyDown(int keyCode, KeyEvent event) {


int left = imgbloco2.getLeft();

int top = imgbloco2.getTop();


switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: left-=10;break;
case KeyEvent.KEYCODE_DPAD_RIGHT: left+=10;break;

Book Apostila.indb 138

138

27/01/2012 15:13:56

G a m e

M o b i l e

( J A V A )


case KeyEvent.KEYCODE_DPAD_UP: top-=10;break;

case KeyEvent.KEYCODE_DPAD_DOWN: top+=10;break;

}


MoverObjeto(imgbloco2, left, top);


//Verifica se ouve coliso

if(ColisaoObjeto(imgbloco2, imgbloco1)) {

txtstatus.setTextColor(Color.GREEN);

txtstatus.setText(SIM);

} else {

txtstatus.setTextColor(Color.RED);

txtstatus.setText(NO);

}


return false;
}
public void MoverObjeto(View v, int left, int top) {


v.setLayoutParams(new
AbsoluteLayout.LayoutParams(v.
getWidth(),

v.getHeight(),

left,

top

));
}

}
A maioria dos comandos presentes no cdigo acima j foram explicados
nos exemplos anteriores. O que quero chamar ateno aqui a respeito de
do mtodo que detecta a coliso de um objeto sobre outro objeto, chamado
ColisaoObjeto. Veja o cdigo do mtodo:

public boolean ColisaoObjeto(View v1, View v2) {




if( ((v1.getLeft() + v1.getWidth()) >= v2.getLeft()) &&


((v1.getLeft() <= (v2.getLeft() + v2.getWidth() )) &&


((v1.getTop() + v1.getHeight()) >= v2.getTop()) &&


((v1.getTop() <= (v2.getTop() + v2.getHeight() )))))


return true;

else


return false;


}

139

Book Apostila.indb 139

Na condio do mtodo acima feita toda uma verificao para saber se

27/01/2012 15:13:56

C o l i s o

d e

o objeto v1 colidiu com o


retorna verdadeiro (true), c
aplicao e confira os teste

Ap

i l e

( J A V A )

AD_UP: top-=10;break;
AD_DOWN: top+=10;break;

C o l i s o

d e

O b j e t o s

o objeto v1 colidiu com o objeto v2. Se ocorrer uma coliso, a funo


retorna verdadeiro (true), caso contrrio retorna falso (false). Execute a
aplicao e confira os testes. Veja na figura seguinte:

{
EEN);

D);

top) {

luteLayout.LayoutParams(v.

Aplicao em execuo

acima j foram explicados


teno aqui a respeito de
obre outro objeto, chamado

){

tLeft()) &&

2.getWidth() )) &&
v2.getTop()) &&

eight() )))))

a verificao para saber se

140

Book Apostila.indb 140

27/01/2012 15:13:56

G a m e

M o b i l e

( J A V A )

ANOTAES

141

Book Apostila.indb 141

27/01/2012 15:13:56

T r a b a l h a n d

G a m e

M o b i l e

C a p t u l o
T r a b a l h a n d o

c o m

Captulo 10 Traba

( J A V A )

Todos os jogos que dese


estticas, ou seja, imagen
(como se fosse um GIF an
possui como tcnica de an
uso do que chamados de s
Sprites consitem em um co
corresponde a um determ
um jogo. Vamos tomar co
personagem Sonic, conform

1 0

s p r i t e s

e m

u m

j o g o

Sprites de

Cada sprite possui um


passar para o prximo
em repetio, ocorre a
(que pode ser um pers
objeto) do jogo. Vamos
no Android que visa m
um jogo. Crie um proje
abaixo:

Project name : Animac

Application name : Ani

Package name: br.com

Create Activity : AppSp


Min SDK Version : 7

Depois de criado o pro


apagar o componente
mudar a estrutura de
estrutura AbsoluteLa
fazer uso de imagens
personagem (para ess
personagem Sonic). Co

Book Apostila.indb 142

27/01/2012 15:13:56

T r a b a l h a n d o

c o m

s p r i t e s

e m

u m

j o g o

Captulo 10 Trabalhando com sprites em um jogo

j o g o

Todos os jogos que desenvolvemos at agora fizeram uso de imagens


estticas, ou seja, imagens que no possuem sequer nenhuma animao
(como se fosse um GIF animado). A maioria dos jogos (baseados em 2D)
possui como tcnica de animao de um determinado elemento do jogo, o
uso do que chamados de sprites. Mas afinal de contas , o que so sprites ?
Sprites consitem em um conjunto de imagens onde cada uma das imagens
corresponde a um determinado movimento ou ao de um elemento de
um jogo. Vamos tomar como exemplo aqui, um conjunto de sprites do
personagem Sonic, conforme voc confere em seguida:

Sprites de um personagem de um jogo

Cada sprite possui um tempo para ser exibido antes de


passar para o prximo. Quando essas exibies so exibidos
em repetio, ocorre a sensao de animao de um elemento
(que pode ser um personagem (como demonstrado acima) ou
objeto) do jogo. Vamos agora desenvolver uma demonstrao
no Android que visa mostrar como fazer uso de sprites em
um jogo. Crie um projeto no Android com os seguintes dados
abaixo:
Project name : AnimacaoSprites
Application name : Animao com Sprites
Package name: br.com.appsprites
Create Activity : AppSprites
Min SDK Version : 7
Depois de criado o projeto, vamos no arquivo main.xml para
apagar o componente TextView inserido nele e tambm para
mudar a estrutura de layout padro (LinearLayout) para a
estrutura AbsoluteLayout. Para essa demonstrao vamos
fazer uso de imagens que vo representar os sprites de um
personagem (para esse exemplo estarei usando os sprites do
personagem Sonic). Confira os sprites abaixo:

143

Book Apostila.indb 143

27/01/2012 15:13:56

G a m e

M o b i l e

( J A V A )

T r a b a l h a n d

No campo File Name


Para comearmos, ess
o movimento do nos
a direita, logo, o nom
correndo_direita.xml.
criar o arquivo. Depois
caixa de dilogo como

Alm dos sprites do Sonic tambm sero necessrios os


seguintes sprites:

cho_1.png

cho_2.png

Depois de colocados os sprites dentro da basta drawablemdpi, dentro da mesma pasta, vamos criar os arquivos
responsveis por efetuar a animao dos sprites. Para criarmos
esses arquivos (cujas extenses so XML), basta clicar com o
boto direito sobre a pasta e em seguida, selecionar New/
File. Ser aberta uma caixa de dilogo conforme mostra a
figura abaixo:

Vamos trabalhar com


armazenar todos os sp
determinao anima
vamos na guia sonic
digite o cdigo abaixo:

<?xml version=1.0 en

<animation-list
com/apk/res/android
android:oneshot=false

<item android:
direita_1 android:dura
<item android:
direita_2 android:dura
<item android:
direita_3 android:dura
<item android:
direita_4 android:dura
New File

</animation-list>

144

Book Apostila.indb 144

27/01/2012 15:13:56

i l e

( J A V A )

T r a b a l h a n d o

c o m

s p r i t e s

e m

u m

j o g o

No campo File Name vamos digitar o nome do nosso arquivo.


Para comearmos, esse arquivo ser responsvel por controlar
o movimento do nosso personagem Sonic correndo para
a direita, logo, o nome desse arquivo vai se chamar sonic_
correndo_direita.xml. Feito isso, basta clicar em Finish para
criar o arquivo. Depois de criado o arquivo , ser aberta uma
caixa de dilogo como essa :

sero necessrios os

cho_2.png

o da basta drawablemos criar os arquivos


s sprites. Para criarmos
ML), basta clicar com o
ida, selecionar New/
go conforme mostra a

Android Resources
Vamos trabalhar com uma estrutura XML responsvel por
armazenar todos os sprites (imagens) que iro pertencer a uma
determinao animao, chamada animation-list. Para isso,
vamos na guia sonic_correndo_direita.xml e em seguida,
digite o cdigo abaixo:
<?xml version=1.0 encoding=utf-8?>
<animation-list
xmlns:android=http://schemas.android.
com/apk/res/android
id=@+id/a_sonic_correndo
android:oneshot=false>
<item android:drawable=@drawable/sonic_correndo_
direita_1 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
direita_2 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
direita_3 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
direita_4 android:duration=80 />
</animation-list>
145

Book Apostila.indb 145

27/01/2012 15:13:56

G a m e

M o b i l e

( J A V A )

Conforme havia falado, a estrutura animation-list


responsvel por armazenar todos os sprites que vo pertencer
uma animao. A estrutura animation-list possui uma
propriedade chamada android:oneshot , cuja finalidade
exibir os sprites sequencialmente uma nica vez (caso o valor
dessa propriedade for true) ou vrias vezes (caso o valor dessa
propriedade for false).
Cada sprite utilizado na animao fica dentro de uma estrutura
(tag) chamada item, que possui as seguintes propriedades:
android:drawable: Responsvel por armazenar o sprite que vai
ser utilizado na animao .

T r a b a l h a n d

android:duration=80
<item
android:duration=80
</animation-list>

Depois de criados os a
xml para mudarmos
retrato (portrait) para pa
figura abaixo:

android:duration: Armaneza um valor numrico que corresponde


aos milissegundos que o sprite indicado ser exibido antes
de passar para o prximo.

Alterando a orie

Depois de inserido o cdigo XML no arquivo, vamos criar mais


dois arquivos de extenso XML (dentro da pasta drawablemdpi mesmo), conforme se pede abaixo:

Depois de alterar a or
alterar o valor da prop
conforme voc confere
AbsoluteLayout

Arquivo : sonic_correndo_esquerda.xml.

Propriedade
Background

<?xml version=1.0 encoding=utf-8?>


<animation-list
xmlns:android=http://schemas.android.
com/apk/res/android
id=@+id/a_sonic_correndo
android:oneshot=false>
<item android:drawable=@drawable/sonic_correndo_
esquerda_1 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
esquerda_2 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
esquerda_3 android:duration=80 />
<item android:drawable=@drawable/sonic_correndo_
esquerda_4 android:duration=80 />

Arquivo : chao.xml

Book Apostila.indb 146

ImageView
Id
Src
Layout x
Layout y
Layout width
Layout height
Scale type
ImageView

</animation-list>

146

Em seguida, adicione o

<?xml version=1.0 encoding=utf-8?>


<animation-list xmlns:android=http://schemas.android.com/
apk/res/android id=@+id/a_chao android:oneshot=false>
<item
android:drawable=@drawable/chao_1

27/01/2012 15:13:57

Id
Src
Layout x
Layout y
Layout width
Layout height
Scale type

i l e

( J A V A )

a animation-list
rites que vo pertencer
ation-list possui uma
t , cuja finalidade
nica vez (caso o valor
zes (caso o valor dessa

entro de uma estrutura


guintes propriedades:
azenar o sprite que vai

T r a b a l h a n d o

c o m

s p r i t e s

e m

u m

j o g o

android:duration=80 />
<item
android:drawable=@drawable/chao_2
android:duration=80 />
</animation-list>
Depois de criados os arquivos acima, vamos no arquivo main.
xml para mudarmos a orientao da tela do dispositivo de
retrato (portrait) para paisagem (landscape), conforme mostra a
figura abaixo:

mrico que corresponde


ado ser exibido antes

quivo, vamos criar mais


o da pasta drawableo:

Alterando a orientao da tela do dispositivo


Depois de alterar a orientao da tela do dispositivo, vamos
alterar o valor da propriedade da estrutura AbsoluteLayout
conforme voc confere abaixo:
AbsoluteLayout

l.

Propriedade
Background

>

ttp://schemas.android.
+id/a_sonic_correndo

Valor
#00afff

Em seguida, adicione os seguintes componentes na sequencia :

ImageView

wable/sonic_correndo_

Id
Src
Layout x
Layout y
Layout width
Layout height
Scale type

wable/sonic_correndo_

wable/sonic_correndo_

wable/sonic_correndo_

@+id/imgsonic
@drawable/sonic_parado_direita
205dip
172dip
50px
50px
fitXY

ImageView
Id
Src
Layout x
Layout y
Layout width
Layout height
Scale type

>
schemas.android.com/
roid:oneshot=false>
e=@drawable/chao_1

Book Apostila.indb 147

@+id/imgchao
@drawable/chao_1
-1dip
222dip
fill_parent
50px
fitXY

147

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

T r a b a l h a n d

Feito o que se foi pedido, a tela do nosso jogo deve estar de


acordo com a imagem abaixo:

public void onCreate

super.onCreate(sa
setContentView(R
imgsonic = (Image
imgchao = (Image
imgchao.setImage
frameChao = (Anim

imgsonic.setIm
direita);

Feito isso salve o arquivo main.xml. Agora vamos no arquivo


AppSprite.java para digitarmos o seguinte cdigo abaixo:

tecla_pressionada

package br.com.appsprites;

_PularSonic = ne

import android.app.Activity;
import android.graphics.drawable.*;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import android.os.*;

public class AppSprite extends Activity {


enum EStatus { PARADO_ESQUERDA, PARADO_DIREITA,
CORRENDO_PRA_DIREITA, CORRENDO_PRA_ESQUERDA,
PULANDO_ESQUERDA, PULANDO_DIREITA };

ImageView imgsonic, imgchao;
AnimationDrawable frameSonic, frameChao;
EStatus StatusSonic;


Thread PularSonic;
Handler _PularSonic;

public boolean onKe




if(!tecla_pression


tecla_pre


frameCha



switch(ke


case Ke

Sta
DIREITA;

imgso
(R.drawable.


boolean tecla_pressionada;

frameSon
imgsonic.ge


int top;


frameS



} break;




@Override
148

Book Apostila.indb 148

27/01/2012 15:13:57

i l e

( J A V A )

T r a b a l h a n d o

e m

u m

j o g o

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgsonic = (ImageView) findViewById(R.id.imgsonic);
imgchao = (ImageView) findViewById(R.id.imgchao);
imgchao.setImageResource(R.drawable.chao);
frameChao = (AnimationDrawable) imgchao.getDrawable();
imgsonic.setImageResource(R.drawable.sonic_parado_
direita);

gora vamos no arquivo


inte cdigo abaixo:

Chao;

s p r i t e s

public void onCreate(Bundle savedInstanceState) {

sso jogo deve estar de

, PARADO_DIREITA,
DO_PRA_ESQUERDA,
DIREITA };

c o m

tecla_pressionada = false;
_PularSonic = new Handler();
}
public boolean onKeyDown(int keyCode, KeyEvent event) {


if(!tecla_pressionada) {


tecla_pressionada = true;


frameChao.start();



switch(keyCode) {


case KeyEvent.KEYCODE_DPAD_RIGHT: {

StatusSonic = EStatus.CORRENDO_PRA_
DIREITA;

imgsonic.setImageResource
(R.drawable.sonic_correndo_direita);

frameSonic = (AnimationDrawable)
imgsonic.getDrawable();

frameSonic.start(); //Inicia a animao



} break;

Book Apostila.indb 149

149

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

case KeyEvent.KEYCODE_DPAD_LEFT: {


StatusSonic = EStatus.CORRENDO_PRA_
ESQUERDA;
imgsonic.setImageResource
(R.drawable.sonic_correndo_esquerda);

frameSonic = (AnimationDrawable)
imgsonic.getDrawable();

frameSonic.start(); //Inicia a animao

} break;



case KeyEvent.KEYCODE_DPAD_CENTER: {


if(StatusSonic
==EStatus.PARADO_
DIREITA)

StatusSonic= EStatus.PULANDO_
DIREITA;

else if(StatusSonic ==EStatus.PARADO_
ESQUERDA)

StatusSonic= EStatus.PULANDO_
ESQUERDA;

imgsonic.setImageResource
(R.drawable.sonic_pulando);
PuloDoSonic();

} break;


case KeyEvent.KEYCODE_DPAD_DOWN:
finish(); break;


}


}


return true;
}

150

Book Apostila.indb 150

T r a b a l h a n d


(StatusSonic


frameSon


if(StatusSonic =

imgsonic.setIm
direita);

StatusSonic = E

}

else {

imgsonic.setIm
esquerda);

StatusSonic = E


}





tecla_pressionad


}


return true;
}

public void PuloDoS




PularSonic = ne


@Override

public void run


//Executa o pu


int count = 1;


while(count <=


top = imgsoni

if(count <= 5)

top-=15;
else
top+=15;


_PularSonic.p

public boolean onKeyUp(int keyCode, KeyEvent event) {





frameChao.stop();



if( (StatusSonic != EStatus.PULANDO_DIREITA) &&

27/01/2012 15:13:57

i l e

( J A V A )

E_DPAD_LEFT: {

tus.CORRENDO_PRA_

Resource
esquerda);

ationDrawable)

/Inicia a animao

E_DPAD_CENTER: {

==EStatus.PARADO_
EStatus.PULANDO_
==EStatus.PARADO_
EStatus.PULANDO_

YCODE_DPAD_DOWN:

KeyEvent event) {

NDO_DIREITA) &&

T r a b a l h a n d o

c o m

s p r i t e s

e m

u m

j o g o


(StatusSonic != EStatus.PULANDO_ESQUERDA)) {


frameSonic.stop();

if(StatusSonic == EStatus.CORRENDO_PRA_DIREITA){

imgsonic.setImageResource(R.drawable.sonic_parado_
direita);

StatusSonic = EStatus.PARADO_DIREITA;

}

else {

imgsonic.setImageResource(R.drawable.sonic_parado_
esquerda);

StatusSonic = EStatus.PARADO_ESQUERDA;


}





tecla_pressionada = false;


}


return true;
}
public void PuloDoSonic() {


PularSonic = new Thread(new Runnable() {


@Override

public void run() {


//Executa o pulo do sonic


int count = 1;


while(count <= 10) {


top = imgsonic.getTop();
if(count <= 5)

top-=15;
else
top+=15;


_PularSonic.post(new Runnable() {

Book Apostila.indb 151

151

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )


@Override

public void run() {


imgsonic.setLayoutParams
(new AbsoluteLayout.LayoutParams(imgsonic.getWidth(),

imgsonic.getHeight(),imgsonic.getLeft() ,top ));

}

});


try {

Thread.sleep(40);


}catch(Exception e) {

}

count++;
}




_PularSonic.post(new Runnable() {


@Override

public void run() {


if(StatusSonic == EStatus.PULANDO_
DIREITA) {


tecla_pressionada = false;

StatusSonic = EStatus.PARADO_DIREITA;



} else {


imgsonic.setImageResource
(R.drawable.sonic_parado_esquerda);

Book Apostila.indb 152





}

});




}});


PularSonic.star

}
}

Agora irei comentar a


desse programa. A linh

AnimationDrawable f

Declara duas varive


a classe responsvel
nos arquivos XML com
variveis vai controlar o

O bloco de cdigo aba

imgchao.setImageRe
frameChao = (Animat


imgsonic.setImageResource
(R.drawable.sonic_parado_direita);

152

T r a b a l h a n d


tecla_pressionada = false;

StatusSonic = EStatus.PARADO_
ESQUERDA;



27/01/2012 15:13:57

Carrega no objeto img


imagem NO SER C
com a figura do cho
que contm os sprites
(referenciado por R.
for carregada nesse c
animao, para isso, a
a referncia dessa im
para que ele possa con

Toda vez que o Sonic


animao dele corrend
Dentro do mtodo onK
responsveis por efetu
de cdigo desse mtod
se a tecla foi pression

i l e

( J A V A )


etLayoutParams
ms(imgsonic.getWidth(),
gsonic.getLeft() ,top ));

}

T r a b a l h a n d o


= EStatus.PULANDO_

eResource
direita);

a = false;
tus.PARADO_DIREITA;


eResource
esquerda);

a = false;
= EStatus.PARADO_

s p r i t e s

e m

u m

j o g o

}



}

});




}});


PularSonic.start();

}

nable() {

c o m

}
Agora irei comentar algumas linhas de cdigo importantes
desse programa. A linha de cdigo:
AnimationDrawable frameSonic, frameChao;
Declara duas variveis do tipo AnimationDrawable, que
a classe responsvel por controlar as animaes definidas
nos arquivos XML com a estrutura animation-list. Uma das
variveis vai controlar o sonic e a outra vai controlar o cho.
O bloco de cdigo abaixo (situado no mtodo onCreate):
imgchao.setImageResource(R.drawable.chao);
frameChao = (AnimationDrawable) imgchao.getDrawable();
Carrega no objeto imgchao a imagem do cho, porm, essa
imagem NO SER CARREGADA de nenhum arquivo PNG
com a figura do cho, e sim do arquivo XML (animation-list)
que contm os sprites da animao do cho em movimento
(referenciado por R.drawable.chao). Mas a imagem que
for carregada nesse componente no vai executar nenhuma
animao, para isso, a varivel objeto frameChao vai receber
a referncia dessa imagem carregada no objeto imgchao
para que ele possa controlar a animao do cho.
Toda vez que o Sonic se movimenta para um dos lados, a
animao dele correndo e do cho precisam entrar em ao.
Dentro do mtodo onKeyDown podemos conferir os cdigos
responsveis por efetuar essa ao. Vamos analisar as linhas
de cdigo desse mtodo. A primeira coisa que o mtodo verifica
se a tecla foi pressionada:
153

Book Apostila.indb 153

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

if(!tecla_pressionada) {
:
Por que feita essa verificao ? o mtodo onKeyDown
disparado vrias vezes seguidamente quando uma tecla
est pressionada (que normal) mas, para essa situao, os
comandos situados dentro da condio acima precisam ser
executados somente uma vez. A primeira coisa que executada
a animao dos sprites do cho atravs do seguinte comando:

T r a b a l h a n d

tecla_pressionad

Responsveis por para


de atribuir o valor false
executar a nossa aplic
mostra as figuras segu

frameChao.start();
Em seguida avaliado o valor da varivel keyCode dentro da
estrutura switch que vai verificar qual das teclas de direo
foram pressionadas. Se por acaso uma das teclas de direo
esquerda ou direita seja pressionada, ento executada
a animao de sprites referente a tecla. Se por acaso por
pressionada a tecla de direo para baixo, o jogo encerrado,
atravs do comando finish .
Se por acaso a tecla central por pressionada, executado
um mtodo chamado PuloDoSonic responsvel por fazer a
animao pulo do Sonic (incluindo tambm seu deslocamento
no ar).
Tambm foi definido um mtodo chamado onKeyUp que
disparado toda vez que uma tecla for solta. Quando uma das
teclas for solta, sero executados os seguintes comandos:
frameChao.stop();



if( (StatusSonic != EStatus.PULANDO_DIREITA) &&

(StatusSonic != EStatus.PULANDO_ESQUERDA)) {


frameSonic.stop();

154

Book Apostila.indb 154


if(StatusSonic == EStatus.CORRENDO_PRA_DIREITA){

imgsonic.setImageResource(R.drawable.sonic_parado_
direita);

StatusSonic = EStatus.PARADO_DIREITA;

}

else {

imgsonic.setImageResource(R.drawable.sonic_parado_
esquerda);

StatusSonic = EStatus.PARADO_ESQUERDA;

27/01/2012 15:13:57

Son

i l e

( J A V A )

mtodo onKeyDown
e quando uma tecla
para essa situao, os
o acima precisam ser
coisa que executada
do seguinte comando:

T r a b a l h a n d o

c o m

s p r i t e s

e m

u m

j o g o

tecla_pressionada = false;

Responsveis por parar a animao do cho e do Sonic, alm


de atribuir o valor false a varivel tecla_pressionada. Vamos
executar a nossa aplicao e conferir os resultados conforme
mostra as figuras seguintes:

el keyCode dentro da
das teclas de direo
das teclas de direo
, ento executada
la. Se por acaso por
xo, o jogo encerrado,

sionada, executado
sponsvel por fazer a
bm seu deslocamento

mado onKeyUp que


olta. Quando uma das
guintes comandos:

NDO_DIREITA) &&
NDO_ESQUERDA)) {

NDO_PRA_DIREITA){
rawable.sonic_parado_

DIREITA;
Sonic em movimento

rawable.sonic_parado_

ESQUERDA;
155

Book Apostila.indb 155

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

ANOTAES

156

Book Apostila.indb 156

27/01/2012 15:13:57

C r i a n d o

G a m e

M o b i l e

C a p t u l o
C r i a n d o

o b j e t o s

o b

Captulo 11 Crian

( J A V A )

muito comum em
personagens simplesm
aprender a criar obje
durante a execuo
seguintes dados abaix

1 1

d i n a m i c a m e n t e

Project name : Criando

Application name : Cria

Package name: br.com

Create Activity : AppOb


Min SDK Version : 7

Depois de criado o pro


mudarmos a orienta
paisagem , conforme
Feito isso, vamos remo
seguida, alterar a estru
AbsoluteLayout.

Feito isso, vamos codifi


o seguinte cdigo abai

<?xml version=1.0 en

Book Apostila.indb 157

27/01/2012 15:13:57

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e

Captulo 11 Criando objetos dinamicamente

n t e

muito comum em um jogo aparecer vrios objetos e/ou


personagens simplesmente do nada. Neste tpico iremos
aprender a criar objetos dinamicamente que iro aparecer
durante a execuo de um jogo. Crie um objeto com os
seguintes dados abaixo:
Project name : CriandoObjetosDinamicamente
Application name : Criando Objetos Dinamicamente
Package name: br.com.appobjeto
Create Activity : AppObjeto
Min SDK Version : 7
Depois de criado o projeto, vamos no arquivo main.xml para
mudarmos a orientao da tela do dispositivo de retrato para
paisagem , conforme j foi mostrado na aplicao anterior.
Feito isso, vamos remover o componente TextView da tela e em
seguida, alterar a estrutura padro de layout para a estrutura
AbsoluteLayout.

Feito isso, vamos codificar o arquivo main.xml. Vamos colocar


o seguinte cdigo abaixo:
<?xml version=1.0 encoding=utf-8?>
158

Book Apostila.indb 158

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

<AbsoluteLayout xmlns:android=http://schemas.android.com/
apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
android:background=#000066
android:id=@+id/tela >
<ImageView android:layout_width=wrap_content
android:id=@+id/imageView1
android:layout_height=wrap_content
android:layout_x=0dip
android:layout_y=223dip
android:src=@drawable/chao
android:scaleType=fitXY>
</ImageView>

android:layout_wid
android:id=@+id/Im
android:scaleType=
android:layout_heig
android:layout_x=1
android:layout_y=4
</ImageView>

Depois de colocado o c
aplicao deve estar d

Tela

Agora vamos criar um


animao do morcego
pasta drawable-mdpi
xml e ter o seguinte

<ImageView
android:id=@+id/imageView3
android:layout_x=288dip
android:layout_y=38dip
android:src=@drawable/estrela
android:layout_height=40px
android:layout_width=40px
android:scaleType=fitXY>
</ImageView>

<?xml version=1.0 en
<animation-list
android.com/apk/res/a
android:oneshot=false

<item
and
android:duration=80
<item
and
android:duration=80
<item
and
android:duration=80
<item
and
android:duration=80

<ImageView android:src=@drawable/estrela
android:layout_width=40px
android:id=@+id/ImageView01
android:scaleType=fitXY
android:layout_height=40px
android:layout_x=395dip
android:layout_y=80dip>
</ImageView>

Book Apostila.indb 159

o b

</AbsoluteLayout>

<ImageView
android:id=@+id/imageView2
android:layout_x=50dip
android:layout_y=15dip
android:src=@drawable/lua
android:layout_height=70px
android:layout_width=70px
android:scaleType=fitXY>
</ImageView>

159

C r i a n d o

</animation-list>

<ImageView
android:src=@drawable/estrela

Agora dentro da past

27/01/2012 15:13:57

i l e

( J A V A )

schemas.android.com/

out_height=fill_parent

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e

android:layout_width=40px
android:id=@+id/ImageView02
android:scaleType=fitXY
android:layout_height=40px
android:layout_x=169dip
android:layout_y=47dip>
</ImageView>

rap_content

</AbsoluteLayout>

ent

Depois de colocado o cdigo acima no arquivo, a tela da nossa


aplicao deve estar de acordo com a imagem seguinte:

estrela

Tela da nossa aplicao


Agora vamos criar um arquivo XML que vai representar a
animao do morcego voando (um animation-list), dentro da
pasta drawable-mdpi. O arquivo vai se chamar morcego.
xml e ter o seguinte cdigo:
<?xml version=1.0 encoding=utf-8?>
<animation-list
xmlns:android=http://schemas.
android.com/apk/res/android
id=@+id/a_morcego
android:oneshot=false>
<item
android:drawable=@drawable/morcego_1
android:duration=80 />
<item
android:drawable=@drawable/morcego_2
android:duration=80 />
<item
android:drawable=@drawable/morcego_3
android:duration=80 />
<item
android:drawable=@drawable/morcego_4
android:duration=80 />
</animation-list>
Agora dentro da pasta src do pacote br.com.appobjeto
160

Book Apostila.indb 160

27/01/2012 15:13:57

G a m e

M o b i l e

( J A V A )

vamos criar uma classe chamada Morcego com o seguinte


cdigo:
package br.com.appobjeto;
import android.content.Context;
import android.graphics.drawable.*;
import android.widget.*;
import android.os.*;
public class Morcego extends ImageView {


enum SentidoHorizontal { PRA_ESQUERDA, PRA_
DIREITA ,
ESCOLHER_ALEATORIAMENTE };



















161

Book Apostila.indb 161

private Thread thread;


private Handler handler;
private AnimationDrawable frameMorgego;
private int left, top;
private final int ALTURA_TELA = 320;
AbsoluteLayout tela;
private SentidoHorizontal sentido;
Morcego morcego;
private int posicao_inicial;

public Morcego(Context context) {


super(context);
this.setImageResource(R.drawable.morcego);
this.setVisibility(Morcego.INVISIBLE);
handler = new Handler();
}



public void setLeft(int l) {

this.setLayoutParams(new
AbsoluteLayout.LayoutParams(this.getWidth(), getHeight(),
l,getTop()));
}

27/01/2012 15:13:57

C r i a n d o

o b


public void setM


if(se
ALEATORIAMENTE)

{


long valo


if((valor %

this.sen
else

th
ESQUERDA;

}
else

this.sent
}


public void setTe

this.tela =
}


public void mov


this.posicao_in


frameMor
getDrawable();

frameMorgego



thread = new T


@Override

public void run


morcego = M


while (top


try {

Thread.

}catch(E


if(Morce

left = g

else {

left = M

i l e

( J A V A )

rcego com o seguinte

w{

A_ESQUERDA, PRA_

Morgego;

320;

.morcego);
E);

getWidth(), getHeight(),

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e


public void setMovimentoX(SentidoHorizontal sentido) {


if(sentido==SentidoHorizontal.ESCOLHER_
ALEATORIAMENTE)

{


long valor = Math.round(Math.random() * 50);


if((valor % 2)== 0)

this.sentido = SentidoHorizontal.PRA_DIREITA;
else

this.sentido = SentidoHorizontal.PRA_
ESQUERDA;

}
else

this.sentido = sentido;
}


public void setTela(AbsoluteLayout tela) {

this.tela = tela;
}


public void moverMorcego(int posicao_inicial) {


this.posicao_inicial = posicao_inicial;


frameMorgego = (AnimationDrawable) this.
getDrawable();

frameMorgego.start();



thread = new Thread(new Runnable() {


@Override

public void run() {


morcego = Morcego.this;


while (top <= ALTURA_TELA) {


try {

Thread.sleep(30);

}catch(Exception e) { }


if(Morcego.this.posicao_inicial==-1)

left = getLeft();

else {

left = Morcego.this.posicao_inicial;

Book Apostila.indb 162

162

27/01/2012 15:13:57

G a m e

163

Book Apostila.indb 163

M o b i l e

( J A V A )

C r i a n d o

o b



Morcego.this.posicao_inicial = -1;
}

top = getTop();

top+=5;


if(sentido == SentidoHorizontal.PRA_DIREITA)

left+=5;
else
left-=5;


handler.post(new Runnable() {

@Override

public void run() {

thread.sta
}


morcego.setLayoutParams(new AbsoluteLayout.
LayoutParams(morcego.getWidth(),morcego.getHeight(),
left, top));


if(Morcego.this.getVisibility() == Morcego.
INVISIBLE)


Morcego.this.setVisibility(Morcego.VISIBLE);

}
});






}


handler.post(new Runnable() {

@Override
public void run() {
tela.removeView(morcego);

}
});

}
});

moverMorcego: Esse
o morcego pela tela. C
posio X inicial.

27/01/2012 15:13:57

Essa classe ser respo


tambm para coloc-l
mtodos existentes de

setMovimentoX: Aqu
para direita ou esque
aleatoriamente), de aco
para o mtodo.

setTela : Aqui neste


referncia da tela que
que ser utilizada quan

Agora vamos no arquiv


cdigo:

package br.com.appob

import android.app.Ac
import android.os.Bund
import android.widget.
import android.view.*;
import android.os.*;

public class AppObjeto







AbsoluteLayout
Morcego m;

Runnable rCriarM

Handler hCriarM

@Override
public void onCreate
super.onCreate(sa
setContentView(R
tela = (AbsoluteLa
hCriarMoncego =

i l e

( J A V A )

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e

thread.start();
}

cial = -1;

}
Essa classe ser responsvel por criar um morcego na tela e
tambm para coloc-lo em movimento. Irei comentar aqui os
mtodos existentes dentro dessa classe:

ontal.PRA_DIREITA)
setMovimentoX: Aqui definimos se o morcego vai se deslocar
para direita ou esquerda (a escolha tambm pode ser feita
aleatoriamente), de acordo com o valor do argumento passado
para o mtodo.

e() {
setTela : Aqui neste mtodo passamos como parmetro a
referncia da tela que contm a estrutura AbsoluteLayout ,
que ser utilizada quando o morcego for removido da tela.

s(new AbsoluteLayout.
(),morcego.getHeight(),

moverMorcego: Esse mtodo ser responsvel por mover


o morcego pela tela. Como parmetro passado o valor da
posio X inicial.

ility()

Agora vamos no arquivo AppObjeto.java e coloque o seguinte


cdigo:

==

Morcego.


cego.VISIBLE);

unnable() {

un() {
View(morcego);

package br.com.appobjeto;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import android.os.*;
public class AppObjeto extends Activity {





AbsoluteLayout tela;
Morcego m;
Runnable rCriarMorcego;
Handler hCriarMoncego;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tela = (AbsoluteLayout) findViewById(R.id.tela);
hCriarMoncego = new Handler();

Book Apostila.indb 164

164

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

o b



m = new


m.setMovimen
.ESCOLHER_A


m.setTe

rCriarMorcego = new Runnable() {



@Override

public void run() {


m = new Morcego(AppObjeto.this);


m.setMovimentoX(Morcego.SentidoHorizontal
.ESCOLHER_ALEATORIAMENTE);


m.setTela(tela);

C r i a n d o

tela.addView(m);


int left = (int) Math.round(Math.random() * 480);


m.moverMorcego(left);




hCriarMoncego.postDelayed(rCriarMorcego,
1500);

}
};

hCriarMoncego.postDelayed(rCriarMorcego,
1500);

tela.add


int left =


m.move




hCri
1500);

}
};

Vamos comentar as lin
linha:

m = new Morcego(App

Cria um objeto do tipo


varivel m. Na linha s

m.setMovimentoX(Mor
.ESCOLHER_ALEATOR
}
}
Agora irei explicar algumas linhas de cdigo dessa classe.
Observe que foi declarada a seguinte varivel :

Define a direo X na
caso, o computador ir
Na linha de cdigo seg
m.setTela(tela);

Runnable rCriarMorcego;
Essa varivel ser responsvel por armazenar a estrutura que
far a criao dinmica dos morcegos pela tela. Podemos
conferir isso na linha de cdigo abaixo:

Passo como parm


AbsoluteLayout que
ele for removido da tela
tela.addView(m);

165

Book Apostila.indb 165

rCriarMorcego = new Runnable() {



@Override

public void run() {

Adiciona o morcego na
(pois quando criado
atribudo como invisve

27/01/2012 15:13:58

i l e

( J A V A )

bjeto.this);

ntidoHorizontal
TE);

Math.random() * 480);

Delayed(rCriarMorcego,

ayed(rCriarMorcego,

cdigo dessa classe.


rivel :

azenar a estrutura que


s pela tela. Podemos

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e



m = new Morcego(AppObjeto.this);


m.setMovimentoX(Morcego.SentidoHorizontal
.ESCOLHER_ALEATORIAMENTE);


m.setTela(tela);

tela.addView(m);


int left = (int) Math.round(Math.random() * 480);


m.moverMorcego(left);




hCriarMoncego.postDelayed(rCriarMorcego,
1500);

}
};

Vamos comentar as linhas de cdigo dentro dessa estrutura. A
linha:
m = new Morcego(AppObjeto.this);
Cria um objeto do tipo Morcego e atribui a instncia para a
varivel m. Na linha seguinte:
m.setMovimentoX(Morcego.SentidoHorizontal
.ESCOLHER_ALEATORIAMENTE);
Define a direo X na qual o morcego vai se deslocar, neste
caso, o computador ir escolher aleatoriamente a direo dele.
Na linha de cdigo seguinte:
m.setTela(tela);
Passo como parmetro a referncia da estrutura
AbsoluteLayout que o objeto morcego vai precisar quando
ele for removido da tela. Na linha seguinte:
tela.addView(m);
Adiciona o morcego na tela, mas, ele ainda NO EST VISIVEL
(pois quando criado o objeto, seu modo de visualizao j
atribudo como invisvel). Na linha seguinte:

Book Apostila.indb 166

166

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

int left = (int) Math.round(Math.random() * 480);


Define um valor aleatrio que ser utilizado para definir a
posio X inicial do morcego, que ser utilizado na instruo
seguinte:
m.moverMorcego(left);
Que vai mover o morcego pela tela. A linha seguinte:
hCriarMoncego.postDelayed(rCriarMorcego, 1500);
Ir executar novamente os mesmos comandos depois de 1500
milissegundos (1 segundo e meio).
Vamos executar a nossa aplicao. Confira os resultados na
figura seguinte:

Aplicao em execuo

167

Book Apostila.indb 167

27/01/2012 15:13:58

C r i a n d o

o b

i l e

( J A V A )

C r i a n d o

o b j e t o s

d i n a m i c a m e n t e

ANOTAES

* 480);

tilizado para definir a


utilizado na instruo

nha seguinte:

ego, 1500);

mandos depois de 1500

onfira os resultados na

168

Book Apostila.indb 168

27/01/2012 15:13:58

T r a b a l h a n d
e m
u m
j o g
G a m e

M o b i l e

( J A V A )

C a p t u l o
T r a b a l h a n d o

c o m

m s i c a

1 2
e

s o n s

e m

u m

j o g o

At o presente mome
desenvolvemos no tin
que so elementos fun
jogo. A partir daqui, ire
e sons de efeitos para

Vamos agora criar uma


com msica e sons e e

Project name : SonsNo

Application name : Son

Package name: br.com

Create Activity : AppSo


Min SDK Version : 7

Este projeto praticam


arquivos (imagens , an
projeto so os mesmos
sobre os sprites). Bas
anterior (EXCETO edit
feito logo mais em seg

Agora para este jogo


msicas sendo um arq
extenso WAV (que
marble_zone.mp3 e

Os arquivos de msica
chamado raw (diret
arquivos arbitrrios), p
iremos criar esse dire
projeto. Para criarmo
simplesmente clique c
pasta e em seguida s
seguinte caixa de dilo

Book Apostila.indb 169

27/01/2012 15:13:58

T r a b a l h a n d o
e m
u m
j o g o

u m

j o g o

c o m

m s i c a

s o n s

At o presente momento, todos os nossos exemplos que


desenvolvemos no tinham nenhuma msica ou som de efeito,
que so elementos fundamentais que no se pode faltar em um
jogo. A partir daqui, iremos aprender a colocar nossas msicas
e sons de efeitos para utilizarmos nos nossos futuros jogos.
Vamos agora criar uma demonstrao de um jogo que trabalhe
com msica e sons e efeitos, de acordo com os dados abaixo:
Project name : SonsNoJogo
Application name : Sons no Jogo
Package name: br.com.appsom
Create Activity : AppSom
Min SDK Version : 7
Este projeto praticamente similar ao projeto anterior. Todos os
arquivos (imagens , animaes, e o arquivo main.xml) deste
projeto so os mesmos do projeto do tpico anterior (que faa
sobre os sprites). Basta repetir todos os passos do projeto
anterior (EXCETO editar o arquivo Appsom.java, que ser
feito logo mais em seguida).
Agora para este jogo vou trabalhar com dois arquivos de
msicas sendo um arquivo de extenso MP3 e o outro de
extenso WAV (que um som de efeito). Os arquivos so
marble_zone.mp3 e jump.wav.
Os arquivos de msica acima precisam estar em um diretrio
chamado raw (diretrio padro do Android para armazenar
arquivos arbitrrios), porm, esse diretrio no existe. Ns
iremos criar esse diretrio dentro da pasta res do nosso
projeto. Para criarmos um diretrio dentro da pasta res
simplesmente clique com o boto direito do mouse sobre a
pasta e em seguida selecione new/folder e ser aberta a
seguinte caixa de dilogo abaixo:

170

Book Apostila.indb 170

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

T r a b a l h a n d
e m
u m
j o g

package br.com.appso

import android.app.Ac
import android.graphic
import android.media.A
import android.media.M
import android.media.S
import android.os.Bund
import android.widget.
import android.view.*;
import android.os.*;

public class AppSom e

enum EStatus { PARA


CORRENDO_PRA_D
PULANDO_ESQUER

ImageView imgsonic,
Button botao;
AnimationDrawable f
EStatus StatusSonic;

Criando um novo diretrio


No campo Folder name vamos criar o nosso diretrio que
deve se chamar raw. O resultado voc confere na figura
seguinte:

Thread PularSonic;
Handler _PularSonic;

boolean tecla_pressio

int top;

MediaPlayer mp;

SoundPool sp;

int SOUND_JUMP_ID

int count ;


Diretrio raw criado
Agora dentro desse diretrio vamos colocar os arquivos de
musica e sons de efeito que utilizaremos em nosso jogo,
conforme j foi mencionado anteriormente.
Vamos agora no arquivo AppSom.java para digitarmos o
seguinte cdigo abaixo:
171

Book Apostila.indb 171

27/01/2012 15:13:58

@Override
public void onCreate
super.onCreate(sa
setContentView(R
imgsonic = (Image
imgchao = (Image
imgchao.setImage
frameChao = (Anim

i l e

( J A V A )

etrio

o nosso diretrio que


oc confere na figura

olocar os arquivos de
emos em nosso jogo,
nte.

va para digitarmos o

T r a b a l h a n d o
e m
u m
j o g o

c o m

m s i c a

s o n s

package br.com.appsom;
import android.app.Activity;
import android.graphics.drawable.*;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import android.os.*;
public class AppSom extends Activity {
enum EStatus { PARADO_ESQUERDA, PARADO_DIREITA,
CORRENDO_PRA_DIREITA, CORRENDO_PRA_ESQUERDA,
PULANDO_ESQUERDA, PULANDO_DIREITA };

ImageView imgsonic, imgchao;
Button botao;
AnimationDrawable frameSonic, frameChao;
EStatus StatusSonic;


Thread PularSonic;
Handler _PularSonic;

boolean tecla_pressionada;

int top;

MediaPlayer mp;

SoundPool sp;

int SOUND_JUMP_ID;

int count ;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgsonic = (ImageView) findViewById(R.id.imgsonic);
imgchao = (ImageView) findViewById(R.id.imgchao);
imgchao.setImageResource(R.drawable.chao);
frameChao = (AnimationDrawable) imgchao.getDrawable();
172

Book Apostila.indb 172

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

imgsonic.setImageResource(R.drawable.sonic_parado_
direita);

tecla_pressionada = false;
_PularSonic = new Handler();
mp = MediaPlayer.create(this, R.raw.marble_zone);
mp.setLooping(true);
try {

mp.start();
}catch(Exception e) {


}
sp = new SoundPool(1, AudioManager.STREAM_MUSIC,
0);
SOUND_JUMP_ID = sp.load(this, R.raw.jump,1);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {


if(!tecla_pressionada) {


tecla_pressionada = true;


frameChao.start();



switch(keyCode) {


case KeyEvent.KEYCODE_DPAD_RIGHT: {

StatusSonic = EStatus.CORRENDO_PRA_DIREITA;

imgsonic.setImageResource(R.drawable.
sonic_correndo_direita);

173

Book Apostila.indb 173

frameSonic = (AnimationDrawable)
imgsonic.getDrawable();
frameSonic.start(); //Inicia a animao

27/01/2012 15:13:58

T r a b a l h a n d
e m
u m
j o g




} break;


case KeyEven

StatusSonic = E

imgsonic.set
sonic_correndo_


frameSo
getDrawable();

frameSonic.s

} break;



case KeyEven


if(StatusSonic

StatusSo

else if(StatusS

StatusSo

imgsonic.setIma


executarSom(


PuloDo

} break;


case Ke

m

fi


}


}


return true;
}

public boolean onKe





frameChao.stop



if( (StatusSonic !

(StatusSonic !=

i l e

( J A V A )

rawable.sonic_parado_

w.marble_zone);

ager.STREAM_MUSIC,

.raw.jump,1);

de, KeyEvent event) {

D_RIGHT: {
NDO_PRA_DIREITA;
drawable.

ble)

mao

T r a b a l h a n d o
e m
u m
j o g o

c o m

m s i c a

s o n s




} break;


case KeyEvent.KEYCODE_DPAD_LEFT: {

StatusSonic = EStatus.CORRENDO_PRA_ESQUERDA;

imgsonic.setImageResource(R.drawable.
sonic_correndo_esquerda);

frameSonic = (AnimationDrawable) imgsonic.
getDrawable();

frameSonic.start(); //Inicia a animao

} break;



case KeyEvent.KEYCODE_DPAD_CENTER: {


if(StatusSonic ==EStatus.PARADO_DIREITA)

StatusSonic= EStatus.PULANDO_DIREITA;

else if(StatusSonic ==EStatus.PARADO_ESQUERDA)

StatusSonic= EStatus.PULANDO_ESQUERDA;

imgsonic.setImageResource(R.drawable.sonic_pulando);


executarSom(SOUND_JUMP_ID);


PuloDoSonic();

} break;


case KeyEvent.KEYCODE_DPAD_DOWN: {

mp.stop();

finish();} break;


}


}


return true;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {



frameChao.stop();



if( (StatusSonic != EStatus.PULANDO_DIREITA) &&

(StatusSonic != EStatus.PULANDO_ESQUERDA)) {

Book Apostila.indb 174

174

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

frameSonic.stop();


if(StatusSonic == EStatus.CORRENDO_PRA_DIREITA){

imgsonic.setImageResource(R.drawable.sonic_parado_
direita);

StatusSonic = EStatus.PARADO_DIREITA;

}

else {

imgsonic.setImageResource(R.drawable.sonic_parado_
esquerda);

StatusSonic = EStatus.PARADO_ESQUERDA;


}



tecla_pressionada = false;


}


return true;
}

175

Book Apostila.indb 175

public void PuloDoSonic() {




count = 1;


PularSonic = new Thread(new Runnable() {


@Override

public void run() {


//Executa o pulo do sonic



while(count <= 10) {


top = imgsonic.getTop();


if(count <= 5)

top-=15;

else

top+=15;


_PularSonic.post(new Runnable() {


@Override

public void run() {

imgsonic.setLayoutParams(new

27/01/2012 15:13:58

T r a b a l h a n d
e m
u m
j o g

AbsoluteLayou

imgsoni



});


try {


Thread.s


}catch(Ex









_PularSonic.po


@Suppr

@Overri

public v



if(Statu
{

imgsonic.se
sonic_parad


tecla_

Status



} else {

imgsonic.set
sonic_parado

tecla_p

StatusS






}

});

i l e

( J A V A )

ENDO_PRA_DIREITA){
rawable.sonic_parado_

_DIREITA;

rawable.sonic_parado_

_ESQUERDA;

unnable() {

nable() {

ms(new

T r a b a l h a n d o
e m
u m
j o g o

c o m

m s i c a

AbsoluteLayout.LayoutParams(imgsonic.getWidth(),

imgsonic.getHeight(),imgsonic.getLeft() ,top ));

}

});


try {


Thread.sleep(40);


}catch(Exception e) {

}

count++;
}




_PularSonic.post(new Runnable() {


@SuppressWarnings(deprecation)

@Override

public void run() {



if(StatusSonic == EStatus.PULANDO_DIREITA)
{

imgsonic.setImageResource(R.drawable.
sonic_parado_direita);


tecla_pressionada = false;

StatusSonic = EStatus.PARADO_DIREITA;



} else {

imgsonic.setImageResource(R.drawable.
sonic_parado_esquerda);

tecla_pressionada = false;

StatusSonic = EStatus.PARADO_ESQUERDA;


}



}

});

Book Apostila.indb 176

s o n s

176

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )




}});


PularSonic.start();

mp = MediaPlayer.crea

mp.setLooping(true

Que cria uma instnc


mtodo create, pass
Atividade (this) e a m
jogo (arquivo marble_
res/raw e representad


}
public void executarSom(int ID) {


try {


AudioManager audioManager = (AudioManager)
getSystemService(AUDIO_SERVICE);

float actualVolume = (float) audioManager

. g e t S t r e a m Vo l u m e ( A u d i o M a n a g e r.
STREAM_MUSIC);

float maxVolume = (float) audioManager

.getStreamMaxVolume(AudioManager.
STREAM_MUSIC);

float volume = actualVolume / maxVolume;

sp.play(ID, volume, volume, 1, 0, 1f);

}catch(Exception e) {


}

}

Na linha seguinte ch
com que a msica rep
seguida, existe o segui
try {

mp.start();
}catch(Exception e) {

}

Que inicia a msica atr


trecho de cdigo est
mtodo start disparar u
durante a sua execu
que disparam uma exc
dentro de um bloco try

sp = new SoundPool(1

}
Se observarmos o cdigo do programa acima, ele praticamente
igual ao do projeto anterior, porm, com algumas linhas de
cdigos responsveis pelo gerenciamento e reproduo de
msica e som. Irei comentar essas linhas de cdigo. A linha de
cdigo abaixo (na seo de declarao de atributos):
MediaPlayer mp;

SoundPool sp;
Declara duas variveis sendo uma do tipo MediaPlayer
(responsvel por reproduzir a msica) e SoundPool
(responsvel por reproduzir o som de efeito). Agora dentro do
mtodo onCreate existe o seguinte trecho de cdigo abaixo:
177

Book Apostila.indb 177

T r a b a l h a n d
e m
u m
j o g

27/01/2012 15:13:58

Cria uma instncia d


valor do primeiro argu
1 (os demais argument
nmero de fluxo de u
(que no nosso caso, so

SOUND_JUMP_ID = sp

Carrega o arquivo W
Para cada arquivo carr
representar a execuo
nosso programa existe
como voc pode confe

public void executarSo



try {

AudioManager aud

i l e

( J A V A )

}});

AudioManager)
);
Manager
m e ( A u d i o M a n a g e r.

anager
lume(AudioManager.

xVolume;

);

cima, ele praticamente


om algumas linhas de
ento e reproduo de
s de cdigo. A linha de
de atributos):

do tipo MediaPlayer
sica) e SoundPool
feito). Agora dentro do
cho de cdigo abaixo:

T r a b a l h a n d o
e m
u m
j o g o

c o m

m s i c a

s o n s

mp = MediaPlayer.create(this, R.raw.marble_zone);
mp.setLooping(true);
Que cria uma instncia da classe MediaPlayer atravs do
mtodo create, passando como parmetro a referncia da
Atividade (this) e a msica MP3 que ser tocada durante o
jogo (arquivo marble_zone.mp3 que se encontra na pasta /
res/raw e representado pela parmetro R.raw.marble_zone).
Na linha seguinte chamado o mtodo setLooping que faz
com que a msica repita diversas vezes dentro do jogo. Em
seguida, existe o seguinte trecho de cdigo:
try {

mp.start();
}catch(Exception e) {

}
Que inicia a msica atravs do mtodo start. Observe que esse
trecho de cdigo est em uma estrutura try/catch pelo fato do
mtodo start disparar uma exceo caso ocorra algum problema
durante a sua execuo (pois todos os mtodos de uma classe
que disparam uma exceo, precisam estar obrigatoriamente
dentro de um bloco try/catch). Na linha seguinte:
sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
Cria uma instncia da classe SoundPool . Observe que o
valor do primeiro argumento passado para a classe o valor
1 (os demais argumentos passados so padres) que indica o
nmero de fluxo de udios que sero tocados durante o jogo
(que no nosso caso, somente haver um). A linha seguinte:
SOUND_JUMP_ID = sp.load(this, R.raw.jump,1);
Carrega o arquivo WAV que representa os som de efeito.
Para cada arquivo carregado existe uma ID (varivel), que vai
representar a execuo daquele arquivo. Na estrutura geral do
nosso programa existe uma classe que se chama executarSom,
como voc pode conferir abaixo:
public void executarSom(int ID) {

try {

AudioManager audioManager = (AudioManager)

Book Apostila.indb 178

178

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

getSystemService(AUDIO_SERVICE);

float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);


float maxVolume = (float) audioManager


.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = actualVolume / maxVolume;
sp.play(ID, volume, volume, 1, 0, 1f);


}catch(Exception e) { }

}

Que ser responsvel por executar um som de acordo com o
valor da ID passada como parmetro nesta classe.
Vamos executar o nosso jogo para vermos os resultados,
conforme mostra a figura seguinte:

Jogo em execuo

179

Book Apostila.indb 179

27/01/2012 15:13:58

T r a b a l h a n d
e m
u m
j o g

i l e

( J A V A )

T r a b a l h a n d o
e m
u m
j o g o

);
Manager
r.STREAM_MUSIC);

c o m

m s i c a

s o n s

ANOTAES

anager
er.STREAM_MUSIC);

xVolume;

som de acordo com o


sta classe.

vermos os resultados,

180

Book Apostila.indb 180

27/01/2012 15:13:58

D e s e n v o l v

G a m e

M o b i l e

C a p t u l o
D e s e n v o l v e n d o

u m

( J A V A )

At agora os jogos qu
foram simplesmente d
existentes no Android
e musicas dentro do jo
tempo de execuo e e

1 3

j o g o

d e

c o r r i d a

Agora iremos desenvol


todas as tcnicas de p
at agora. O jogo vai c
haver um carro em
que desviar dos outros
controlando bater em
(ser aberta uma tela
oportunidade de jogar

A medida em que o usu


os outros, ele ganha um
atingir 200 pontos, el
mostrando que o usu
novamente o jogo ou s

Vamos colocar a mo
Crie o projeto com os s

Project name : JogoDe

Application name : Jog

Package name: br.com

Create Activity : AppCo


Min SDK Version : 7

Depois de criado o
imagens que iremos ut
dentro do diretrio dra

Book Apostila.indb 181

27/01/2012 15:13:58

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

At agora os jogos que criamos at este presente momento


foram simplesmente demonstraes de recursos e tcnicas
existentes no Android (como por exemplo trabalhar com sons
e musicas dentro do jogo, tcnicas de criao de objetos em
tempo de execuo e etc.).
r r i d a

Agora iremos desenvolver realmente um jogo , que vai englobar


todas as tcnicas de programao em Android apresentadas
at agora. O jogo vai consistir em um game de corrida, onde
haver um carro em que iremos controlar e o mesmo ter
que desviar dos outros, sem bater. Se o carro que estivermos
controlando bater em outro (houver coliso) , o jogo termina
(ser aberta uma tela de game over, onde o usurio ter a
oportunidade de jogar novamente o jogo ou sair do mesmo).
A medida em que o usurio que controla seu carro vai passando
os outros, ele ganha uma pontuao (10 pontos). Se o usurio
atingir 200 pontos, ele vence o jogo (ser aberta uma tela
mostrando que o usurio venceu a corrida, podendo jogar
novamente o jogo ou sair do mesmo).
Vamos colocar a mo na massa para criamos o nosso jogo.
Crie o projeto com os seguintes dados abaixo:

Project name : JogoDeCorrida


Application name : Jogo de corrida
Package name: br.com.appcorrida
Create Activity : AppCorrida
Min SDK Version : 7
Depois de criado o projeto, vamos importar as seguintes
imagens que iremos utilizar em nosso jogo (as imagens estaro
dentro do diretrio drawable-mdpi).

182

Book Apostila.indb 182

27/01/2012 15:13:58

G a m e

M o b i l e

( J A V A )

D e s e n v o l v

Propriedade
Src
Layout width
Layout height
Scale type

Agora dentro da estrut


LinearLayout

Propriedade
Id
Layout width
Layout height
Gravity

Dentro da estrutura qu
componente:
TextView
Dentro da pasta res ser criado um diretrio chamado raw
onde dentro dele haver dois arquivos de som : musica.mid
e explosao.wav.
Agora vamos criar dentro do diretrio layout um arquivo XML
chamado voceganhou.xml, que uma tela que vai aparecer
quando o usurio vencer o jogo. Nesta tela, o jogador poder
ter a oportunidade de jogar novamente ou sair do game.

Propriedade
Text

Agora dentro da estrut


LinearLayout

Depois de criado o arquivo voceganhou.xml, altere as


propriedades da estrutura LinearLayout conforme abaixo:

Propriedade
Id
Layout width
Layout height
Gravity

LinearLayout
Propriedade
Id
Layout width
Layout height
Gravity

Valor
@+id/linearImagemCarro
fill_parent
200px
center

Dentro da estrutura qu
componentes:
Button

Agora dentro da estrutura LinearLayout que acabamos de


inserir, coloque o seguinte componente:
ImageView
183

Book Apostila.indb 183

27/01/2012 15:13:59

Propriedade
Id
Layout width

i l e

( J A V A )

D e s e n v o l v e n d o

Propriedade
Src
Layout width
Layout height
Scale type

d e

c o r r i d a

Valor
@+id/voce_venceu
150px
150px
fitXY

LinearLayout
Propriedade
Id
Layout width
Layout height
Gravity

Valor
@+id/linearTexto
fill_parent
wrap_content
center

Dentro da estrutura que colocamos acima, inserir o seguinte


componente:
TextView
Propriedade
Text

Valor
Voc ganhou. Deseja jogar
novamente ?

Agora dentro da estrutura principal, coloque o componente:


LinearLayout

anhou.xml, altere as
ut conforme abaixo:

Valor
d/linearImagemCarro
fill_parent
200px
center

j o g o

Agora dentro da estrutura principal, coloque o componente:

retrio chamado raw


de som : musica.mid

ayout um arquivo XML


a tela que vai aparecer
tela, o jogador poder
ou sair do game.

u m

Propriedade
Id
Layout width
Layout height
Gravity

Valor
@+id/linearBotoes
fill_parent
wrap_content
center

Dentro da estrutura que colocamos acima, inserir os seguintes


componentes:
Button

ut que acabamos de

Propriedade
Id
Layout width

Valor
@+id/btsim
Sim
184

Book Apostila.indb 184

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

Em seguida, dentro d
criar as seguintes clas
cdigos.

Button
Propriedade
Id
Layout width

D e s e n v o l v

Valor
@+id/btnao
No

ListaBranca.java. (Co

package br.com.appco

Veja como ficou a tela da nossa aplicao:

import android.content
import android.util.Attr
import android.widget.
import android.widget.

public class ListraBran


public ListraBran
super(con
setImage
setScaleT
}
}

Esta classe que criamos


simplesmente vai cont
vamos utilizar em noss
Tela do arquivo voceganhou.xml
Feito isso vamos criar um novo arquivo XML chamado
gameover.xml. O cdigo desse arquivo igual ao do arquivo
anteriormente criado. O que s muda a imagem e a frase (o
restante tudo igual), conforme voc confere abaixo:

ListaVermelha.java. (

package br.com.appco

import android.content
import android.util.Attr
import android.widget.

public class ListraVerm


public ListraBran
super(con
setImage
setScaleT
}
}

Esta classe que criamos


simplesmente vai cont
vamos utilizar em noss
185

Book Apostila.indb 185

Tela do arquivo gameover.xml

27/01/2012 15:13:59

i l e

( J A V A )

Valor
@+id/btnao
No

o:

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

Em seguida, dentro do pacote br.com.appcorrida vamos


criar as seguintes classes , cada uma com seus respectivos
cdigos.
ListaBranca.java. (Codificao)
package br.com.appcorrida;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
public class ListraBranca extends ImageView {

public ListraBranca(Context context, AttributeSet attrs) {
super(context, attrs);
setImageResource(R.drawable.listra_branca);
setScaleType(ScaleType.FIT_XY);
}
}
Esta classe que criamos, derivada da classe (widget) ImageView,
simplesmente vai conter a imagem de uma listra branca que
vamos utilizar em nosso jogo.

hou.xml

quivo XML chamado


o igual ao do arquivo
a imagem e a frase (o
onfere abaixo:

ListaVermelha.java. (Codificao)
package br.com.appcorrida;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
public class ListraVermelha extends ImageView {

public ListraBranca(Context context, AttributeSet attrs) {
super(context, attrs);
setImageResource(R.drawable.listra_vermelha);
setScaleType(ScaleType.FIT_XY);
}
}
Esta classe que criamos, derivada da classe (widget) ImageView,
simplesmente vai conter a imagem de uma listra vermelha que
vamos utilizar em nosso jogo.

ver.xml

186

Book Apostila.indb 186

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

D e s e n v o l v

return po
}
}

Faixa.java. (Codificao)
package br.com.appcorrida;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

Essa classe respon


usurio. Vamos conhec

public class Faixa extends ImageView {

setPanel: Neste mto


existente e inserido na
como painel onde se

zerarPontuacao: Respo


public Faixa(Context context, AttributeSet attrs) {
super(context, attrs);
setImageResource(R.drawable.listra_branca);
setScaleType(ScaleType.FIT_XY);
}
}

somarPontucao: Soma
soma pode ser especifi

getPontuacao: Retorna
do jogador.

Essa classe representa uma imagem que consiste naquela faixa


branca, que fica no meio da pista. Como nas outras classes
personalizadas acima, ela tambm deriva da widget ImageView.

StatusJogo.java. (Co

package br.com.appco
Pontuacao.java. (Codificao)
package br.com.appcorrida;
import android.widget.TextView;

187

Book Apostila.indb 187

public class Pontuacao {




private static int pontuacao;

private static TextView txtpontuacao;


public static void zerarPontuacao() {

pontuacao = 0;

txtpontuacao.setText(Pontuao: + pontuacao);
}


public static void setPanel(TextView _txt) {

txtpontuacao = _txt;
}

public static void somarPontuacao(int _pontuacao){


pontuacao += _pontuacao;

txtpontuacao.setText(Pontuao: + pontuacao);

}


public static int getPontuacao() {

27/01/2012 15:13:59

public class StatusJog




enum Status { E


private static Sta


public static Sta
return sta
}

public static void

status = s
}
}

Esta classe respons


status so EM_AND
conferir os mtodos ab

getStatusJogo: Obtm

setStatusJogo: Permit
execuo.

Colisao.java. (Codific

package br.com.appco

i l e

( J A V A )

D e s e n v o l v e n d o

u m

j o g o

d e

return pontuacao;
}
}
Essa classe responsvel por gerenciar a pontuao do
usurio. Vamos conhecer os mtodos responsveis por isso.

Type;

zerarPontuacao: Responsvel por zerar a pontuao do usurio.

ibuteSet attrs) {

setPanel: Neste mtodo definimos um objeto TextView j


existente e inserido na tela do dispositivo, que ser utilizado
como painel onde ser exibida a pontuao do usurio.

able.listra_branca);
T_XY);

somarPontucao: Soma a pontuao do usurio. O valor da


soma pode ser especificado no parmetro do mtodo.

consiste naquela faixa


mo nas outras classes
a da widget ImageView.

ao;

() {

tuao: + pontuacao);

getPontuacao: Retorna em um tipo int o valor atual da pontuao


do jogador.
StatusJogo.java. (Codificao)
package br.com.appcorrida;
public class StatusJogo {


enum Status { EM_ANDAMENTO, GAME_OVER };


private static Status status;


public static Status getStatusJogo() {
return status;
}

public static void setStatusJogo(Status sts) {

status = sts;
}
}

ew _txt) {

Esta classe responsvel por gerenciar o status do jogo (cujo


status so EM_ANDAMENTO e GAME_OVER). Vamos
conferir os mtodos abaixo:

o(int _pontuacao){

getStatusJogo: Obtm o status atual do jogo em execuo.

o;
tuao: + pontuacao);

c o r r i d a

setStatusJogo: Permite alterar o status atual do jogo em


execuo.
Colisao.java. (Codificao)
package br.com.appcorrida;

Book Apostila.indb 188

188

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

import android.view.View;
public class Colisao {

public static boolean colisaoObjeto(View v1, View v2) {

if( ((v1.getLeft() + v1.getWidth()) >= v2.getLeft())
&&



((v1.getLeft() <= (v2.getLeft() + v2.getWidth()
)) &&




((v1.getTop()
+
v1.getHeight())
>=
v2.getTop()) &&




((v1.getTop() <= (v2.getTop() + v2.getHeight()
)))))




return true;


else



return false;
}
}
Nesta classe existe um mtodo responsvel por detectar
a coliso de um objeto sobre o outro (mtodo chamado
colisaoObjeto). O cdigo desse mtodo similar aos mtodos
de coliso j usados anteriormente neste material.
Depois de criado as classe solicitadas acima, vamos no arquivo
main.xml e em seguida remova o componente TextView da
tela do dispositivo e em seguida, vamos trocar a estrutura de
layout padro para o AbsoluteLayout. Feito isso, adicione os
seguintes componentes na seqncia :
ImageView
Propriedade
Id
Scale type
Src
Layout height
Layout width
Layout x
Layout y

Valor
@+id/pista
fitXY
@drawable/pista
fill_parent
230px
48dip
2dip

Propriedade
Id
Scale type
Src
Layout height
Layout width
Layout x
Layout y
ImageView

Propriedade
Id
Scale type
Src
Layout height
Layout width
Layout x
Layout y

Agora vamos no cd
digitarmos o seguint
AbosluteLayout>).

<br.com.appcorrida.Lis
android:layout_width
android:scaleType=
android:src=@draw
android:layout_y=0d
android:layout_heigh
android:layout_x=20
</br.com.appcorrida.Li

<br.com.appcorrida.Fa
android:src=@draw
android:layout_x=1
android:layout_y=3
android:layout_heig
android:layout_widt
android:id=@+id/fa
</br.com.appcorrida.Fa

<br.com.appcorrida.Lis

ImageView
189

Book Apostila.indb 189

D e s e n v o l v

27/01/2012 15:13:59

i l e

( J A V A )

D e s e n v o l v e n d o

Propriedade
Id
Scale type
Src
Layout height
Layout width
Layout x
Layout y

to(View v1, View v2) {


Width()) >= v2.getLeft())

getLeft() + v2.getWidth()
v1.getHeight())

>=

cima, vamos no arquivo


mponente TextView da
s trocar a estrutura de
Feito isso, adicione os

Valor
@+id/pista
fitXY
@drawable/pista
fill_parent
230px
48dip
2dip

j o g o

d e

c o r r i d a

Valor
@+id/imglistrabranca1
fitXY
@drawable/lista_branca
fill_parent
30px
20dip
0dip

ImageView
Propriedade
Id
Scale type
Src
Layout height
Layout width
Layout x
Layout y

tTop() + v2.getHeight()

ponsvel por detectar


tro (mtodo chamado
similar aos mtodos
e material.

u m

Valor
@+id/imglistrabranca2
fitXY
@drawable/lista_branca
fill_parent
30px
277dip
0dip

Agora vamos no cdigo XML do arquivo main.xml para


digitarmos o seguinte cdigo abaixo (antes da tag </
AbosluteLayout>).
<br.com.appcorrida.ListraVermelha
android:layout_width=30px
android:scaleType=fitXY
android:src=@drawable/listra_branca
android:layout_y=0dip
android:layout_height=100px
android:layout_x=20dip>
</br.com.appcorrida.ListraVermelha>
<br.com.appcorrida.Faixa android:scaleType=fitXY
android:src=@drawable/listra_branca
android:layout_x=152dip
android:layout_y=3dip
android:layout_height=80px
android:layout_width=15px
android:id=@+id/faixa>
</br.com.appcorrida.Faixa>
<br.com.appcorrida.ListraVermelha
190

Book Apostila.indb 190

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

android:scaleType=fitXY
android:src=@drawable/listra_branca
android:layout_height=100px
android:layout_width=30px
android:layout_x=277dip
android:layout_y=69dip>
</br.com.appcorrida.ListraVermelha>

<br.com. appcorrida.Li
>

Observe que antes da


do pacote no qual a c
aplica a estrutura XML

<br.com.appcorrida.ListraVermelha
android:scaleType=fitXY
android:src=@drawable/listra_branca
android:layout_height=100px
android:layout_width=30px
android:layout_x=20dip
android:layout_y=265dip>
</br.com.appcorrida.ListraVermelha>

Agora dentro do diret


appcorrida vamos cria
seus respectivos cdig

CarroPlayer.java (Cod

package br.com.appco

<br.com.appcorrida.ListraVermelha
android:scaleType=fitXY
android:src=@drawable/listra_branca
android:layout_height=100px
android:layout_width=30px
android:layout_x=277dip
android:layout_y=335dip>
</br.com.appcorrida.ListraVermelha>

import android.content
import android.util.Attr
import android.view.Vie
import android.widget.

public class CarroPlaye

Depois de inserido o cdigo acima, salve o arquivo main.xml.


As widgets padres do Android se encontram na guia de paleta
de componentes. Como as classes Sonic e Anel foran criadas
pelo usurio, o nico jeito de adicionarmos esses componentes
em tempo de projeto e pelo cdigo XML. Vamos analisar a
estrutura XML de cada uma delas. Por exemplo, as widgets
padres do Android como o ImageView so representadas
dessa forma:
<ImageView
:
></ImageView>
No caso da classe como ListraVermelha ela representada
dessa forma:
191

Book Apostila.indb 191

D e s e n v o l v

<br.com.appcorrida.ListraVermelha

27/01/2012 15:13:59


AbsoluteLayout



public CarroPlay
super(con
setImage
}


public void setTe

tela = t;
}


public void mov

int left = getLef

left+=10;


//Verifica se co

int count = tela.

View v;

for(int x = 0; x <

v = tela.getCh

if((v.getId()==R

i l e

( J A V A )

e o arquivo main.xml.

ntram na guia de paleta


c e Anel foran criadas
os esses componentes
ML. Vamos analisar a
r exemplo, as widgets
ew so representadas

ha ela representada

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

:
<br.com. appcorrida.ListraVermelha
>
Observe que antes da palavra ListraVermelha, existe o nome
do pacote no qual a classe se encontra. A mesma regra se
aplica a estrutura XML das outras classes.
Agora dentro do diretrio src, dentro do pacote br.com.
appcorrida vamos criar as seguintes classes , cada uma com
seus respectivos cdigos.
CarroPlayer.java (Codificao)
package br.com.appcorrida;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.*;

public class CarroPlayer extends ImageView {



AbsoluteLayout tela;



public CarroPlayer(Context context, AttributeSet attrs) {
super(context, attrs);
setImageResource(R.drawable.carro_branco);
}


public void setTela(AbsoluteLayout t) {

tela = t;
}


public void moverParaDireita() {

int left = getLeft();

left+=10;


//Verifica se colidiu se saiu fora da pista

int count = tela.getChildCount();

View v;

for(int x = 0; x < count ; x++) {

v = tela.getChildAt(x);

if((v.getId()==R.id.pista) &&

Book Apostila.indb 192

192

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )




(getLeft() + getWidth()) > (v.getLeft() + v.getWidth())


){

left = (v.getLeft() + v.getWidth()) - getWidth() + 5 ;


break;

}
}
setLayoutParams(new
AbsoluteLayout.
LayoutParams(getWidth(),
getHeight(),left, getTop()));

}



public void moverParaEsquerda() {

int left = getLeft();

left-=10;


//Verifica se colidiu com algum objeto do tipo ListaBranca

int count = tela.getChildCount();

View v;

for(int x = 0; x < count ; x++) {

v = tela.getChildAt(x);
if((v.getId()==R.id.pista) &&



(getLeft() < v.getLeft())


){


left = v.getLeft() - 5;


break;

}
}
setLayoutParams(new
LayoutParams(getWidth(),
getHeight(),left, getTop()));

}

AbsoluteLayout.

}
CarroOponente.java (Codificao)
package br.com.appcorrida;

193

Book Apostila.indb 193

import br.com.appcorrida.StatusJogo.Status;
import android.content.Context;

27/01/2012 15:13:59

D e s e n v o l v

import android.os.Hand
import android.widget.
import android.widget.
import android.widget.

public class CarroOpon




Handler hMover



Runnable rMove

AbsoluteLayout



CarroPlayer carr


private boolean


AppCorrida app


int left;

public CarroOpo
super(con


long valor


if((valor %

th
amarelo);
else
this.setI
vermelho);

setVisibili

this.setSc


hMoverC


saiu_da_t


}



public void setTela(Ab

this.tela = tela;
}

i l e

( J A V A )

eft() + v.getWidth())

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

import android.os.Handler;
import android.widget.AbsoluteLayout;
import android.widget.ImageView;
import android.widget.AbsoluteLayout.LayoutParams;

getWidth() + 5 ;

AbsoluteLayout.

public class CarroOponente extends ImageView{




Handler hMoverCarro;



Runnable rMoverCarro;

AbsoluteLayout tela;



CarroPlayer carro_player;


private boolean saiu_da_tela;


AppCorrida app_corrida;

eto do tipo ListaBranca

atus;

AbsoluteLayout.


int left;

public CarroOponente(Context context) {
super(context);


long valor = Math.round(Math.random() * 10);


if((valor % 2)==0)

this.setImageResource(R.drawable.carro_
amarelo);
else
this.setImageResource(R.drawable.carro_
vermelho);

setVisibility(CarroOponente.INVISIBLE);

this.setScaleType(ScaleType.FIT_XY);


hMoverCarro = new Handler();


saiu_da_tela = false;


}



public void setTela(AbsoluteLayout tela) {

this.tela = tela;
}

Book Apostila.indb 194

194

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

public void setActivity(AppCorrida app) {




app_corrida = app;

}
public void setCarroPlayer(CarroPlayer c) {

carro_player = c;
}
public void moverCarro(int posicao_x) {

195

Book Apostila.indb 195

left = posicao_x;
rMoverCarro = new Runnable() {

@Override

public void run() {


int top = getTop();


top+=10;


//Desloca o carro para baixo


setLayoutParams(new
AbsoluteLayout.
LayoutParams(50,80,left,
top));


if(getVisibility()==CarroOponente.INVISIBLE)

setVisibility(CarroOponente.VISIBLE);


//Verifica se houve coliso do carro oponente com o
carro do
//jogador

if(Colisao.colisaoObjeto(CarroOponente.this, carro_
player))
{

app_corrida.somExplosao();

StatusJogo.setStatusJogo(Status.GAME_
OVER);

app_corrida.CarregarGameOver();


}


if(top < 500) {


if(StatusJogo.getStatusJogo()==Status.EM_
ANDAMENTO)

27/01/2012 15:13:59

D e s e n v o l v


hMove


}

else {


Pont
pontuao em 10
//pontos



tela.rem


if(Pontu
ganhou

app_co

}


}
};


hMoverCarro.po
}
}

Agora vamos no arqui


seguinte cdigo abaixo

package br.com.appco

import br.com.appcorri
import android.app.Ac
import android.media.A
import android.media.M
import android.media.S
import android.os.Bund
import android.os.Hand
import android.view.Ke
import android.view.Vie
import android.widget.
import android.widget.
import android.widget.
import android.widget.
import android.view.*;

public class AppCorrid

i l e

( J A V A )

u m

j o g o

d e

c o r r i d a


hMoverCarro.postDelayed(rMoverCarro, 40);


}

else {


Pontuacao.somarPontuacao(10); //Soma a
pontuao em 10
//pontos



tela.removeView(CarroOponente.this);


if(Pontuacao.getPontuacao() > 200) //O jogador
ganhou

app_corrida.CarregarVoceGanhou();

}


}
};


hMoverCarro.postDelayed(rMoverCarro, 40);
}

c) {

ew

D e s e n v o l v e n d o

AbsoluteLayout.
}

e.INVISIBLE)
IBLE);

Agora vamos no arquivo AppCorrida.java para digitarmos o


seguinte cdigo abaixo:

carro oponente com o

package br.com.appcorrida;

oOponente.this, carro_

o();
usJogo(Status.GAME_

meOver();

usJogo()==Status.EM_

import br.com.appcorrida.StatusJogo.Status;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.TextView;
import android.widget.AbsoluteLayout.LayoutParams;
import android.view.*;
public class AppCorrida extends Activity {

Book Apostila.indb 196

196

27/01/2012 15:13:59

G a m e

SentidoCarro sentido_carro;
Runnable rMoverCarro,rMoverFaixas,rCriarCarros;
Handler hMoverCarro,hMoverFaixas,hCriarCarros;
boolean tecla_pressionada;
CarroPlayer carro_player;
TextView txtpontos;
AbsoluteLayout tela;
AppCorrida act;
MediaPlayer media_player;
SoundPool sound;
int ID_SOM;
public void CarregarVoceGanhou() {

Book Apostila.indb 197

( J A V A )

enum SentidoCarro { PRA_DIREITA, PRA_ESQUERDA };

197

M o b i l e

media_player.stop();
setContentView(R.layout.voceganhou);

Button btsim = (Button) findViewById(R.id.btsim);



btsim.setOnClickListener(new
View.
OnClickListener() {

@Override

public void onClick(View arg0) {
AppCorrida.this.CarregarJogo();

}
});

Button btnao = (Button) findViewById(R.id.btnao);

btnao.setOnClickListener(new
View.
OnClickListener() {

@Override

public void onClick(View arg0) {

27/01/2012 15:13:59

D e s e n v o l v



}
});

}





public void Carr
media_pl
setConte


Button bt

btsim.set
OnClickListener() {

@O

pu


}
});

Button btnao = (B

btnao.set
OnClickListener() {

@O

pu


}
});

}
@Override

protected void o

// TODO
super.onD
media_pl
}


public void som
try {

i l e

( J A V A )

TA, PRA_ESQUERDA };

xas,rCriarCarros;

as,hCriarCarros;

){

nhou);

Id(R.id.btsim);

ew

View.

View arg0) {
his.CarregarJogo();

Id(R.id.btnao);

ew

View arg0) {

View.

D e s e n v o l v e n d o

u m

j o g o

d e

AppCorrida.this.finish();

}
});

}





public void CarregarGameOver() {
media_player.stop();
setContentView(R.layout.gameover);


Button btsim = (Button) findViewById(R.id.btsim);

btsim.setOnClickListener(new
View.
OnClickListener() {

@Override

public void onClick(View arg0) {
AppCorrida.this.CarregarJogo();

}
});

Button btnao = (Button) findViewById(R.id.btnao);

btnao.setOnClickListener(new
View.
OnClickListener() {

@Override

public void onClick(View arg0) {
AppCorrida.this.finish();

}
});

}
@Override

protected void onDestroy() {

// TODO Auto-generated method stub
super.onDestroy();
media_player.stop();
}


public void somExplosao() {
try {

Book Apostila.indb 198

c o r r i d a

198

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

AudioManager audioManager = (AudioManager)


getSystemService(AUDIO_SERVICE);


float actualVolume = (float) audioManager

.getStreamVolume(AudioManager.STREAM_MUSIC);

float maxVolume = (float) audioManager

.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

float volume = actualVolume / maxVolume;


sound.play(ID_SOM, volume, volume, 1, 0, 1f);


}catch(Exception e) {

}
}

public void CarregarJogo() {


media_player = MediaPlayer.create(this,R.raw.musica);


media_player.setLooping(true);


media_player.start();


sound = new SoundPool(1, AudioManager.STREAM_
MUSIC, 0);


ID_SOM = sound.load(this, R.raw.explosao, 1);


setContentView(R.layout.main);
carro_player = (CarroPlayer) findViewById(R.id.carro_player);
tela = (AbsoluteLayout) findViewById(R.id.tela);
txtpontos = (TextView) findViewById(R.id.txtpontos);
Pontuacao.setPanel(txtpontos);
Pontuacao.zerarPontuacao();
act = this;

199

Book Apostila.indb 199

StatusJogo.setStatusJogo(StatusJogo.Status.EM_
ANDAMENTO);

27/01/2012 15:13:59

D e s e n v o l v

carro_player.setTe

hMoverCarro = ne

rMoverCarro = ne

@Overrid

public vo


if(sentid

carro_p

else

carro_p



if(tecla_p
hM
40);

}
};


hMoverFaixas =


rMoverFaixas =


@Override

public void run



int count

int top=0;

View v;


if(Status
ANDAMENTO) {

for (int x

v = tela


if( (v insta
Faixa)) {

top = v


top+=2

i l e

( J A V A )

ager = (AudioManager)
VICE);
audioManager

r.STREAM_MUSIC);

udioManager

ager.STREAM_MUSIC);
e / maxVolume;

me, volume, 1, 0, 1f);

ate(this,R.raw.musica);

dioManager.STREAM_

explosao, 1);

ById(R.id.carro_player);

d(R.id.tela);

d(R.id.txtpontos);

StatusJogo.Status.EM_

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

carro_player.setTela(tela);
hMoverCarro = new Handler();
rMoverCarro = new Runnable() {

@Override

public void run() {


if(sentido_carro==SentidoCarro.PRA_DIREITA)

carro_player.moverParaDireita();

else

carro_player.moverParaEsquerda();



if(tecla_pressionada)
hMoverCarro.postDelayed(rMoverCarro,
40);

}
};


hMoverFaixas = new Handler();


rMoverFaixas = new Runnable() {


@Override

public void run() {



int count = tela.getChildCount();

int top=0;

View v;


if(StatusJogo.getStatusJogo()==Status.EM_
ANDAMENTO) {

for (int x = 0; x < count ; x++) {

v = tela.getChildAt(x);


if( (v instanceof ListraVermelha) || (v instanceof
Faixa)) {

top = v.getTop();


top+=20;

Book Apostila.indb 200

200

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )


if(top > 424 + v.getHeight())

top = -v.getHeight();

v.setLayoutParams(new AbsoluteLayout.
LayoutParams(
v.getWidth(),v.getHeight(),v.getLeft(),top));
}




}



hMoverFaixas.postDelayed(rMoverFaixas,
20);

}

}


};


hMoverFaixas.postDelayed(rMoverFaixas, 20);


hCriarCarros = new Handler();


rCriarCarros = new Runnable() {

@Override

public void run() {

CarroOponente carro_oponente;

if(StatusJogo.getStatusJogo()==Status.EM_ANDAMENTO)
{


carro_oponente = new CarroOponente(act);




tela.addView(carro_oponente);

carro_oponente.setTela(tela);

201

Book Apostila.indb 201


190) +

int posicao_x = (int) Math.round(Math.random() *

27/01/2012 15:13:59

D e s e n v o l v

48;


carro_oponent



carro_opon
carro_op


hCriarCa


}
};

hCriarCar

}
@Override
public void onCreate
super.onCreate(sa
CarregarJogo();
}

@Override
public boolean onKe


if((!tecla_pressio
(StatusJogo.getSta


tecla_pressionad


switch (keyCode

case KeyEvent

sentido_carro


hMoverCarro.p

break;

}



case KeyEvent

sentido_carro


hMoverCarro.p
break;

}

i l e

( J A V A )

t())
;

(new AbsoluteLayout.

etLeft(),top));

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

48;


carro_oponente.setActivity(AppCorrida.this);



carro_oponente.setCarroPlayer(carro_player);
carro_oponente.moverCarro(posicao_x);


hCriarCarros.postDelayed(rCriarCarros, 1500);
}

}
};

hCriarCarros.postDelayed(rCriarCarros, 1000);

Delayed(rMoverFaixas,

verFaixas, 20);

onente;

tus.EM_ANDAMENTO)

arroOponente(act);

ente);
ela);

.round(Math.random() *

}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CarregarJogo();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {


if((!tecla_pressionada) &&
(StatusJogo.getStatusJogo()==Status.EM_ANDAMENTO) ){

tecla_pressionada = true;


switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_RIGHT: {

sentido_carro = SentidoCarro.PRA_DIREITA;


hMoverCarro.postDelayed(rMoverCarro, 80);

break;

}



case KeyEvent.KEYCODE_DPAD_LEFT: {

sentido_carro = SentidoCarro.PRA_ESQUERDA;


hMoverCarro.postDelayed(rMoverCarro, 40);
break;

}

Book Apostila.indb 202

202

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

D e s e n v o l v

}

}

return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {


tecla_pressionada = false;

}

return super.onKeyUp(keyCode, event);

}
Finalmente terminamos nosso jogo. Vamos coloc-lo em
execuo. Confira os resultados nas imagens abaixo:

Tela do jo

Tela do jogo (durante a corrida)

Tela do jogo

203

Book Apostila.indb 203

27/01/2012 15:13:59

i l e

( J A V A )

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

e, event);

KeyEvent event) {

event);

Vamos coloc-lo em
agens abaixo:

Tela do jogo (Quando o carro bate)

a corrida)

Tela do jogo (Quando o usurio ganha)

204

Book Apostila.indb 204

27/01/2012 15:13:59

G a m e

M o b i l e

( J A V A )

Concluso
Neste material aprendemos como construir nossos prprios
jogos voltados para a plataforma Google Android, utilizando
todas as tcnicas de desenvolvimento aqui apresentadas nesta
apostila (como a criao de objetos dinmicos, manipulao
de sprites, colises de objetos e etc.). Como pr-requisito, o
usurio que deseja desenvolver jogos para Android, precisa dos
conhecimentos essenciais da linguagem Java, pois sobre ela
que a plataforma trabalha. Com isso, neste material tambm
tivemos a oportunidade de aprendermos os fundamentos
bsicos e essenciais da linguagem Java, antes mesmo de
comearmos a programao com jogos no Android na apostila.

205

Book Apostila.indb 205

27/01/2012 15:14:00

D e s e n v o l v

i l e

( J A V A )

D e s e n v o l v e n d o

u m

j o g o

d e

c o r r i d a

ANOTAES

struir nossos prprios


gle Android, utilizando
qui apresentadas nesta
nmicos, manipulao
Como pr-requisito, o
ra Android, precisa dos
m Java, pois sobre ela
neste material tambm
mos os fundamentos
ava, antes mesmo de
no Android na apostila.

206

Book Apostila.indb 206

27/01/2012 15:14:00