9
© 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

Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

Embed Size (px)

Citation preview

Page 1: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

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

Modul #9Praktikum Pemrograman Berorientasi ObjekSemester Genap Tahun Ajaran 2010/2011oleh 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.

SkenarioSkenario 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 WorldBerdasar 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, atau2. 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

Page 2: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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 BatuBerikutnya 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 SeranggaSerupa 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

Page 3: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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

Page 4: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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

Page 5: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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 ObjekSekarang 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

Page 6: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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 acakPada 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

Page 7: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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 MouseGreenfoot 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

Page 8: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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 suaraTerakhir 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

Page 9: Modul #9 - lecturer.ukdw.ac.idlecturer.ukdw.ac.id/budsus/pdf/TI1163/Module_9.pdf · Serangga, pilih New subclass... dan masukkan nama SeranggaMerah, dan pilih gambar serangga_merah.png

© 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