Table Of Content© CasadoCódigo
Todos os direitos reservados e protegidos pela Lei nº9.610, de
10/02/1998.
Nenhumapartedestelivropoderáserreproduzida,nemtransmitida,sem
autorização prévia por escrito da editora, sejam quais forem os meios:
fotográficos,eletrônicos,mecânicos,gravaçãoouquaisqueroutros.
CasadoCódigo
Livrosparaoprogramador
RuaVergueiro,3185-8ºandar
04101-300–VilaMariana–SãoPaulo–SP–Brasil
CasadoCódigo Sumário
Sumário
1 Sobreoautor 1
2 Porqueumjogomobile? 3
3 ComeçandooJumper 5
3.1 Criandooprojetoeatelaprincipal . . . . . . . . . . . . . . . 5
3.2 CriandooloopprincipaldoJumper . . . . . . . . . . . . . . 11
3.3 ComodesenharelementosnoSurfaceView? . . . . . . . . . . 13
3.4 CriandonossoprimeiroelementodoJumper:aclassePassaro 15
3.5 Criandoocomportamentopadrãodopássaro:ométodocai 20
4 Colocandoumaimagemdefundo 21
4.1 Implementandoocontroledojogador:opulodopássaro . . 29
5 Criandoocanoinferior 31
5.1 Movimentandoocano . . . . . . . . . . . . . . . . . . . . . . 37
6 Criandovárioscanos 39
6.1 Criandooslimitesparapulo:ochãoeteto . . . . . . . . . . . 44
7 Criandooscanossuperiores 47
7.1 Criandoinfinitoscanos . . . . . . . . . . . . . . . . . . . . . . 51
7.2 Descartandocanosanteriores . . . . . . . . . . . . . . . . . . 53
8 Criandoapontuaçãodojogo 57
i
Sumário CasadoCódigo
9 Tratandocolisões 69
9.1 Criandoateladegameover . . . . . . . . . . . . . . . . . . . 72
9.2 Centralizandoumtextohorizontalmentenatela . . . . . . . 75
10 Aprimorandoolayoutdojogo 79
10.1 Substituindoosretângulosporbitmaps. . . . . . . . . . . . . 82
11 Adicionandosomaojogo 87
ii
Capítulo1
Sobre o autor
Desde o momento em que escrevi minha primeira linha de código em um
projetinho Android de estudos me senti completamente empolgado com as
diversaspossibilidadesdeaplicaçõesquepoderiadesenvolvereresolvimer-
gulharnessemundoeaprendertudooquepudessesobreesseuniverso.
Naquelemomento, cursavameuúltimoanodagraduaçãonoIME-USP
eestavapesquisandooquefarianomeuprojetodeconclusãodecurso. Não
tivedúvidas: queriafazeralgocomAndroid,poisteriaumachanceparame
dedicaraaprendê-loafundo. Nofimdascontas,acabamosfazendoemdu-
pla um otimizador de rotas, onde tive meu primeiro contato com algumas
tecnologiasdoAndroid,comooatualGoogleCloudMessaging.
Aotérminodagraduação,sentianecessidadedeparticipardealgumpro-
jetoopensource,porémqueriaalgonoqualeurealmentepudessefazerdife-
rençaequefossedivertidotambém,entãocomeceiapesquisarcomodeveria
CasadoCódigo
fazerparaparticipardocódigo-fontedoAndroid. Algumasnoitesmaldor-
midas (e gigabytes de download) depois e já tinha tudo configurado para o
meuprimeirocommitnoAndroidOpenSourceProject.
Paralelamenteaisso, liaalgunstextossobredesenvolvimentodejogose
resolvientrarnessaárea,porémmuitomaterialqueviaerafocadonousode
algumframework, de modoqueatémesmoaquelejogomaissimplespreci-
savadeumcaminhãodeAPIparaserdesenvolvido.Nestemomento,resolvi
tentarfazerjogossimplesgraficamente,semousodeframeworks,etivebas-
tanteêxito,rendendoumconviteparapalestrarnoConexãoJavaeumjogo
publicadonoGooglePlaycommaisde100mildownloads.
Atualmente sou desenvolvedor e instrutor na Caelum apaixonado pelo
mundomobile,dedicoumtempoajudandoadesenvolverocódigo-fontedo
Androidemuitodoqueaprendiduranteessesanosdeestudoestácomparti-
lhadonestelivro.
2
Capítulo2
Por que um jogo mobile?
Somente em um ano, dentro da indústria de jogos mobiles, temos fatura-
mentoemdólarescomo:
• OjogoClashofClansrecebeu800milhões.
• AsagaCandyCrushfaturou300milhões.
• AsérieAngryBirdsganhou195milhões.
A venda de smartphones e tablets vem aumentando cada vez mais, tor-
nandoseususuáriosumgrandepúbliconãosóparaaplicativosmastambém
parajogos. MuitasdasgrandesdesenvolvedorasdegamescomoEA,Game-
loft e Ubisoft já perceberam isso e contam com divisões inteiras destinadas
somenteaodesenvolvimentodegamesparaplataformasmóveis.
CasadoCódigo
Nãohácomoignorarotamanhodessemercado. Disponibilizar,ounão,
umaversãomobiledeumjogoéadiferençaentreestarnestemercadobilio-
nárioouficardefora.
Comoestelivroestáorganizado?
Estelivroestáorganizadoemcapítulosfocadosnaprogramaçãodosdi-
versoselementosdonossojogoe, principalmente, nateoriaportrásdocó-
digo. Dessa forma, em vez de simplesmente replicarmos o código apresen-
tado, entenderemos o que se passa e teremos condições de criarmos nossos
própriosjogos!
Comoseráonossojogo?
Um jogo que se destacou bastante e ganhou notoriedade na mídia foi o
Flappy Bird, criado em apenas três dias pelo vietnamita Dong Nguyen, que
chegou a faturar 120 mil reais por dia com anúncios. Como o Flappy Bird
apresentaosprincipaiselementosdeumjogo(eébemdivertido),vamoscriar
anossaversãodessegame:oJumper!
Agora que temos uma ideia do jogo que faremos, uma dúvida que apa-
receé:oquevamosusarparacriarnossogame?Umarápidabuscanainternet
pelotema“ferramentasparajogosAndroid”poderevelarinúmerasalterna-
tivas e nos deixar confusos: será que devemos usar libGDX ou Unity com
Chipmunk?SeráqueoCocos2Dnãoseriamelhor?
A pergunta que devemos fazer é: sempre teremos que usar algum fra-
meworkparadesenvolvimentodejogos?Muitasvezes,não.
Os frameworks podem nos ajudar em vários aspectos do desenvolvi-
mento de um jogo, porém, para muitos jogos eles não são necessários. No
nosso Jumper, não utilizaremos nenhuma ferramenta específica para jogos,
apenasasfuncionalidadesqueaAPIdoAndroidnosoferece! Dessaforma,
podemosaprenderosconceitosportrásdeumjogoeentenderasvantagens
edesvantagensdeutilizarumframework.
4
Capítulo3
Começando o Jumper
3.1 Criando o projeto e a tela principal
Como o Jumper é um jogo para Android, vamos criar um novo projeto no
AndroidStudio.Paraisso,vamosa File -> New Projectepreenchere-
mososcamposApplicationNameeCompanyDomain:
3.1. Criandooprojetoeatelaprincipal CasadoCódigo
Fig.3.1:TeladecriaçãodoprojetonoAndroidStudio.
No nosso jogo, teremos uma View com um pássaro, canos e um back-
groundcomnuvens.ComooAndroidnãoapossuiporpadrão,vamospreci-
sarcriarnossaprópriaViewcustomizada.
Para implementá-la, podemos criar uma classe filha de View ou de
SurfaceView. Adiferençaentreelaséque,enquantoa Viewfaztodosos
desenhosnaUIThread,a SurfaceViewdisponibilizaumathreadparaque
possamosfazeroperaçõesmaispesadasemsegundoplanosemcomprometer
ausabilidadedaaplicação.Comonossojogoteráelementosdispostosnatela
emposiçõescalculadas,teremosqueutilizaruma SurfaceView.
Para criar nosso próprio componente de View, vamos criar uma classe
chamada Game no pacote br.com.casadocodigo.jumper.engine,
herdarde SurfaceVieweimplementarseuconstrutor:
public class Game extends SurfaceView {
public Game(Context context) {
super(context);
}
}
Agora que temos nossa View, precisaremos vinculá-la a uma Activity.
Quando criamos nosso projeto, o próprio assistente já criou uma Activity
chamada MainActivity e um layout chamado activity::main.xml.
Vamos alterar esse layout para conter apenas um “espaço vazio” (um
FrameLayoutcomoid container),noqualcolocaremosnossaViewcus-
tomizada:
6
Description:195, 300, 800 milhões de dólares!!! Essas são as cifras por trás dos jogos Angry Birds, Candy Crush e Clash of Clans. Quer pensar em cifras menores? Que tal 120 mil reais por dia? Foi o que Flappy Bird chegou a faturar. Pois é, já pensou em trabalhar com algo criativo, divertido e recompensado