Jogo 2D - diatinf

Transcrição

Jogo 2D - diatinf
CriandoumJoguinho2D
Prof.FellipeAleixo([email protected])
Conteúdo
• Desenvolvimentodeumjogo2DparaAndroid
• ComponentesdeInterfaceeClasses
– SurfaceView,SurfaceHolder
– Canvas,Paint
– GestureDetector
– Thread
SurfaceView,SurfaceHolder
• SurfaceView (android.view.SurfaceView)
–
–
–
–
Descendentedeandroid.view.View
Provêumasuperfíciededesenhodedicadadentrodaview
Permitearenderização utilizandoumathreadsecundária
OmétodogetHolder retornaoobjetoqueacessa a
superfície
• SurfaceHolder (android.view.SurfaceHolder)
– Interfacequepermiteacessarecontrolarasalteraçõesna
superfíciededesenho
– OmétodolockCanvas retornaoobjetoCanvas para
desenhonasuperfícieeunlockCanvasAndPost finalizaa
edição
SurfaceHolder.Callback,Canvas
• SurfaceHolder.Callback
(android.view.SurfaceHolder.CallBack)
– Interfacequerecebeasalteraçõesnasuperfíciede
desenho
– Responsávelpelocontroledathreadsecundáriade
desenho,iniciandoeparandoathread
• Canvas (android.graphics.Canvas)
–
–
–
–
–
Classequepossuiosmétodos“draw”paradesenho
drawRect – Desenhaumretângulo
drawCircle – Desenhaumcírculo
drawLine – Desenhaumalinha
drawText – Desenhaumtexto
Paint,Thread,GestureDetector
• Paint (android.graphics.Paint)
– Classequearmazenaestilosecoresutilizadospelos
métodosdedesenho
• Thread(java.lang.Thread)
– Controlaumaunidadeconcorrentedeexecução.Start
iniciaaexecuçãodaThread eJoin paraaexecução
• GestureDetector (android.view.GestureDetector)
– Detectagestoseeventosdemovimento
(MotionEvent)dousuário
Jogo
• Objetivo
– Destruiroalvo(oitopartes)com
omáximodetrêsbolas
1
2
3
5
• Elementosdojogo
–
–
–
–
–
–
–
Tempodojogo- 1
Númerodebolasrestantes- 2
Númerodealvosdestruídos- 3
Topodotela- 4
Alvo- 5
Bola- 6
Barraderebate- 7
6
7
4
Classes
• MainActivity
– EstendeActivity
– ResponsávelpelainstanciaçãodaView (JoguinhoView)
– Capturaoseventosdemovimento(MotionEvent)
utilizandooGestureDetector
• JoguinhoView
– EstendeSurfaceView eimplementaSurfaceHolder.Callback
– MantémosobjetosPaint paradesenharoselementosdo
jogo
– MantémoobjetoJoghuinhoThread paracontrolarathread
deexecuçãodojogo
– MantémoobjetoJoguinhocomalógicadojogo
Classes
• JoguinhoThread
–
–
–
–
Controlaolaçodeexecuçãodojogo
Recuperaoobjetodedesenho(Canvas)
Atualizaaposiçãodoselementosdojogo(Joguinho)
DesenhaoselementosnoCanvas (JoguinhoView)
• Joguinho
– Implementaalógicadojogo
– Dimensionaoselementosdeacordocomotamanhodatela
– Controlaoestadodojogo,númerodebolas,alvosatingidos,
tempodejogo,etc.
– Calculaasposiçõesdoselementos,controlaavisibilidadedos
alvos,velocidadedabola,verificaascolisões,etc.
MainActivity
• publicclassMainActivity extendsActivity
• Atributos
– privateJoguinhoView view;
– privateGestureDetector gd;
• Método onCreate
– Instanciaaview eassociaàatividade
• view=newJoguinhoView(this);
• setContentView(view);
– Instanciaogesture detector
• gd =newGestureDetector(this,gdListener);
MainActivity– Métodos
• onPause
– Paraojogo,pausandoathread
• view.pararJogo();
• onTouchEvent
– Recuperaoeventogeradonaview
• int acao =event.getAction();
– Verificaotipodoevento
• if(acao ==MotionEvent.ACTION_MOVE)
• view.moverBarra(event);
– Disparaoeventonogesture detector
• returngd.onTouchEvent(event);
MainActivity– GestureDetector
• ObjetoListener dedetençãodegestos
– Capturaoeventodeduplocliqueutilizadopara
lançarabola
SimpleOnGestureListener gdListener =newSimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent event){
view.lancarBola(event);
return true;
}
};
JoguinhoView
• ClasseJoguinhoView
publicclassJoguinhoView extendsSurfaceView implementsSurfaceHolder.Callback {
privateActivityactivity;
privateAlertDialog.Builder builder;
private SurfaceHolder holder;
private Joguinhoj;
private JoguinhoThread jt;
private Paint alvoP,barraP,bolaP,fundoP,textoP,topoP;
private int telaX;
private int telaY;
...
JoguinhoView– Construtor
• Construtor
– RecuperaoobjetoSurfaceHolder
• holder =this.getHolder();
– Colocaaprópriaview comoCallback das
alteraçõesnasuperfíciededesenho
• holder.addCallback(this);
– Iniciaoobjetoquecontrolaalógicadojogo
• j=newJoguinho();
– Iniciaosobjetosdedesenho
• alvoP =newPaint();...
JoguinhoView– Dimensionamento
• onSizeChanged
– Échamadoapósoconstrutordaview
– Recuperaasdimensõesdatela
• telaX =w;
• telaY =h;
– Dimensionaoselementosdojogo
• j.dimensionarElementos(telaX,telaY);
– Configuraosobjetosdedesenho
• alvoP.setStrokeWidth(j.alvoAltura);
– ChamaométodonovoJogo
• novoJogo();
JoguinhoView– ControledoJogo
• novoJogo
– Controlaoinícioereiníciodojogo
– RepassaoiníciodojogoparaaclasseJoguinho
• j.novoJogo();
• fimJogo
– Chamaométododepararojogo
• pararJogo();
– Mostraamensagemdefimdejogo,perguntandose
desejajogarnovamente
• pararJogo
– Pausaathreaddeexecuçãodojogo
• if (jt !=null)jt.setRunning(false);
JoguinhoView– MétodosdeDesenho
• desenharElementos
– DesenhaoselementosdojogonoCanvas recebidocomo
parâmetro
– Utilizaosmétodosdedesenhodraw eosobjetosPaint
• moverBarra
– RepassaoMotionEvent paraaclassequecontrolaojogo
• if (!j.fimJogo)j.moverBarra(event);
• lancarBola
– RepassaoMotionEvent paraaclassequecontrolaojogo
• if (!j.fimJogo)j.lancarBola(event);
JoguinhoView– Callback
• surfaceCreated
– Instanciaathreadecolocaemexecução
• jt =newJoguinhoThread(holder,j,this);
• jt.setRunning(true);
• jt.start();
• surfaceDestroyed
– Paraathread
• jt.setRunning(false);
• jt.join();
JoguinhoThread
• publicclassJoguinhoThread extendsThread
• PrincipaisAtributos
– privateSurfaceHolder holder;
– privateJoguinho j;
– privateJoguinhoView v;
– privateboolean loop;
• MétodosetRunning (boolean aLoop)
– Setaavariáveldecontroledoloopdeexecução
• loop=aLoop;
JoguinhoThread– LoopdeExecução
• Método run
– Loopdeexecuçãodojogo
– Calculaotempodeexecuçãoentreaschamadas,
desenhaasnovasposiçõesnoCanvas
long t1=System.currentTimeMillis();
while(loop) {
canvas =holder.lockCanvas();
long t2=System.currentTimeMillis();
long dt =t2- t1;
j.atualizarPosicoes(dt);
v.desenharElementos(canvas);
t1=t2;
}
holder.unlockCanvasAndPost(canvas);
Joguinho– LógicadoJogo
• AclasseJoguinhoéresponsávelpelalógicadojogo
• Construtor
– Iniciaoselementosdojogoeovetordealvos
• MétododimensionarElementos
– Dimensionaoselementosdojogodeacordocomo
tamanhodateladodispositivo
• MétodonovoJogo
– Reiniciaoestadodojogo
• MétodoatualizarPosicoes
– Atualizaasposiçõesdoselementoseverificaascolisões
Joguinho– LógicadoJogo
• MétodomoverBarra
– Atualizaaposiçãodabarradeacordocomo
MotionEvent geradopelousuário
• MétodolancarBola
– Atualizaaposiçãodabarradeacordocomo
MotionEvent geradopelousuário
Exercícios
1. AlteraçõesnoJogoApresentado
a. Incluirnojogoumcontroledeníveisdeformaque,
quandoumalvoforcomplementedestruído,um
nívelnovodeveseriniciadocontendoumnovoalvo.
Emcadanívelnovo,avelocidadedaboladeveser
incrementada
b. Incluirnojogoumranking,armazenandoemum
bancodedadosonomedojogadoreapontuação
obtida.Fazerumaview quepermitavisualizaro
rankingdojogonodispositivo
2. ImplementarumjogosemelhanteaMoon Patrol
ouSpaceInvaders
Referências
• AndroidparaProgramadores– Uma
abordagembaseadaemaplicativos.Paul
Deitel...[etal.].Bookman,2013
• GoogleAndroid– Aprendaacriaraplicações
paradispositivosmóveiscomoAndroidSKD.
RicardoR.Lecheta.Novatec,2013
• http://developer.android.com/reference