java me - game api

Post on 01-Dec-2014

4.684 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

CCT - Outubro de 2009

TRANSCRIPT

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?

Contato

Obrigado!

danielvalentemacedo@gmail.com

http://danielvalente.com.br

top related