E Ae pessoal, post especial para os devs!
Meu nome é Sérgio Cavalcante, trabalho com o Marlon no Instituto Nokia, e recentemente dei um curso sobre J2ME. Foi um desafio, já que sou Evangelista de
Windows Phone. Então o Marlon me passou um game que ele sempre faz nos treinamentos que ele ministra. Destrinchei o bicho e fiz um roteiro para que você possa entender como
fazer o seu
Usei o NetBeans, junto com o SDK da Nokia para tal. Vamos começar?
Antes de qualquer coisa, baixe as imagens acima. Elas serão parte do seu projeto.
*CRIANDO O PROJETO
1 – Novo projeto
2 – Java ME – Mobile Application
3 – Desmarcar “Hello Midlet”
4 – Nome do projeto – Olimpiadas
5 – Escolher no emulator Plataform, o Nokia 1.1 for Java
6 – Botão direito no projeto -> New Midlet
*CLASSE PRINCIPAL
7 – depois do extends Midlet, colocar: implements CommandListener {
8 – A IDE sugere um import, aceitar e trocar por import javax.microedition.lcdui.*;
9 – escolher gerar todos os abstract methods da classe
10 – declarar:
public static List menu;
public static Display display;
11 – No startApp:
display = Display.getDisplay(this);
menu = new List(“Olimpiadas”, List.IMPLICIT);
menu.append(“Iniciar”, null);
display.setCurrent(menu);
12 – Build. Run.
*ADICIONANDO O COMMANDACTION
13 – Adicionar comando sair e listener de commands:
menu.addCommand(new Command(“Sair”, Command.EXIT, 1));
menu.setCommandListener(this);
14 – Adicionar Inicia Jogo:
private void iniciaJogo() {
}
15 – adicionar comandos do commandAction:
if (c == List.SELECT_COMMAND) {
if (menu.getSelectedIndex() == 0) {
iniciaJogo();
}
} else if (c.getCommandType() == Command.BACK){
display.setCurrent(menu);
} else {
notifyDestroyed();
}
*CRIANDO A CLASSE DE JOGO
16 -criar classe Jogo. botão direito new Java Class
17 – colocar os imports:
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
18 – heranças do Jogo:
extends GameCanvas implements Runnable, CommandListener {
19 – Implement all abstract classes
20 – tirar os throws
21 – implementar o constructor:
public Jogo(Olimpiadas m) {
super(true);
setFullScreenMode(true);
}
22 – adicionar no commandAction:
Olimpiadas.display.setCurrent(Olimpiadas.menu);
23 – declarar:
private Olimpiadas midlet;
24 – colocar no constructor:
midlet = m;
25-declarar na classe principal:
private Jogo jogo;
26 – colocar no IniciaJogo:
jogo = new Jogo(this);
display.setCurrent(jogo);
26 – build, rodar.
*GAMETIME! – PAINT SPRITES
27 – arrastar para o projeto os 3 .png’s
28 – declarar:
private Sprite sBackground, sAtleta, sBarreira;
private LayerManager lm;
29 – adicionar um try catch de IO no constructor:
try
{
} catch (IOException ex)
{
ex.printStackTrace();
}
30 – dentro do try fazer load e posicionar os sprites:
Image atleta = Image.createImage(“/atleta.png”);
Image fundo = Image.createImage(“/scenario.png”);
Image barreira = Image.createImage(“/barreira.png”);
sBackground = new Sprite(fundo);
sAtleta = new Sprite(atleta, 42, 51);
sBarreira = new Sprite(barreira);
lm = new LayerManager();
lm.append(sAtleta);
lm.append(sBarreira);
lm.append(sBackground);
sAtleta.move(10, 215);
sBarreira.move(220, 245);
31 – fazer o comando do paint chamar o paint do LM:
public void paint(Graphics g) {
lm.paint(g, 0, 0);
}
32 – build, run.
*ADICIONANDO MOVIMENTO
33 – rodando a thread. colocar no constructor depois do código dos sprites:
Thread t = new Thread(this);
t.start();
34 – declarar:
private boolean pula;
private boolean corre = true;
private int totalLoopsPulo = 0;
private int barreirasPuladas = 0;
35 – colocar no run:
while (corre) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
atualizaSprites();
repaint();
}
36 – criar a função atualiza sprites:
private void atualizaSprites() {
if (pula) {
totalLoopsPulo++; // controle de pulos no loop. 25 sprites, 25 atualizações do pulo
if (totalLoopsPulo <= 25) {
sAtleta.move(0, -1);
} else if (totalLoopsPulo <= 50) {
sAtleta.move(0, 1);
} else {
pula = false;
totalLoopsPulo = 0;
sAtleta.nextFrame();
}
} else { // se nao pula entao corre
sAtleta.nextFrame();
}
sBarreira.move(-3, 0);//se a barreira chegou ao começo da tela, move pro final pra aproveitar memória e aumenta score
if (sBarreira.getX() + sBarreira.getWidth() < 0) {
barreirasPuladas++;
sBarreira.move(255, 0);
}
}
37 – build, run.
*COLISÕES
38 – adicionar funcão de colisão:
private void verificaColisao() {
if (sAtleta.collidesWith(sBarreira, true)) {
corre = false;
}
}
39 – depois do atualizaSprites colocar a verificação:
verificaColisao();
40 – build, run
*PULO
45 – adicionar função de pulo pelo toque:
public void pointerPressed(int x, int y) {
pula = true;
}
*FEEDBACK PRO USUARIO
46 – adicionar command, fora do gameloop:
Alert alert = new Alert("Olimpiadas", "Você conseguiu " + barreirasPuladas + " barreiras", null, AlertType.INFO);
Command cmdMenu = new Command("OK", Command.OK, 1);
alert.addCommand(cmdMenu);
alert.setCommandListener(this);
alert.setTimeout(Alert.FOREVER);
Olimpiadas.display.setCurrent(alert);
Pronto, meus parabéns você deu o primeiro passo para se tornar um GameDev
Caso precise de material sobre o código acima, consulte os slides
Quer ver a apresentação? aqui!
Quemr mais material? Consulte outros Webnars!
Aproveite para ver o meu sobre XNA