Untuk pembuatan game untuk platform mobile kita akan bekerja menggunakan elemen-elemen dari canvas (dalam hal ini kita akan menggunakan GameCanvas) yaitu Spritesheet, TileSheet dan Scene.
Pertama-tama kita buat project baru.buatlah sebuah midlet dan 2 buah splash screen.
Buat sebuah canvas beri nama “gameC” dan visual game design beri nama “GameDesign” dengan cara klik kanan pada nama project dan pilih canvas serta Game Design.
Selanjutnya kita akan bekerja pada masing-masing class yg kita buat.
A. Midlet
Tambahkan kode program dibawah ini
private boolean midletPaused = false;
private gameDemo.GameC gameD;//instan dari game design
private Thread t;
private Display d;
public void gameStart() throws Exception{
this.gameD = new gameDemo.GameC();
this.t=new Thread(gameD);
t.start();
d = Display.getDisplay(this);
d.setCurrent(gameD);
panggil procedure gameStart() di procedure commandAction saat splash screen kedua berakhir.
public void commandAction(Command command, Displayable displayable) {
// write pre-action user code here
if (displayable == sp1) {
if (command == SplashScreen.DISMISS_COMMAND) {
// write pre-action user code here
switchDisplayable(null, getSp2());
// write post-action user code here
}
} else if (displayable == sp2) {
if (command == SplashScreen.DISMISS_COMMAND) {
try {
gameStart();
// write post-action user code here
} catch (Exception ex) {
ex.printStackTrace();
}
// write post-action user code here
}
}
// write post-action user code here
}
B. GameDesign
Buat sprite baru.
Gambar di atas adalah gambar untuk membuat sprite baru. Dalam hal ini “ceritanya” kita akan membuat tokoh untuk sebuah game.
1. Pada bagian sprite name tulis nama sprite.
2. Pilih sprite pada bagian select image.
3. Atur ukuran gambar sedemikian rupa sehingga satu petak gambar terdiri dari 1 gambar saja untuk memudahkan membuat animasi. Ukuran yang pas utk image dia atas adalah width:32 px dan height:48 px.
4. Klik OK.
Setelah diklik ok kita akan masuk ke halaman utk membuat animasi karakter atau istilahnya adalah sequen. Bila kita bermain game tentunya karakter kita akan mempunyai 4 arah pergerakan yaitu ke atas,bawah,kiri dan kanan. Maka kita harus membuat 4 sequen yang kita beri nama charUp, CharDown, CharLeft dan CharRight seperti gambar di atas.
1. Membuat sequence baru dengan cara klik kanan pada frame dan pilih create sequence.
2. Drag animasi yang sesuai dengan pergerakan karakter ke frame yang sudah disediakan.
3. Lanjutkan langkah2 sampai mempunyai 4 sequence seperti gambar di atas.
Selanjutnya buat tiled layer. Pada menu drop down pilih tiled layer.
1. Ubah nama tiled layer menjadi mp1.
2. Pilih image.
3. Ubah ukuran menjadi 32 x 32 px.
4. Klik ok.
5. Buat tiled layer sesuai keinginan.
Jika sudah selesai, kita tinggal membuat scene. Pada menu drop down pilih scene. Letakkan sprite yang sudah kita buat pada scene. Klik kanan pada scene>add sprite>nama sprite
A. GameC
Tambah kode di bawah pada bagian import
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
rubah dari
public class GameC extends Canvas implements CommandListener {
menjadi
public class GameC extends GameCanvas implements Runnable {
pasti akan muncul pesan kesalahan seperti ini
Klik pada icon lampu di sebelah kiri nama class lalu pilih Implements all abstract methods. Lalu ganti isi procedure public GameC() dengan kode dibawah ini
public GameC() throws Exception {
super(true);
try {
this.setFullScreenMode(true);
this.init();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Buat variable utk sprite,tiled layer dan scene dll.
private static final int SPEED = 3;//utk perpindahan
private byte lastDirection = -1;//ke arah mana karakter terkhir menghadap
private boolean interrupted;
private LayerManager lm;//utk scene
private GameDesign gameDesign;//game scene
private Timer timer;//timer
private Sprite rein;//sprite
private TiledLayer mp1;//tiled layer
private SpriteAnimationTask spriteReinAnimator;//animasi karakter
setelah semua variable siap,selanjutnya kita tinggal menggambar scene pada graphics dengan menambahkan kode program dibawah pada procedure init()
this.timer = new Timer();
this.gameDesign = new GameDesign();
//mengambil sprite dari gamedesign
this.rein = gameDesign.getChars();
//membuat instan dari animasi sprite
this.spriteReinAnimator = new SpriteAnimationTask(this.rein, false);
this.timer.scheduleAtFixedRate(this.spriteReinAnimator, 0, gameDesign.charDownDelay);
//gambar tiled layer
this.mp1=gameDesign.getMp1();
//gambar scene pada layer manager
this.lm = new LayerManager();
gameDesign.updateLayerManagerForSc1(lm);
lanjut dengan membuat kode utk animasi sprite buat procedure dengan nama SpriteAnimationTask yg merupaka extends dari TimerTask
private class SpriteAnimationTask extends TimerTask {
private boolean moving = false;
private boolean forward = true;
private Sprite sprite;
public SpriteAnimationTask(Sprite sprite, boolean forward) {
this.sprite = sprite;
this.forward = forward;
}
public void run() {
if (!this.moving) {
return;
}
if (this.forward) {
this.sprite.nextFrame();
} else {
this.sprite.prevFrame();
}
}
public void forward() {
this.forward = true;
this.moving = true;
}
public void backward() {
this.forward = false;
this.moving = true;
}
public void setMoving(boolean isMoving) {
this.moving = isMoving;
}
}
Langkah terakhir,karena game canvas yang kita buat merupakan implementasi dari Runnable maka hal yg perlu kita rubah berikutnya adalah pada procedure Run(). Disini kita akan menambahkan keyhandler yaitu menerima input berupa penekanan tombol dari user.dalam game ini kita akan menggerakkan karakter saat user menekan tombol atas, bawah, kiri dan kanan. Tambahkan kode dibawah ini pada procedure run().
Graphics g = getGraphics();
g = getGraphics();
lm.paint(g, 0, 0);
flushGraphics();
while (!this.interrupted) {
//memeriksa inputan user
int keyState = getKeyStates();
//bila tombol kiri ditekan
if ((keyState & LEFT_PRESSED) != 0) {
//if the previous direction was other than left set the sequence
//correct sequence & transform needed for walking to the left
if (this.lastDirection != LEFT) {
this.lastDirection = LEFT;
this.rein.setFrameSequence(gameDesign.charLeft);
continue;
}
//assign the sequence playback direction
this.spriteReinAnimator.forward();
//move the sprite to the left
this.rein.move(-SPEED, 0);
} else if ((keyState & RIGHT_PRESSED) != 0) {//bila tombol kanan
if (this.lastDirection != RIGHT) {
this.lastDirection = RIGHT;
this.rein.setFrameSequence(gameDesign.charRight);
continue;
}
this.spriteReinAnimator.forward();
this.rein.move(SPEED, 0);
} else if ((keyState & UP_PRESSED) != 0) {//atas
if (this.lastDirection != UP) {
this.lastDirection = UP;
this.rein.setFrameSequence(gameDesign.charUp);
}
this.spriteReinAnimator.forward();
this.rein.move(0, -SPEED);
} else if ((keyState & DOWN_PRESSED) != 0) {//bawah
if (this.lastDirection != DOWN) {
this.lastDirection = DOWN;
rein.setFrameSequence(gameDesign.charDown);
rein.setTransform(Sprite.TRANS_NONE);
}
spriteReinAnimator.forward();
this.rein.move(0, SPEED);
} else {
this.spriteReinAnimator.setMoving(false);
}
//update layer manager di posisi 0,0
this.lm.paint(g, 0, 0);
flushGraphics(0, 0, this.getWidth(), this.getHeight());
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}




