• Tidak ada hasil yang ditemukan

2011 Hak cipta di tangan penulis Budi Susanto TI UKDW Yogyakarta.

N/A
N/A
Protected

Academic year: 2021

Membagikan "2011 Hak cipta di tangan penulis Budi Susanto TI UKDW Yogyakarta."

Copied!
9
0
0

Teks penuh

(1)

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 :

(2)

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.

(3)

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.

(4)

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:

(5)

       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;

(6)

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

(7)

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.

(8)

• 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().

(9)

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();

               }

Gambar

Gambar 1. Struktur Class World dan Actor
Gambar 3. Contoh hasil eksekusi dengan 3 objek turunan Serangga Penerapan Array Objek

Referensi

Dokumen terkait

Selain proses morfologi infleksi dengan pengimbuhan afiks infleksi ter- dan ke-/-an di atas, pada adjektiva afiksasi BI terdapat pula proses morfologi infleksi yang berupa

Pada sistem ini, solar panel tidak dapat mengoperasikan beban secara langsung. Energi yang dihasilkan solar panel disimpan dahulu dalam accu yang untuk selanjutnya digunakan

(3) Dalam hal Penghasil, Pengumpul, Pemanfaat, Pengangkut, Pengolah, dan Penimbun limbah B3 tidak melakukan penanggulangan pencemaran dan/atau kerusakan lingkungan

Di dalam Sistem Internasional (SI) terdapat 7 besaran pokok yang memiliki dimensi yaitu panjang, suhu, waktu, arus listrik, massa intensitas cahaya dan jumlah zat, dan 2

Hanya 1 Kota dari 26 Kabupaten/Kota di Provinsi Jawa Barat yang dapat mencapai target tersebut pada tahun 2013... CAKUPAN PERSALINAN DITOLONG TENAGA KESEHATAN DI INDONESIA

Jika domain dari pelabelan adalah gabungan himpunan simpul dan busur, maka pelabelannya disebut pelabelan total Jumlah dari semua label yang terkait dengan suatu elemen graf

Terlihat adanya pengaruh model kooperatif tipe CRH pada hasil belajar siswa mata pelajaran IPS Tema II Persatuan dalam Perbedaan Kelas VI SDN 13 Pasar Kambang. Pengaruh

Namun dalam prakteknya memang susah untuk menjalankan tugas dan fungsi dari LKM tersebut karena seain dibutuhkan kemaun juga dibutuhkan keahlian dalam membuat suatu media yang