Java ME - Game API
-
Upload
daniel-de-macedo -
Category
Technology
-
view
4.683 -
download
1
description
Transcript of Java ME - Game API
Introdução ao Desenvolvimento de Jogos 2D/3D em Java ME (Parte 1)
Daniel Valente de Macedo7° Semestre
Por que Java ME?
Portabilidade, pois ja é suportado pela maioria dos dispositivos móveis disponíveis no mercado.
Curva de aprendizagem pequena. Possui ótimas ferramentas de desenvolvimento
como o Eclipse e o Netbeans. Comunidade ativa e participativa (forums,
blogs, etc).
Plataforma Java ME
Ciclo de Vida do MIDlet
Start
Paused
Destroyed
Active
startApp()
pauseApp()
destroyApp()destroyApp()
Desenvolvemendo Jogos com MIDP/CLDC 1.0
Não possui suporte a ponto flutuante (CLDC 1.0), dificultando o desenvolvimento de jogos 3D.
Precário suporte a som, somente a beeps. Não possui suporte a transparência. Não é possivel tratar múltiplas teclas
pressionadas ao mesmo tempo.
Desenvolvemendo Jogos com MIDP/CLDC 1.0 (Cont.)
public class MeuJogo extends Canvas implements Runnable {
public void run() {
while(true) {
repaint();
}
}
public void paint(Graphics g) {
// Código de desenho
}
protected void keyPressed(int keyCode) {
// Tratamento de teclas
}
}
Exemplo:
Não é possivelter o controle
de quando que o paint() seráchamado.
Também não é possivel saber
quando o keyPressed() échamado, podendo ocorrer
um atraso na resposta,resultando em algo
indesejado.
Desenvolvemendo Jogos com MIDP/CLDC 1.0 (Cont.)
Sem o suporte a double buffering, o "pisca-pisca" é constante.
Lógica dedesenho
Imagem namemória
Tela dodispositivo
Lógica dedesenho
Imagem namemória
Tela dodispositivo
Passo 1:
Passo 2:
Double Buffering:
Desenvolvemendo Jogos com a Game API
Disponível no MIDP 2.0 Possui um conjunto de classes bem otimizadas
voltadas ao desenvolvimento de jogos. Possui suporte a ponto flutuante (CLDC 1.1) Suporte completo a som (mp3, wav, etc). Possui suporte a transpareência. É possível tratar múltiplas teclas pressionadas
ao mesmo tempo.
Classes da Game API
Game API: GameCanvas
Possui double buffering implementado. É possível atualizar a tela no momento
desejado, onde todos componentes visuais já foram atualizados.
É possível detectar várias teclas pressionadas ao mesmo tempo, diferentemente do Canvas.
Game API: GameCanvas
Exemplo:public class MeuJogo extends GameCanvas implements Runnable { public void run() { Graphics g = getGraphics(); while(true) {
int keyState = getKeyStates();
if((keyState & UP_PRESSED) != 0) { // Tecla UP está pressionada } else if((keyState & DOWN_PRESSED) != 0) { // Tecla DOWN está pressionada }
render(g); // Logica de desenho
flushGraphics(); //Atualiza tela } }}
Verificação de teclas
Lógica de desenho
Desenha a imagem do buffer na tela do
dispositivo
Game API: Layer
Classe abstrata que representa qualquer elemento visual na Game API.
Possui metodos como: boolean isVisible() void setVisible(boolean visible) void move(int dx, int dy) voi setPosition(int x, int y) abstract void paint(Graphics g)
Game API: Sprite
Classe que representa uma imagem no jogo, por exemplo: Personagem e o Inimigo.
Possui suporte a frames e animação. Possui detecção de colisão por caixa e pixel-a-
pixel. Suporta algumas transformações sobre a
imagem (Espelhamento, 90°, 180°, 270°...).
Game API: Sprite
Frames e animação:
Arquivo .png Divisão internano Sprite
Game API: Sprite
Transformações:
macaco.setTransform(Sprite.TRANS_NONE)
macaco.setTransform(Sprite.TRANS_ROT90)
Game API: TiledLayer
Classe que normalmente é usada para representações de mapas, utilizando uma matriz bidimensional com índices de imagens.
Possui suporte a tiles animadas (efeito de água se movimentando e etc).
Game API: TiledLayer
Game API: LayerManager
Classe responsável por gerenciar todos os Layers. Sprite TiledLayer
Game Loop
Game Loop (cont.)
public class MeuJogo extends GameCanvas implements Runnable {
private boolean running;
private int delay = 30;
public SimpleGameCanvas() {
super(true);
}
public void start() {
running = true;
Thread t = new Thread(this);
t.start();
}
public void stop() { running = false; }
public void run() {
Graphics g = getGraphics();
while (running) {
checkInput();
update();
render(g);
flushGraphics();
try { Thread.sleep(delay); }
catch (InterruptedException ie) { stop(); }
}
}
private void update() {}
private void checkInput() {}
private void render(Graphics g) {}
}
FIM
Perguntas ou Dùvidas?