MAKALAH TENTANG CARA PEMBUATAN GAMESP LABIRIN
Nama
: Arif Safrudin
Kelas
:3c
Nim
: 11040016
POLITEKNIK HARAPAN BERSAMA TEGAL Jl.Mataram 09 Tegal
KATA PENGANTAR Dengan nama Allah yang Maha Pengasih lagi Maha Penyayang. Segala puji bagi Allah semata, seraya memanjatkan puji syukur kehadirat Allah SWT atas limpahan anugerah dan rahmat- Nya, saya selaku penulis dapat melaksanakan Tugas pemrograman berorientasi objek 2 sesuai dengan yang bapak berikan. Tentunya saya selaku penulis telah berupaya semaksimal mungkin kemampuan saya kerahkan dalam pengerjaan soal tersebut, namun saya menyadari tidak ada yang sempurna di dunia ini. Selanjutnya saya mengharap adanya saran dan kritik yang membangun sekaligus ucapan terima kasih pada semua pihak yang telah membantu terlaksananya tugas ini. Dan pada akhirnya saya menyadari tiada yang sempurna dan besar di hadapan Allah SWT, namun sekecil apapun amal shaleh yang kita kerjakan pasti diperhitungkanNya dengan pahala yang besar, Amin
2
DAFTAR ISI BAB I PENDAHULUAN ……………………………………………………………… 4 RUMUSAN MASALAH ………………………………………………………. 5 BAB II PEMBAHASAN ………………………………………………………………. 6 BAB III PENUTUP ……………………………………………………………………. 30
3
PENDAHULUAN Puji syukur penyusun panjatkan ke hadirat Allah Subhanahu wata΄ala, karena berkat rahmat-Nya saya bisa menyelesaikan makalah yang berjudul “cara membuat game menggunakan Visual MIDlet”. Makalah ini diajukan guna memenuhi tugas mata kuliah Pemrograman berorientasi 2. saya mengucapkan terima kasih kepada semua pihak yang telah membantu sehingga makalah ini dapat diselesaikan tepat pada waktunya. Makalah ini masih jauh dari sempurna, oleh karena itu, kritik dan saran yang bersifat membangun sangat kami harapkan demi sempurnanya makalah ini
Semoga makalah ini memberikan informasi bagi masyarakat dan bermanfaat untuk pengembangan wawasan dan peningkatan ilmu pengetahuan bagi kita semua.
4
RUMUSAN MASLAH Pengertian J2ME Java2 Micro Edition atau yang biasa disebut J2ME adalah lingkungan pengembangan yang didesain untuk meletakkan perangkat lunak JAVA pada barang elektronik berserta perangkat pendukungnya. Pada J2ME, jika perangkat lunak berfungsi dengan baik pada sebuah perangkat maka belum tentu juga berfungsi baik pada perangkat yang lain. J2ME membawa Java ke dunia informasi, komunikasi, dan perangkat komputasi yang lebih kecil dibandingkan dengan computer desktop. J2ME biasa digunakan pada telepon selular, pager, PDA, dan sejenisnya. Teknologi J2ME juga memiliki beberapa keterbatasan jika diaplikasikan pada ponsel. J2ME sangat bergantung pada device yang digunakan, bisa dari merk ponsel, maupun kemampuan ponsel, dan dukungan terhadap teknologi J2ME. MIsalnya, jika sebuah ponsel tidak memiliki kamera maka jelas J2ME pada ponsel tersebut tidak dapat mengakses kamera. Mobile Information Device Profile (MIDP) MIDP atau Mobile Information Device Profile adalah spesifikasi untuk sebuah profil J2ME. MIDP memilik lapisan diatas CLDC, API tambahan untuk daur hidup aplikasi, antar muka, jaringan, dan pemyimpanan persisten. Pada saat ini terdapat MIDP 1.0 dan MIDP 2.0. Fitur tambahan pada MIDP 2.0 dibandingkan MIDP 1.0 adalah API untuk multimedia. Pada MIDP 2.0 terdapat dukunagan memainkan tone, tone sequence, dan file WAV walaupun tanpa adanya Mobile Media API (MMAPI). MIDlet MIDlet adalah aplikasi yang ditulis untuk MIDP. Aplikasi MIDlet adalah bagian dari class javax.microedition.midlet.MIDlet yang didefinisikan pada MIDP. MIDlet berupa sebuah class abstrak yang merupakan subclass dari bentuk dasar aplikasi sehingga antarmuka antara aplikasi J2ME dan aplikasi manajemen pada perangkat bias terbentuk. • Daur hidup MIDlet MIDlet terdiri dari beberapa method yang harus ada, yaitu contructor(), protected void startApp() throws MIDletStateChangeException, protected void pauseApp(), protected void destroyApp (Boolean unconditional) throws MIDletStateChangeException Ketika MIDlet dijalankan maka akan diinisialisasi dengan kondisi pause dan dijalankan pauseApp(), kondisi berikutnya adalah fungsi MIDlet dijalankan, yaitu pada startApp(). Metode yang ada tersebut diimplementasikan sebagai protected, hal ini dimaksudkan agar MIDlet lain tidak dapat memanggil method tersebut. Pada saat pemakai keluar dari MIDlet, maka method destroyApp() akan dijalankan sebelum MIDlet benar-benar tidak berjalan lagi. Method notifyDestroyed() akan dipanggil sebelum MIDlet benar-benar tidak berjalan lagi, DestroyApp() akan memanggil notifyDestroyed(), dan notifyDestroyed() akan memberi tahu platform untuk menterminasi MIDlet dan ihkan semua sember daya yang mengacu pada MIDlet Berikut adalah skema hidup MIDlet : 5
BAB II PEMBAHASAN Cara cara untuk membuat game menggunakan java visual MIDlet yang pertama buka netbeans ,klik new project,
pilih jenis project kemudian klik next
6
,tulis nama project,
klik browse untuk memeilih dimana anda akan menyimpan dan centang set as main project dan hilangkan centang pada Hello create MIDlet
7
pada emulator platform biarkan saja, jangan di ubah – ubah pada device pilih clamshellCldhone2 pada CLDC dan MIDP pilih CLDC-1.1,MIDP-2.0
kemudian klik next,pilih Finish
8
klik kanan source package pilih new java package
ketik nama paket anda kemudian tekan finish(buatlah 2 nama packages yang berbeda karena kita akan masukkan 2 packages yang berbeda).contoh nama packages : Image dan apps kemudian di packages yang bernama image kita isi dengan gambar – gambar,cara memasukkannya di windows explorer,cari gambar yang akan masukkan,blok semua gambar kemudian copy atau tekan ctrl+c.kemudian pastekan di packages image. Caranya klik kanan packages image,paste.dengan sendirinya gambar telah masuk di packages image . Setelah mengisi packages image kita akan mengisi packages apps dengan cara klik kanan packages source pilih new game design,visual MIDlet kemudian java class “ bagian java class kita buat 3 class yaitu dengan nama counter,mainkan,music”setelah semuanya sudah di buat maka akan muncul kotak dialog seperti ini :
9
Kita akan memulai dengan VisualMIDlet pilih vvisual MIDlet Ini adalah tampilan awal visual MIDlet
Klik kanan pada are kerja Visual MIDlet pilih new Splash Screen, maka akan tampil seperti ini
10
Kemudian klik kanan dan pilih list,mainkan,alert”pada alert kita buat dua alert dan kita beri nama petunjuk dan tentang”
Atur arah aliran program agar setiap kali dijalankan, splash screen adalah bagian pertama yang ditampilkan dengan cara memberikan panah dari mobile device ke splash screen.cara untuk mengatur ialah klik dan tahan pada mobile device dan lepaskan pada splashScreen dan lanjutkan pada semua program sampai program menjadi seperti ini
11
Atur properties splash screen agar ditampilkan selama 2 detik. Pengaturan ini terletak pada bagian Timeout. Beri gambar pada splash screen kita dengan gambar yang kita telah siapkan. Masuk pada bagian screen ,klik dua kali pada
![]()
.
12
Klik tombol Add untuk menambah gambar sehingga image1 akan muncul. Klik tombol Browse untuk mencari lokasi gambar yang akan ditampilkan. Buka folder src dikarenakan kita ingin menampilkan gambar yang sudah kita persiapkan di proyek kita. Buka folder image yang berisi gambar-gambar yang telah kita persiapkan. Contoh gunakan gambar background.png untuk kita gunakan sebagai gambar splash screen kita. Klik tombol Ok untuk menerima semua perubahan yang baru saja kita buat. Tampilan splash screen kita setelah ditambahkan gambar kepadanya
Setelah kita buat Visual MIDletnya, kita buka Game Design, ini adalah tampilan utama Game design
13
Pertama tama kita buat dulu tiled layer dengan nama Dinding dan tanah, pertama kita klik create tiled layer, masukkan nama dan pilh gambar yang akan menjadi dinding,
Setelah memasukkan nama dan memilih gambar kemudian klik OK. ini adalah tampilan utama dinding anda, buatlah dinding anda dengan cara memilih gambar kemudian
14
tekan mouse / pointer anda pada lembar dinding yang akan kita buat, jika kita ingin menambah lembar dinding kita, kita bias klik kanan dan pilih append column, ini adalah contoh dinding yang sudah jadi,
Kemudian kita buatlah lagi tiled layer dengan nama tanah, caranya pun sama seperti saat kita membuat dinding, ini adalah tampilan tanah yang sudah jadi
15
Setelah dinding dan tanah kita sudah jadi kita akan buat actor atau pemain dari game ini, dengan cara klik create sprite masukkan nama sprite dan pilih gambar sprites aturlah gambar actor sampai menjadi seperti ini :
Ini adalah tampilan utama saat kita mengklik OK.
16
Pada aktorseq001 kita buang satu frame dengan cara klik kanan remove frame lalu kita ubah namanya dengan cara klik kanan rename sequence dan kita beri nama actormaju, pilih gambar agar bisa jalan seirama ketika diplay, kita ulangi sampai kita buat actor mundur,akorkiri,aktorkanan,dengan caraseperti saat kita buat actor maju, sampai seperti ini
Setelah kita membuat actor kita akan buat harta dengan caraseperti kita membuat actor tetapi hanya ada 1 sequnce saja, contoh sperti ini
17
Setelah semua bahan sudah kita buat gabungkan semuanya, dengan cara klik create scene dan kita beri nama layer, ini adalah tampilan utama layer
Untuk menambahkan dinding,tanah klik kanan pada lembar layer dan pilih tiled layer dan untuk menmbahkan ,actor dan harta klik kanan dan pilih sprite layer, atur tanah dan dinding pada angka X dan
18
Y adalah 0, taruh actor dan di tanah tetapi jangan mepet sama dinding, kemudian taruh harta berjauhan dengan actor agar game menarik, contoh :
Setelah kita buat game design kita akan buat class mainkan dengan cara:
Kita buka class Mainkan Tampilan awal class Mainkan.
19
Masukkan kode program class Mainkan. /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package apps; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.game.LayerManager; import javax.microedition.lcdui.game.Sprite; 20
import javax.microedition.lcdui.game.TiledLayer; /** * * @author chun_chun */ public class Mainkan extends GameCanvas implements Runnable{ private static final int SPEED =3; private static final int MIN__BUFFER =20; private int viewPortx =0; private int viewPorty =0; private byte lastDirection =-1; private int kecepatan =3; private boolean interrupted = true; private VisualMIDlet midlet; private GameDesign gd; private LayerManager lm; private Timer timer; private TiledLayer Tanah, Dinding; private Sprite Aktor, harta,harta2,harta3; private SpriteAnimationTask Aktorgerak,animator; private int score =0; private Counter c; private Image Gimeover,Menang; Music music = new Music();
public Mainkan (VisualMIDlet midlet){ 21
super(true); try { music.PlayWaveMidi("/Image/Music1.mid"); daftardesign(); } catch (Exception ex) { ex.printStackTrace(); } c = new Counter(); c.setActive(true); c.setInc(-1); c.setCount(100);
timer.scheduleAtFixedRate(c, 1000, 1000); this.setFullScreenMode(true);
new Thread(this).start(); } private void daftardesign() throws IOException { this.timer = new Timer(); gd = new GameDesign(); lm =new LayerManager(); gd.updateLayerManagerForLayer(lm); Tanah =gd.getTanah(); Dinding =gd.getDinding(); harta =gd.getHarta(); harta2 = gd.getHarta2(); 22
harta3 = gd.getHarta3();
this.Aktor = gd.getAktor(); this.Aktor.defineReferencePixel(6, 6); this.Aktorgerak = new SpriteAnimationTask(this.Aktor,false); this.timer.scheduleAtFixedRate(this.Aktorgerak, 0, gd.AktorMajuDelay); } public boolean spriteCollides(Sprite sprite){ return sprite.collidesWith( sprite==this.Aktor ? this.harta :this.Aktor, true) || sprite.collidesWith(this.Dinding, true) || sprite.getX() <0 || sprite.getY()<0 || sprite.getX() > (this.Tanah.getWidth()-sprite.getWidth()) || sprite.getY() >(this.Tanah.getHeight()-sprite.getHeight()); } void stopPlaying(){ } private void adjustViewport(int x, int y ){ int sx =this.Aktor.getX(); int sy = this.Aktor.getY();
int xmin = this.viewPortx + MIN__BUFFER; int xmax = this.viewPortx + this.getWidth() - this.Aktor.getWidth() -MIN__BUFFER; int ymin = this.viewPorty + MIN__BUFFER; int ymax = this.viewPorty + this.getHeight() - this.Aktor.getHeight() -MIN__BUFFER;
23
if(sx >= xmin && sx<= xmax && sy >= ymin && sy <= ymax){ return; } if(this.lastDirection == LEFT && sx >= xmin){ return; } if(this.lastDirection == RIGHT && sx <= xmax){ return; } if(this.lastDirection == UP && sy >=ymin){ return; } if(this.lastDirection == DOWN && sy <= ymax){ return; } if(x < this.Tanah.getX()){ this.viewPortx = this.Tanah.getX(); }else if ( x >this.Tanah.getX() + this.Tanah.getWidth() - this.getWidth()) { this.viewPortx = this.Tanah.getX() + this.getWidth() - this.getWidth(); }else{ this.viewPortx =x; } if (y
this.Tanah.getY()+this.Tanah.getHeight()-this.getHeight()){ this.viewPorty = this.Tanah.getY()+ this.Tanah.getCellHeight()- this.getHeight(); 24
}else{ this.viewPorty =y; } this.lm.setViewWindow(this.viewPortx,this.viewPorty, this.getWidth(),this.getHeight()); } public void run(){ Graphics g = getGraphics(); while (interrupted) {
int KeyState = getKeyStates(); if ((KeyState & LEFT_PRESSED) !=0) { if(this.lastDirection != LEFT){ this.lastDirection = LEFT; this.Aktor.setFrameSequence(gd.AktorKanan); this.Aktor.setTransform(Sprite.TRANS_MIRROR); continue; } this.Aktorgerak.forward(); this.Aktor.move(-SPEED, 0); if(this.spriteCollides(this.Aktor)){ this.Aktor.move(SPEED, 0); continue; }
this.adjustViewport(this.viewPortx - SPEED, this.viewPorty); }else if ((KeyState & RIGHT_PRESSED) !=0){ 25
if(this.lastDirection !=RIGHT){ this.lastDirection = RIGHT; this.Aktor.setFrameSequence(gd.AktorKanan); this.Aktor.setTransform(Sprite.TRANS_NONE); continue; } this.Aktorgerak.forward(); this.Aktor.move(SPEED, 0); if (this.spriteCollides(this.Aktor)){ this.Aktor.move(-SPEED, 0); continue; } this.adjustViewport(this.viewPortx + SPEED, this.viewPorty); }else if ((KeyState & UP_PRESSED) !=0){ if(this.lastDirection !=UP){ this.lastDirection =UP; this.Aktor.setFrameSequence(gd.AktorMundur); this.Aktor.setTransform(Sprite.TRANS_NONE); continue; } this.Aktorgerak.forward(); this.Aktor.move(0, -SPEED); if(this.spriteCollides(this.Aktor)){ this.Aktor.move(0, SPEED); continue; } 26
this.adjustViewport(this.viewPortx,this.viewPorty - SPEED); }else if ((KeyState & DOWN_PRESSED) !=0){ if(this.lastDirection !=DOWN){ this.lastDirection =DOWN; this.Aktor.setFrameSequence(gd.AktorMaju); this.Aktor.setTransform(Sprite.TRANS_NONE); continue; } this.Aktorgerak.forward(); this.Aktor.move(0, SPEED); if(this.spriteCollides(this.Aktor)){ this.Aktor.move(0, -SPEED); continue; } this.adjustViewport(this.viewPortx, this.viewPorty + SPEED); }else{ this.Aktorgerak.setMoving(false); } this.lm.paint(g, 0, 0); g.setColor(0, 255, 255); g.drawString("Score:"+ score,5 ,5,0); g.drawString("Waktu:"+ c.getCount(),165 ,5 ,0); if(c.getCount()<=0){ stopPlaying(); Kalah(); if (c.getCount()<= 0) { 27
music.stopMusik();
if (c.getCount() <= 0) { Aktor.setVisible(false); } } } if(score>= 30){ Menang();
if(score >=30){ music.stopMusik(); } } flushGraphics(0, 0, this.getWidth(), this.getHeight()); Nilai();
try{ Thread.sleep(20); } catch(InterruptedException ex){ ex.printStackTrace(); }
}
} 28
private void Kalah(){ Graphics g = getGraphics(); this.lm.paint(g, 0, 0); g.setColor(0, 0, 255); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(255, 255, 255); g.drawString("TAMAT", 10, 100, 0); g.setColor(255, 255, 0); g.drawString("SKOR ANDA ADALAH :" +score,10, 130, 0);
} private void Nilai(){ if (Aktor.collidesWith(harta, true)){ harta.setVisible(false); score += 10; c.getCount(); } if (Aktor.collidesWith(harta2, true)){ harta2.setVisible(false); score += 10; } if (Aktor.collidesWith(harta3, true)){ harta3.setVisible(false); score += 10;
} } 29
private void Menang(){ Graphics g = getGraphics(); this.lm.paint(g, 0, 0); g.setColor(0, 0, 0); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 255, 0); g.drawString("SELAMAT ANDA MENANG", 10, 100, 0); g.setColor(0, 255, 0); g.drawString("SKOR ANDA ADALAH :"+score ,10, 130, 0); g.setColor(255, 255, 255); g.drawString("POLITEKNIK TEGAL" , 10, 150, 0); g.drawString("CREATED BY : WINDHIANI" , 10, 170,0); g.drawString("3A 11040096", 10, 190,0); }
public class SpriteAnimationTask extends TimerTask{ private boolean moving = false; private boolean forward = false; private Sprite sprite; private Image image; public SpriteAnimationTask(Sprite sprite, boolean forward){ this.sprite =sprite; this.forward = forward; } public void run(){ 30
if(!this.moving){ } 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; } }
} Kemudian kita buka class Music, ini adalah tampilan utama class Music
31
Kita masukkan script program class music /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package apps; import javax.microedition.media.Manager; import javax.microedition.media.MediaException; import javax.microedition.media.Player; import javax.microedition.media.PlayerListener; import javax.microedition.media.control.VolumeControl; /** * * @author chun_chun 32
*/ public class Music implements PlayerListener{ private static Player player; private VolumeControl vc; public void playerUpdate( Player player, String event, Object evenData){ } void PlayWaveMidi(String file) throws Exception{ player= Manager.createPlayer(getClass().getResourceAsStream(file),"audio/midi"); player.addPlayerListener(this); player.setLoopCount(-1); player.prefetch(); player.realize(); vc =(VolumeControl) player.getControl("VolumeControl"); if (vc !=null){ vc.setLevel(100); } player.start(); } public void stopMusik(){ try { player.stop(); } catch (MediaException ex) { ex.printStackTrace(); } } 33
}
Setelah kita buat class Music kemudian kita buka class counter, ini adalah tampilan utama class counter
Maskkan Code program class Counter /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package apps;
import java.util.TimerTask;
/** * 34
* @author chun_chun */ public class Counter extends TimerTask {
private int inc = 1; private int count; private boolean active;
public void run() { if (active) { count += inc; } }
public void setActive(boolean active) { this.active = active; }
public void setCount(int count) { this.count = count; }
public void setInc(int inc) { this.inc = inc; } 35
public int getCount() { return count; } }
kemudian setelah program di buat coba anda jalankan .
36
PENUTUP Demikian yang dapat saya paparkan mengenai cara pembuatan game java yang menjadi pokok bahasan dalam makalah ini, tentunya masih banyak kekurangan dan kelemahannya, kerena terbatasnya pengetahuan dan kurangnya rujukan atau referensi yang ada hubungannya dengan judul makalah ini. Penulis banyak berharap para pembaca yang budiman dusi memberikan kritik dan saran yang membangun kepada penulis demi sempurnanya makalah ini dan dan penulisan makalah di kesempatan-kesempatan berikutnya. Semoga makalah ini berguna bagi penulis pada khususnya juga para pembaca yang budiman pada umumnya.
37