Modul 9 - Lecturer

advertisement
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
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 :
Modul 9 Praktikum PBO untuk mahasiswa
1
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
public class Rumput extends World
{
public Rumput()
{ super(600, 400, 1);
}
}
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.
Modul 9 Praktikum PBO untuk mahasiswa
2
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
Gambar 1. Struktur Class World dan Actor
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
Modul 9 Praktikum PBO untuk mahasiswa
3
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
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:
Modul 9 Praktikum PBO untuk mahasiswa
4
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
public boolean isBersinggungan(int jarak, Class clss)
{
java.util.List actor = getNeighbours(jarak, false, clss);
return actor.size() > 0;
}
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.
Gambar 3. Contoh hasil eksekusi dengan 3 objek turunan Serangga
Penerapan Array Objek
Sekarang kita akan mencoba untuk mendefinisikan beberapa objek SeranggaKuning
dan SeranggaCoklat pada saat World mulai dijalankan. Untuk melakukan ini, pertama-tama kita
harus lakukan overridden fungsi started() pada class Rumput yang merupakan turunan dari
World.
public void started() {
}
Di dalam method tersebut, kita akan mendefinisikan 4 objek SeranggaKuning dan 5
objek SeranggaCoklat, yang masing-masing di tampung dalam suatu objek koleksi List. Untuk
itu sebelumnya kita deklarasikan dua buah atribut class Rumput sebagai berikut :
private SeranggaCoklat[] coklat;
private SeranggaKuning[] kuning;
Modul 9 Praktikum PBO untuk mahasiswa
5
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
Kemudian di dalam method started(), kita deklarasikan semua objek SeranggaKuning
dan SeranggaCoklat yang dibutuhkan dan menempatkannya pada posisi secara acak tanpa
pengecekan apakah saling tumpang tindih atau tidak:
public void started() {
coklat = new SeranggaCoklat[5];
kuning = new SeranggaKuning[4];
coklat[0] = new SeranggaCoklat();
coklat[1] = new SeranggaCoklat();
coklat[2] = new SeranggaCoklat();
coklat[3] = new SeranggaCoklat();
coklat[4] = new SeranggaCoklat();
kuning[0] = new SeranggaKuning();
kuning[1] = new SeranggaKuning();
kuning[2] = new SeranggaKuning();
kuning[3] = new SeranggaKuning();
for(int i=0; i < coklat.length; i++) {
int x = Greenfoot.getRandomNumber(getWidth());
int y = Greenfoot.getRandomNumber(getHeight());
addObject(coklat[i], x, y);
}
for(int i=0; i < kuning.length; i++) {
int x = Greenfoot.getRandomNumber(getWidth());
int y = Greenfoot.getRandomNumber(getHeight());
addObject(kuning[i], x, y);
}
}
Berikutnya kita juga akan menambahkan perintah untuk membuang semua objek
SeranggaCoklat dan SeranggaKuning pada deklarasi fungsi stopped() berikut :
public void stopped() {
for(int i=0; i < coklat.length; i++) {
removeObject(coklat[i]);
}
for(int i=0; i < kuning.length; i++) {
removeObject(kuning[i]);
}
}
Memunculkan SeranggaMerah secara acak
Pada bagian ini kita akan mulai memunculkan objek SeranggaMerah secara bergantian
sampai mencapai maksimal jumlahnya pada satu world Rumput kita. Misal kita tentukan bahwa
Modul 9 Praktikum PBO untuk mahasiswa
6
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
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:
public void act() {
}
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.
Cobalah Anda terapkan algoritma tersebut pada Rumput() Anda.
Pada method stopped() tentunya juga kita tambahkan kode program agar membuang semua
objek SeranggaMerah. Berikut adalah contoh kodenya:
java.util.List merah = getObjects(SeranggaMerah.class);
for(int i=0; i < merah.size(); i++) {
removeObject( (SeranggaMerah)merah.get(i));
}
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.
Modul 9 Praktikum PBO untuk mahasiswa
7
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
•
mousePressed(java.lang.Object), akan mengembalikan nilai true jika terjadi
•
perubahan status dari tidak ditekan menjadi ditekan pada posisi objek.
getMouseInfo() akan mengembalikan objek dari class MouseInfo yang merupakan
status terakhir dari operasi mouse sebelumnya. Jika tidak ada operasi sebelumnya,
maka fungsi ini akan mengembalikan nilai null. Pada class MouseInfo terdapat beberapa
method yang berguna, antara lain: getActor(), getButton(), getClickCount(), getX(), getY().
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());
}
}
Memainkan file suara
Terakhir dari modul ini adalah memainkan file suara pada permainan kita. Sekali lagi
framework Greenfoot sudah menyediakan fungsi untuk hal tersebut. Untuk dapat memainkan
file suara, semua file sound diletakkan pada subfolder sounds, dan sebaiknya menggunakan
format .wav (raw format), .aiff, au, mp3, atau midi. Selanjutnya, Greenfoot telah menyediakan
class khusus, yaitu GreenfootSound untuk menangani hal tersebut. Class GreenfootSound memiliki satu constructor :
GreenfootSound(String nmfilesound)
Setelah kita mendapat objek GreenfootSound baru, selanjutnya kita dapat
memainkannya dengan memanggil method play(). Suara juga dapat dihentikan atau
dihentikan sementara (pause) dengan memanggil fungsi stop() dan pause(). Suara juga
dapat dimainkan secara berulang-ulang dengan memanggil fungsi playLoop(). Jika Anda
membutuhkan untuk menguji apakah objek suara saat ini sedang memainkan file suara, dapat
dicek dengan menggunakan method isPlaying().
Modul 9 Praktikum PBO untuk mahasiswa
8
© 2011 Hak cipta di tangan penulis – Budi Susanto – TI UKDW Yogyakarta.
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
Modul 9 Praktikum PBO untuk mahasiswa
9
Download