Introdução ao Desenvolvimento de Jogos
2D/3D em Java ME (Parte 1)
Daniel Valente de Macedo
7° 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
startApp()
Paused pauseApp() Active
destroyApp() destroyApp()
Destroyed
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.)
Exemplo:
public class MeuJogo extends Canvas implements Runnable {
public void run() {
Não é possivel
while(true) { ter o controle
repaint(); de quando que o
paint() será
} chamado.
}
public void paint(Graphics g) { Também não é
// Código de desenho
possivel saber
quando o keyPressed() é
} chamado, podendo ocorrer
um atraso na resposta,
protected void keyPressed(int keyCode) {
resultando em algo
// Tratamento de teclas indesejado.
}
}
Desenvolvemendo Jogos com
MIDP/CLDC 1.0 (Cont.)
Sem o suporte a double buffering, o "pisca-
pisca" é constante.
Double Buffering:
Lógica de Imagem na Tela do
Passo 1: desenho memória dispositivo
Lógica de Imagem na Tela do
Passo 2:
desenho memória dispositivo
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) { Verificação de teclas
int keyState = getKeyStates();
if((keyState & UP_PRESSED) != 0) {
// Tecla UP está pressionada
} Lógica de desenho
else if((keyState & DOWN_PRESSED) != 0) {
// Tecla DOWN está pressionada
}
render(g); // Logica de desenho Desenha a imagem do
buffer na tela do
flushGraphics(); //Atualiza tela 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:
Divisão interna
Arquivo .png
no Sprite
Game API: Sprite
Transformações:
macaco.setTransform(Sprite.TRANS_ROT90)
macaco.setTransform(Sprite.TRANS_NONE)
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 public void run() {
implements Runnable {
Graphics g = getGraphics();
private boolean running;
while (running) {
private int delay = 30;
checkInput();
public SimpleGameCanvas() {
update();
super(true);
render(g);
}
flushGraphics();
public void start() {
try { Thread.sleep(delay); }
running = true;
catch (InterruptedException ie) { stop(); }
Thread t = new Thread(this);
}
t.start();
}
}
private void update() {}
public void stop() { running = false; }
private void checkInput() {}
private void render(Graphics g) {}
}
0 comments
Post a comment