Você está na página 1de 6

1

PROFESSOR
ANDERSONMACEDO
EspecialistaemEngenhariadeSoftware comUML
TPICOSAVANADOSEM
DESENVOLVIMENTODESISTEMAS
Aula3
LinguagemJavaME
Naauladehojeiremosconcluirnossapequena
aplicaoemJAVAMEdeumjogoem2Dpara
dispositivomvel.
OBJETIVODAAULA
Threads.
ThreadsJava.
AlteraodoMeuGameCanvas.
Posicionamentolinhaxcoluna.
Atividades.
ESTRUTURADAAULA
ProcessoxThread.
Processoemcomputaoquesetrata,
basicamente,deumprogramaemexecuo.
Threadpodeserdefinidocomoumfluxo
deexecuo.
Thread =Processoleve.
THREAD
2
THREAD
Thread apartedeumprogramaquepodeser
executadosimultaneamentecomoutrasThreads
(programasmultithreading).
Velocidadedeexecuo.
Paralelismoemsistemasmultincleo.
Economiadememria.
RotinasdeE/Ssemesperaociosa.
THREAD
Construtores
public Thread( String ThreadName ) para nomes
personalizados
public Thread( ) para nomes padro: Thread1,
Thread2, ...
THREADJAVA
Principaismtodos:
run():responsvelpelotrabalhoatribudo
Thread.
start():disparaaexecuodeumaThread.
sleep():especificaquantotempoaThread
emexecuodevedormiremmilissegundos.
interrupt():interrompeoestadodedormncia.
THREADJAVA
public class MinhaClasse extends Thread
public class MinhaClasse extends OutraClasse
implements Runnable
CLASSETHREADE
INTERFACERUNNABLE
Quando utilizamos um objeto de Graphics,
importante compreender o mapa de coordenadas
espaciais utilizado.
POSICIONAMENTO
3
POSICIONAMENTO
Lembrando: o mtodo getKeyStates()
responsvel pela captura dos estados das teclas
fsicas do jogo.
Algumas de suas constantes:
DOWN_PRESSED.
UP_PRESSED.
LEFT_PRESSED.
RIGTH_PRESSED.
UTILIZANDOOGETKEYSTATES
Como proposta, vamos reposicionar e colocar mov
imentoemnossocarro,utilizandoumaThread.
Passo1:Vamosreposicionarocarronocentro
dabasedatela.
Passo2:ImplementarainterfaceRunnable
emMeuGameCanvas.
EXEMPLODEIMPLEMENTAO EXEMPLODEIMPLEMENTAO
Passo 3: criar uma varivel para servir
de semforo: (gameRunning)
Passo 4: criar os mtodos start() e stop()
para criar e parar a Thread, respectivamente:
public void start() {
gameRunning = true;
Thread gameThread = new Thread(this);
gameThread.start();
}
public void stop() {
gameRunning = false;
}
Passo 5: implementar o getKeyStates()
eminput()
public void input() {
int keyStates = getKeyStates();
int currentY = carSprite.getY();
int currentX = carSprite.getX();
EXEMPLODEIMPLEMENTAO EXEMPLODEIMPLEMENTAO
if ((keyStates & LEFT_PRESSED) != 0) {
carSprite.setPosition(Math.max(0, currentX 5),
currentY);
}
if ((keyStates & RIGHT_PRESSED) != 0) {
carSprite.setPosition(Math.min(width 16,
currentX + 5), currentY);
}
}
4
EXEMPLODEIMPLEMENTAO
Passo 6: implementar o mtodorun()
public void run() {
g = getGraphics();
while (gameRunning) {
input();
render(g);
try {
Thread.sleep(200);
} catch (InterruptedException iex) {
stop();
}
}
}
IMPLEMENTAODOEXEMPLO1
PERGUNTAS
public class GerenteObstaculo {
private Sprite[] obstacles;
private LayerManager layerManager;
private static final int MAX_OBS = 10;
Random r = new Random();
private int width;
private int height;
CRIANDO O GERENTEOBSTCULO
DECLARANDO AS VARIVEIS
Possui o mesmo nome da classe.
Fornece instrues de como o objeto deve ser
instanciado.
Permite a passagem de argumentos classe.
Permite definir um comportamento do objeto
nomomento de sua instanciao.
Toda classe possui um mtodo construtor.
OMTODOCONSTRUTOR
public GerenteObstaculo(int width, int height,
LayerManager layerManager) {
this.width = width;
this.height = height;
this.layerManager = layerManager;
createObstacles();
}
CRIANDO O GERENTEOBSTCULO
OMTODOCONSTRUTOR
5
public void createObstacles(){
try {
Image obsImage = Image.createImage("/caminhao.pn
g");
obstacles = new Sprite[MAX_OBS];
for (int i = 0; i < MAX_OBS; i++) {
obstacles[i] = new Sprite(obsImage);
obstacles[i].setVisible(false);
layerManager.append(obstacles[i]);
}
} catch (IOException ex) {
Ex.printStackTrace();
}
}
GERAODEOBSTCULOS
public void renderObstacles() {
for (int i = 0; i < MAX_OBS; i++) {
int nxPos = (r.nextInt(width));
int nyPos = (r.nextInt(height));
obstacles[i].setPosition(nxPos, nyPos);
obstacles[i].setVisible(true);
}
}
RENDERERIZAODEOBSTCULOS
MOVIMENTAODOSOBSTCULOS
public void moveObstaculos() {
for (int i = 0; i < MAX_OBS; i++) {
int currentX = obstacles[i].getX();
int newY = obstacles[i].getY() + 11;
if (newY >= height 32) {
int yPos = (r.nextInt(height));
int xPos = (r.nextInt(width));
obstacles[i].setPosition(xPos, yPos);
}else{
obstacles[i].setPosition(currentX, newY);
}}}
public boolean checkCollision(Sprite carSprite){
for(int i=0; i<MAX_OBS; i++){
if(carSprite.collidesWith(obstacles[i
], true)){
return true;
}}
returnfalse;
}Obs.:Notequeomtodopossuiretorno!!!
OMTODOCHECKCOLLISION
O mtodo checkCollision deve ser chamado pelo
mtodo run de MeuGameCanvas(cdigo)
if(gerenteObstaculo.checkCollision(carSprite)){
stop();
}
OMTODOCHECKCOLLISION
Vamosimplementarogerenteobstculos?
VAMOSIMPLEMENTAR?
6
PERGUNTAS
A utilizao de Threads e Sprites so
extremamente teis quando necessitamos
de movimento e independncia entre
os elementos de tela dos aplicativos mveis.
CONCLUSO
2014 Todososdireitosreservados.Usoexclusivo
noSistemadeEnsinoPresencialConectado.