Modul #9
Praktikum Pemrograman Berorientasi Objek
Semester Genap Tahun Ajaran 2010/2011
oleh Budi Susanto, S.Kom., M.T.
Hak cipta © 2011 berada di pihak penulis.
Tujuan materi:
● mahasiswa dapat memanfaatkan mouse untuk mengontrol permainan.
● mahasiswa dapat menggunakan struktur data array atau koleksi untuk menampung
objek
● mahasiswa dapat menggunakan suara untuk pembuatan permainannya.
Skenario
Skenario yang akan digunakan dalam modul kali ini sedikit banyak tidak berbeda
dengan materi yang sudah kita pelajari sebelumnya, hanya saja kali ini pemain dapat
menggunakan mousenya untuk bermain dan setiap kali mouse di klik pada objek, maka akan
diperdengarkan suatu suara. Permainan ini akan menganimasikan 3 jenis objek serangga yang
memiliki warna yang berbeda-beda, yaitu merah, kuning, dan coklat. Selain itu akan
ditambahkan beberapa objek batu. Jika salah satu objek Serangga akan bertabrakan dengan
Batu, maka objek Serangga akan berputar.
Tugas pemain adalah membunuh semua serangga yang berwarna merah. Setiap dapat
membunuh serangga warna merah, maka pemain mendapat nilai, jika sebaliknya, nilai pemain
akan minus. Permainan akan selesai jika ternyata nilai pemain di bawah 0.
Membuat World
Berdasar skenario kita, terlebih dahulu kita akan membuat sebuah World yang berisi
gambar rumput. Buatlah sebuah skenario baru terlebih dahulu, dan berilah nama sesuai selera
Anda, misalnya Rumput. Kemudian dari item World, klik kanan dan pilih New subclass...
Masukkan nama Rumput sebagai World kita, dan pilih gambar rumput.jpg yang sudah
disediakan. Untuk memasukkan gambar rumput.jpg ke skenario, Anda dapat melakukannya
dengan dua cara:
1. memilih gambar dari tombol Import from file... saat Anda membuat World baru, atau
2. menduplikat file gambar ke folder images dalam folder skenario Anda.
Source code yang dihasilkan dari template Greenfoot terhadap pembuatan world baru ini
sebagai berikut :
Kita akan menggunakan ukuran world seperti pada template tersebut. Dengan deklarasi super()
tersebut, berarti untuk setiap perpindahan objek aktor akan diterapkan satuan 1 pixel, dengan
batasan lebar 600 pixel dan tinggi 400 pixel.
Membuat Batu
Berikutnya kita akan membuat sebuah aktor baru yang akan mewakili objek batu. Untuk
membuat Actor baru, kita harus lakukan dengan cara membuat class turunan Actor. Klik kanan
pada item Actor, kemudian pilih New subclass... Berilah nama class dengan Batu dan berikan
gambar batu.png yang sudah tersedia.
Membuat Serangga
Serupa dengan pembuatan class aktor Batu, untuk pembuatan aktor serangga kita akan
membuatnya dengan sebuah class Serangga terlebih dahulu sebagai class induk untuk semua
class aktor serangga merah, serangga kuning, dan serangga coklat. Class Serangga ini akan
menyediakan fungsi-fungsi umum yang dapat dikerjakan oleh serangga, misalnya berpindah
dan berputar.
Pembuatannya: pada item Actor, klik kanan, dan pilih New subclass... Masukkan nama
Serangga sebagai nama class dan tanpa gambar. Kemudian klik kanan pada item class
Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar
serangga_merah.png. Demikian juga untuk SeranggaKuning dan SeranggaCoklat. Gambar 1
menunjukkan hasil deklarasi class tersebut.
Berikutnya, kita akan mendefinisikan dua fungsi untuk class Serangga, yaitu berpindah dan
berputar. Anda dapat mengetikkan kode program di bawah ini dalam class Serangga:
/*
*
disadur
dari
class
Animal
Greenfoot
book
*/
public
void
pindah(double
kecepatan)
{
double
sudut
=
Math.toRadians(
getRotation()
);
int
posx
=
(int)Math.round(getX()
+
Math.cos(sudut)
*
kecepatan);
int
posy
=
(int)Math.round(getY()
+
Math.sin(sudut)
*
kecepatan);
setLocation(posx,
posy);
}
/*
*
disadur
dari
class
Animal
Greenfoot
book
*/
public
void
putar(int
sudut)
{
setRotation(getRotation()
+
sudut);
}
Pada fungsi pindah() pertama-tama akan mengubah sudut rotasi objek Serangga saat
ini ke satuan unit radian1. Dengan menggunakan gambaran sebuah segitiga (Gambar 2), kita
dapat menentukan posisi perpindahan x, y berikutnya sesuai dengan sudut rotasi yang aktif.
1 http://en.wikipedia.org/wiki/Radian
Gambar 2. Trigonometri
Sehingga untuk mendapatkan nilai koordinat x dan y yang baru kita dapat menerapkan perintah
sederhana berikut :
int
posx
=
(int)Math.round(getX()
+
Math.cos(sudut)
*
kecepatan);
int
posy
=
(int)Math.round(getY()
+
Math.sin(sudut)
*
kecepatan);
Variabel kecepatan kita gunakan sebagai faktor besarnya jarak yang dihasilkan dari nilai
cos() atau sin(). Sehingga jika ingin objek Serangga bergerak lebih cepat, maka kecepatan
dapat diberi nilai yang lebih besar.
Kemudian, kita juga membutuhkan fungsi yang dapat digunakan untuk mendeteksi apakah
sebuah objek aktor Serangga sampai di batas World atau tidak. Untuk itu fungsi berikut dapat
kita gunakan :
/*
*
memodifikasi
dari
class
Animal
Greenfoot
book
*/
public
boolean
batasWorld(GreenfootImage
img)
{
int
wImg
=
img.getWidth();
int
hImg
=
img.getHeight();
if(getX()
<
wImg
||
getX()
>
getWorld().getWidth()
-‐
wImg)
return
true;
if(getY()
<
hImg
||
getY()
>
getWorld().getHeight()
-‐
hImg)
return
true;
else
return
false;
}
Selanjutnya kita juga menyediakan suatu fungsi yang dapat digunakan untuk
mendeteksi objek yang ada disekitar dari objek aktor Serangga. Misalnya kita akan
menggunakan fungsi ini untuk mendeteksi apakah didepannya adalah batu atau tidak. Berikut
adalah contoh deklarasi fungsi pendeteksi tersebut:
Dengan method getNeighbours(), kita dapat cek apakah pada jarak jarak pixel di
depan, belakang, kiri, atau kanan apakah terdapat objek Class. Jika ada, maka method ini
akan mengembalikan objek List dari Actor. Jika tidak terdapat objek yang dikondisikan
bertabrakan atau tidak, maka method getNeighbours() akan mengembalikan List kosong.
Berikutnya kita juga akan menambahkan perintah untuk membuang semua objek
SeranggaCoklat dan SeranggaKuning pada deklarasi fungsi stopped() berikut :
jumlah maksimal SeranggaMerah yang muncul adalah 4, maka kita dapat melakukannya
dengan cara sebagai berikut (ini hanyalah contoh algoritma, jika Anda memiliki yang lain
silahkan diterapkan):
1. deklarasikan method act() pada Rumput:
2. cek apakah jumlah objek SeranggaMerah sudah maksimal? Oleh karena objek
SeranggaMerah tidak ditampung dalam sebuah array, maka kita dapat mengetahui
jumlah SeranggaMerah, kita dapat memanggil fungsi getObjects(Class
cls) yang
mengembalikan objek java.util.List.
3. Jika belum maksimal, lakukan:
a. cek apakah nilai random dengan limit 1000 apakah lebih dari 990?
b. jika betul, tambahkan objek SeranggaMerah baru ke Rumput dengan koordinat acak.
Pada method stopped() tentunya juga kita tambahkan kode program agar membuang semua
objek SeranggaMerah. Berikut adalah contoh kodenya:
Mendeteksi Mouse
Greenfoot juga dilengkapi dengan fungsi yang dapat membantu kita untuk mendeteksi
posisi dan tombol mouse yang diklik oleh pemakai. Dengan fungsi ini kita menjadi semakin
mudah untuk mendeteksi mouse untuk game kita.
Semua method untuk mendeteksi aktifitas mouse dimasukkan dalam class Greenfoot.
Berikut beberapa method tersebut :
• mouseClicked(java.lang.Object), akan mengembalikan nilai true jika ternyata posisi
mouse yang diklik mengenai objek yang dimasukkan sebagai parameter.
• mouseDragged(java.lang.Object), akan mengembalikan nilai true jika ternyata objek
yang dimasukkan pada parameter di-drag oleh pemakai.
• mouseDragEnded(java.lang.Object), akan mengembalikan nilai true jika operasi
drag selesai pada objek actor yang sebelumnya dimulai operasi drag.
• mouseMoved(java.lang.Object), akan mengembalikan nilai benar jika penunjuk
mouse melewati di atasnya objek.
Sebagai catatan: semua fungsi mouse di atas, kecuali getMouseInfo(), jika parameter
berisi null, maka fungsi pendeteksian mouse akan dilakukan untuk semua area dan objek yang
ada pada World.
Sesuai dengan skenario yang sudah kita tuliskan di awal dari modul ini, saat ini kita
akan mendeklarasikan pendeteksian klik mouse untuk aktor SeranggaMerah. Untuk
menerapkan ini, pada method act() class SeranggaMerah kita tambahkan deklarasi sebagai
berikut :
if
(Greenfoot.mouseClicked(this))
{
getWorld().removeObject(this);
if
(Greenfoot.getRandomNumber(1000)
>
990)
{
addedToWorld(getWorld());
}
}
GreenfootSound(String nmfilesound)
Sebagai contoh, terdapat file suara bernama slurp.wav yang ada di subfolder sounds. Kita akan
memainkan file suara ini setiap kali SeranggaMerah diklik. Selain itu akan memainkan file suara
pop.wav jika SeranggaKuning dan SeranggaCoklat di klik. Berikut contoh kode program untuk
SeranggaMerah yang dituliskan pada fungsi act() untuk melengkapi kode pengcekan klik mouse
sebelumnya :
if
(Greenfoot.mouseClicked(this))
{
GreenfootSound
snd
=
new
GreenfootSound("slurp.wav");
snd.play();
getWorld().removeObject(this);
Rumput.skor++;
if
(Greenfoot.getRandomNumber(1000)
>
990)
{
addedToWorld(getWorld());
}
}
Sedangkan untuk method act(), baik pada class SeranggaKuning ataupun SeranggaCoklat
dapat berisi kode untuk memainkan file suara sebagai berikut :
if
(Greenfoot.mouseClicked(this))
{
GreenfootSound
snd
=
new
GreenfootSound("pop.wav");
snd.play();
}
oOo