© 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