Rabu, 22 Februari 2017

TUTORIAL GREENFOOT - MEMBUAT GAME SEDERHANA ALA FEEDING FRENZY


Gambaran Umum Game

• Game ini memiliki skenario sederhana yaitu 1 aktor ikan yang lapar, 2 aktor ikan yang dapat dimakan, 1 aktor ikan yang beracun.
• Game terdiri dari 2 scene yaitu scene Level dan Menu.
• Pada Level1, jika berhasil memakan lebih dari 10 ikan, maka pemain dinyatakan menang. Sedangkan jika pemain menyentuh ikan beracun, maka pemain dinyatakan kalah.


Langkah Pembuatan
Langkah Pembuatannya adalah sebagai berikut :

1) Siapkan Resource Image dan Sound untuk project ini.

(Download di SINI )

Letakan gambar berikut di folder images :
*Semua image berformat .png

Letakan file suara berikut di folder sounds :


*Bisa pakai gambar dan sounds dari anda sendiri, tapi jangan lupa nama dan ekstensi disesuaikan dengan coding nantinya.

Buat subclass-subclass berikut :




2) Mari kita Mulai Coding!

Class Levels

 import greenfoot.*;   
 abstract class Levels extends World  
 {  
   public Levels()  
   {      
     super(800, 600, 1);  
   }  
 }  


Class Level1

 import greenfoot.*;   
 public class Level1 extends Levels  
 {  
   public Level1()  
   {    
     super();  
     prepare();  
  }  
  public void prepare()  
   {  
     Crab crab = new Crab();  
     addObject(crab, 506, 668);  
     Crab crab2 = new Crab();  
     addObject(crab2, 657, 602);  
     crab.setLocation(499, 546);  
     crab2.setLocation(652, 567);  
     crab.setLocation(491, 511);  
     crab.setLocation(482, 501);  
     IkanJahat hungryFish = new IkanJahat();  
     addObject(hungryFish, 434, 135);  
     fish fish = new fish();  
     addObject(fish, 212, 262);  
     fish fish2 = new fish();  
     addObject(fish2, 408, 307);  
     fish fish3 = new fish();  
     addObject(fish3, 506, 313);  
     fish fish4 = new fish();  
     addObject(fish4, 517, 268);  
     fish fish5 = new fish();  
     addObject(fish5, 203, 89);  
     fish fish6 = new fish();  
     addObject(fish6, 147, 51);  
     fish fish7 = new fish();  
     addObject(fish7, 102, 169);  
     fish fish8 = new fish();  
     addObject(fish8, 94, 254);  
     fish fish9 = new fish();  
     addObject(fish9, 180, 320);  
     fish fish10 = new fish();  
     addObject(fish10, 264, 342);  
     fish fish11 = new fish();  
     addObject(fish11, 311, 53);  
     fish fish12 = new fish();  
     addObject(fish12, 519, 56);  
     fish fish13 = new fish();  
     addObject(fish13, 266, 217);  
     fish fish14 = new fish();  
     addObject(fish14, 422, 237);  
     fish fish15 = new fish();  
     addObject(fish15, 89, 99);  
     fish fish16 = new fish();  
     addObject(fish16, 57, 353);  
     fish1 fish1 = new fish1();  
     addObject(fish1, 154, 149);  
     fish1 fish17 = new fish1();  
     addObject(fish17, 259, 259);  
     fish1 fish18 = new fish1();  
     addObject(fish18, 25, 42);  
     fish1 fish19 = new fish1();  
     addObject(fish19, 40, 268);  
     fish1 fish110 = new fish1();  
     addObject(fish110, 417, 368);  
     fish1 fish111 = new fish1();  
     addObject(fish111, 524, 251);  
     fish1 fish112 = new fish1();  
     addObject(fish112, 317, 298);  
     fish3 fish32 = new fish3();  
     addObject(fish32, 259, 159);  
     fish3 fish33 = new fish3();  
     addObject(fish33, 40, 148);  
     fish3 fish34 = new fish3();  
     addObject(fish34, 530, 205);  
     fish3 fish35 = new fish3();  
     addObject(fish35, 242, 37);  
     fish3 fish36 = new fish3();  
     addObject(fish36, 145, 355);  
     fish3 fish37 = new fish3();  
     addObject(fish37, 174, 241);  
     fish3 fish38 = new fish3();  
     addObject(fish38, 553, 378);  
     fish111.setLocation(443, 24);  
     fish2.setLocation(574, 127);  
     fish38.setLocation(347, 230);  
     fish110.setLocation(528, 370);  
     fish10.setLocation(395, 371);  
     fish36.setLocation(408, 306);  
     fish.setLocation(257, 382);  
     fish17.setLocation(147, 373);  
     fish37.setLocation(104, 28);  
     fish33.setLocation(33, 376);  
     fish32.setLocation(186, 251);  
     fish34.setLocation(575, 68);  
     fish38.setLocation(501, 219);  
     fish3 fish39 = new fish3();  
     addObject(fish39, 260, 149);  
     fish3 fish310 = new fish3();  
     addObject(fish310, 48, 159);  
     removeObject(fish14);  
     removeObject(fish39);  
     removeObject(fish36);  
     removeObject(fish10);  
     removeObject(fish6);  
     removeObject(fish12);  
     removeObject(fish);  
     removeObject(fish9);  
     fish32.setLocation(206, 328);  
     fish13.setLocation(300, 359);  
     hungryFish.setLocation(425, 143);  
     fish34.setLocation(415, 348);  
     fish35.setLocation(544, 65);  
     fish111.setLocation(215, 31);  
     fish3.setLocation(267, 214);  
     fish7.setLocation(433, 29);  
     fish11.setLocation(200, 250);  
     fish34.setLocation(249, 572);  
     fish110.setLocation(727, 620);  
     fish13.setLocation(934, 322);  
     fish112.setLocation(368, 686);  
     fish32.setLocation(147, 608);  
     fish17.setLocation(597, 551);  
     fish33.setLocation(39, 471);  
     fish16.setLocation(270, 383);  
     hungryFish.setLocation(765, 128);  
     fish4.setLocation(477, 341);  
     fish38.setLocation(637, 437);  
     fish3.setLocation(377, 143);  
     fish11.setLocation(160, 357);  
     fish8.setLocation(891, 515);  
     fish1.setLocation(375, 519);  
     fish5.setLocation(666, 388);  
     fish111.setLocation(263, 216);  
     fish37.setLocation(153, 198);  
     removeObject(fish7);  
     removeObject(fish3);  
     removeObject(fish11);  
     removeObject(fish17);  
     removeObject(fish13);  
     removeObject(fish4);  
     bubble bubble = new bubble();  
     addObject(bubble, 763, 375);  
   }  
 }  


Class IkanJahat

 import greenfoot.*;   
 public class IkanJahat extends Actor  
 {  
   public int totalPoisonEat = 0;  
   public int totalFishEat = 0;  
   Score score_field = new Score("Score:" + totalFishEat);  
   public void act()   
   {  
     keyBoardControl();  
     eat();  
     checkScore();  
   }    
   public void checkScore()  
   {  
     if(totalPoisonEat >= 1)   
     {  
       setImage("fishMainDead.png");   
       loose alert_loose = new loose();  
       getWorld().addObject(alert_loose, 370, 300);     
       Greenfoot.delay(350);  
       Greenfoot.setWorld(new MenuScreen());  
     }  
     if(totalFishEat >= 10)   
     {  
       win alert_win = new win();  
       getWorld().addObject(alert_win, 370, 300);   
        Menus.titleSound.stop();  
       Greenfoot.playSound("fanfare.wav");  
       //Greenfoot.stop();  
       Greenfoot.delay(350);  
       Greenfoot.setWorld(new MenuScreen());  
     }  
   }  
   public void keyBoardControl()  
   {   
     if (Greenfoot.isKeyDown("left") )  
     {  
       setImage("fishMain2left.png");      
       move (-3) ;  
       if (Greenfoot.isKeyDown("down"))  
         turn (-3) ;  
       if (Greenfoot.isKeyDown("up"))  
         turn (3);     
     }     
     if (Greenfoot.isKeyDown("right"))  
     {   
       setImage("fishMain2.png");  
       move (3);  
       if (Greenfoot.isKeyDown("down"))  
         turn (3) ;  
       if (Greenfoot.isKeyDown("up"))  
         turn (-3);  
     }  
   }  
   public void eat()  
   {  
     Actor Score;  
     Actor fish;  
     fish = getOneObjectAtOffset(4, 4, fish.class);  
     getWorld().addObject(score_field, 90, 30);  
     if (fish != null)  
     {  
       World Sea;  
       Sea = getWorld() ;  
       Sea.removeObject(fish);  
       Greenfoot.playSound("eating.wav");  
       totalFishEat++;  
       score_field.setText("Score: " +totalFishEat);  
       hitafish();  
     }  
     Actor fish1;  
     fish1 = getOneObjectAtOffset(4, 4, fish1.class);  
     if (fish1 != null)  
     {  
       World world;  
       world = getWorld() ;  
       world.removeObject(fish1);  
       Greenfoot.playSound("eating.wav");  
       totalFishEat++;  
       score_field.setText("Score: " +totalFishEat);  
       hitafish();  
     }  
     Actor fish3;  
     fish3 = getOneObjectAtOffset(4, 4, fish3.class);  
     if (fish3 != null)  
     {  
       World world;  
       world = getWorld() ;  
       world.removeObject(fish3);  
       Menus.titleSound.stop();  
       Greenfoot.playSound("loose.mp3");  
       totalPoisonEat++;  
       hitafish();  
     }  
   }  
   private void hitafish()  
   {  
     Levels SeaWorld = (Levels) getWorld();  
   }  
 }  

Class Menus

 import greenfoot.*;   
 abstract class Menus extends World  
 {  
   public static GreenfootSound titleSound;  
   public Menus()  
   {    
     super(720, 480, 1);  
     if (this.getClass().getName().equalsIgnoreCase("MenuScreen"))  
     {  
       addObject(new StartBtn(), 80, 100);  
       addObject(new StoryBtn(), 100, 220);  
       addObject(new HelpBtn(), 80, 310);  
       titleSound = new GreenfootSound("title-theme.mp3");  
       titleSound.stop();  
             titleSound.setVolume(70);  
             titleSound.playLoop();  
     }  
     else  
     {  
       addObject(new BackBtn(), 100, 400);  
     }  
   }  
 }  

Class Button

 import greenfoot.*;   
 public class Buttons extends Actor  
 {  
   public void act(String buttonName)   
   {  
     if (Greenfoot.mouseMoved(this)) {  
       setImage(buttonName + "_over.png");  
     } else if (Greenfoot.mouseMoved(null)) {  
       setImage(buttonName + ".png");  
     }  
     if (Greenfoot.mousePressed(this)) {  
       getImage().scale((int)Math.round(getImage().getWidth() * 0.9), (int)Math.round(getImage().getHeight() * 0.9));  
     }  
     if (Greenfoot.mouseClicked(null) || Greenfoot.mouseDragEnded(null)) {  
       setImage(buttonName + ".png");   
     }  
     if (Greenfoot.mouseClicked(this)) {  
       setImage(buttonName + ".png");  
       Greenfoot.delay(5);   
       if   (buttonName.equalsIgnoreCase("StartBtn")) Greenfoot.setWorld(new Level1());  
       else if (buttonName.equalsIgnoreCase("StoryBtn")) Greenfoot.setWorld(new StoryScreen());  
       else if (buttonName.equalsIgnoreCase("HelpBtn")) Greenfoot.setWorld(new HelpScreen());  
       else if (buttonName.equalsIgnoreCase("BackBtn")) Greenfoot.setWorld(new MenuScreen());  
     }  
   }  
 }  


Pada setiap class button (story, start, help), letakan statement ini (pada method act)

 public void act()   
   {    super.act(this.getClass().getName());  
   }  


Untuk membuat Kepiting (crab) bergerak, letakkan kode berikut pada class Crab


 import greenfoot.*;  
 public class Crab extends Actor  
 {  
     public void act()   
   {  
      setLocation(getX() - 2, getY());  
      if (getX() <= 0)  
      {  
          setLocation(getWorld().getWidth() +getX() , getY());  
      }  
   }    
 }   


Untuk membuat gelembung (bubble) bergerak, letakkan kode berikut pada class bubble

 import greenfoot.*;  
 public class bubble extends Actor  
 {  
   public void act()   
   {  
     setLocation(getY() - 5, getX());  
      if (getY() <= 0)  
      {  
          setLocation(getWorld().getHeight() + 20 , Greenfoot.getRandomNumber(600));  
      }  
   }     
 }  


Aktor crab dan bubble hanyalah aktor pendukung, tidak ada pengaruhnya pada jalannya game. Hanya sebagai animasi tambahan supaya game lebih menarik.

Pada kelas fish (ikan yang dimakan / ikan musuh) kode dasarnya adalah sebagai berikut 


Class Fish


 import greenfoot.*;  
 public class fish extends Actor  
 {  
   public void act()   
   {  
     move (2) ;  
     if (Greenfoot.getRandomNumber (20) < 10)  
   {  
     turn (Greenfoot.getRandomNumber (50) - 20) ;  
   }   
   if (getX () <= 5 || getX() >= getWorld().getWidth () - 5)  
   {  
   turn (180) ;  
   }  
   if (getY () <= 5 || getY() >= getWorld().getHeight () - 5)  
   {  
     turn (180) ;  
   }  
   }     
 }  


Listing Program ini dipakai juga untuk class fish1 dan fish3. Untuk melakukan variasi terhadap gerakan ikan, maka kita dapat mengubah nilai move() dan turn() diatas sesuai dengan keinginan.

Pada Class Score, kode nya adalah sebagai berikut

Class Score

 import greenfoot.*;   
 import java.awt.Color;  
 import java.applet.*;  
 import java.awt.*;  
 public class Score extends Actor  
 {  
 Font font1=new Font("Helvetica",Font.BOLD,35);  
  public Score(String text)  
  {  
    GreenfootImage img_field = new GreenfootImage(140,50);  
    img_field.setFont(font1);  
    img_field.setColor(Color.white);  
    img_field.drawString(text, 0, 45);  
    setImage(img_field);  
   }  
  public void setText(String text)  
   {  
     GreenfootImage img_field = getImage();  
     img_field.clear();  
     img_field.drawString(text, 0, 45);  
   }  
 }  
Tutorial Greenfoot
Versi 1.0
untuk Greenfoot versi 1.0
Greenfoot merupakan lingkungan pengembangan Java(Java development environtment) yang bersifat interaktif dan didesain untuk tujuan pendidikan pada level SMA dan S1. Dengan program ini, seseorang dapat mengembangkan aplikasi grafis dua dimensi, seperti simulasi dan game interaktif.
Greenfoot dikembangkan oleh University of Kent danLa Trobe University, dengan dukungan dari Oracle. Software ini gratis, dirilis di bawah lisensi GPL. Greenfoot tersedia pada banyak platform, seperti MS Windows, Mac OS X, Linux, Sun Solaris, dan beberapa JVM terbaru.

Dengan greenfoot, seorang siswa/mahasiswa dapat belajar pemrograman berorientasi obyek menggunakan Java. Mereka dapat menciptakan 'actor' dalam suatu 'world'untuk membangun game, simulasi, dan program-program grafis lainnya.

Greenfoot bersifat visual dan interaktif. Perangkat visualisasi dan interaksi dibangun di dalam environment tersebut.Actor diprogram menggunakan kode Java yang standar, sehingga memberikan pengalaman pemrograman berbasis teks yang bersifat tradisional dengan eksekusi visual.

Antarmuka yang digunakan sepenuhnya menggunakan konsep IDE, dimana didalamnya terdapat manajemen proyek,auto-completion, syntax highlighting, dan tool-tool lain yang biasanya terdapat pada kebanyakan IDE. Hal ini memungkinkan seorang pemrogram mempublikasikan pekerjaannya baik secara online maupun offline. Meskipun demikian, antarmukanya didesain untuk tetap sederhana dan mudah digunakan, sehingga cocok untuk para pemula.
Greenfoot digunakan oleh ribuan institusi di seluruh dunia. Program ini memberikan peralihan yang mudah keenvironment lainnya, semacam BlueJ dan IDE-IDE profesional yang lain.
Program dalam greenfoot ditulis dengan bahasa Java standar, yang merupakan salah satu bahasa utama dalam dunia akademis dan industri. Software ini didesain agar cukup mudah bagi pemula. Dengan digunakannya Java, memungkinkan seorang programmer membuat aplikasi yang impresif, fleksibel, dan canggih.

Software ini memang cocok bagi siswa/mahasiswa yang ingin belajar dan memperdalam baik secara konsep maupun praktik pemrograman berorientasi obyek. Software tersebut dapat didownload pada alamat inihttp://www.greenfoot.org/daownload, yang tersedia dalam berbagai platform sistem operasi. Beberapa contoh program dapat didownload pada alamat ini: http://www.greenfoot.org/book/material/book-scenarios.zip.
Untuk membuat sebuah game yang simple, diperlukan beberapa tahap antara lain;
  • Ide
    Objek 1 mengambil sebuah bola tanpa tertangkap oleh objek 2
  • Membuat Skenario
    Objek 1 (Ronaldo) mengambil bola dan setiap menemui bola maka bola tersebut akan di ambil. Objek 1 (Ronaldo) akan berkeliing ke seluruh area sampai mengambil seluruh bola yang ada tanpa tertangkap oleh objek 2 (Messi).
  • Objek
    1. Word : Disesuaikan
    2. Aktor : Ronaldo dan Messi
    3. Target : Bola
  • Implementasi dalam Greenfoot
Nah, teman-teman sekrang kita masuk untuk membuat sebuah pemrograman dasar game menggunakan Greenfoot.
1.  Bukalah Aplikasi Greenfoot
0Maka akanmuncul tampilan seperti ini;
3
2.  Buatlah sebuah scenario baru. Caranya; Scenario => New => Nama Objek
1Kemudian akan muncul kotak dialog, dimana teman-teman akan menyimpan diamana hasil kerja teman-teman.
2
3.  Buatlah sebuah sub class di class word dengan cara klik kanan lalu pilih new subclass. lalu akan muncul jendela baru untuk memasukkan nama kelas. saya memberikan nama cell (perhatikan huruf besar dan kecilnya, karena pada pemrograman java bersifat case sensitive artinya huruf besar dan kecil sangat berpengaruh).
4
Akan muncul kotak dialog;
3
Pilih background yang teman-teman sukai, kemudian jangan lupa untuk memberikan nama class. Kemudian pilih OK. Untuk melihat hasilnya, klik compile maka akan tampil background yang dipilih tadi.
6
Klik kanan pada cell kemudian pilih open editor, maka akan ta;mpil tampilan kode program class word dalam hal ini cell
8
9
Perhatikan diatas cell ada perintah super(600,400,1). Perintah ini digunakan untuk membuat ukuran layar dengan panjang 600 x tinggi 400 dengan ukuran cell 1 x 1.
4.  Sekarang kita akan membuat Subclass Actor.
11
10
Disini untuk memasukkan gambar diatas, pilih import from file kemudian pilih gambar sesuai tema. setelah itu,  klik gambar tersebut kemudian jangan lupa untuk mengisikan nama class.  berikut tampilan depan
7
12
5.  Menempatkan objek dalam subclaass cell. Klik kanan pada cell kemudian pilih open editor
14
Tambahkan Program
ronaldo ronaldo = new ronaldo ();        //menciptakan objek
addObject (ronaldo, 50, 50);        //mengatur koordinat letak actor
        
messi messi = new messi();
addObject (messi, Greenfoot.getRandomNumber(400), 
Greenfoot.getRandomNumber(200) + 100);
Compile dan jika tidak ada kesalahan syntax lihat apa yang terjadi pada subclass cell.
17
6.  Mengatur gerak aktor dengan Keyboard
Tambahkan kode program pada aktor ronaldo seperti berikut :
if (Greenfoot.isKeyDown(“rigth”)) {
    setLocation(getX() + 2, getY());
}
if (Greenfoot.isKeyDown(“left”)) {
    setLocation(getX() – 2, getY());
}
if (Greenfoot.isKeyDown(“up”)) {
    setLocation(getX(), getY() – 2);
}
if (Greenfoot.isKeyDown(“down”)) {
    setLocation(getX(), getY() +2);
16Telan compile dan pastikan coding yang teman buat sudah sesuai, jika tidak terjadi kesalahan maka akan muncul tulisan Class compiled – no syntax error.
7.  Cara membuat gerakan lain
buatlah 2 buah method didalam kode program subclass ronaldo, seperti berikut;
public void checkMovement()
    
  {    if (Greenfoot.isKeyDown(“right”)) {
       move(3);
    }
    if (Greenfoot.isKeyDown(“left”)) {
       move(-3);
    }
  }
  public void checkDirection(){
if (Greenfoot.isKeyDown(“up”)) {
       turn(-3);
    }
if (Greenfoot.isKeyDown(“down”)) {
       turn(3);
    }
  }
Panggil method tersebut dalam method act () dengan perinta;
chekMovement();
chekDirection();
Compile dan jika tidak ada kesalahan penulisan maka coba jalankan program dan lihat perubahan yang akan terjadi.
8.  Membuat objek (bola) sebagai target
Menciptakan objek bola pada subsclass cell, tambahkan kode program;
 numberofbola = Greenfoot.getRandomNumber(20);
                 for (int i = 0; i <= numberofbola; i++)
        {
            bola bola = new bola();
            addObject(bola, Greenfoot.getRandomNumber(350), Greenfoot.getRandomNumber(350));
        }
      }
      
    public int getNumberOfbola() {
        return numberofbola;
18
Jagan lupa, untuk memberikan class bola pada class cell. ( public int numberofbola; )
Berikut, hasil kode program.
15
9.  Mengambil TargetBuat method pada aktor dalam kasus ini yaitu actor ronaldo bertemu dengan bola.
pada act() berikan kode program;
if (foundbola()) {
             eatbola();
kemudian;
public boolean foundbola()  {
      Actor bola = getOneObjectAtOffset(0, 0, bola.class);
      if(bola !=null)  {
          return true;
        }  else  {
            return false;
        }
    }
    public void eatbola()  {
        Actor bola = getOneObjectAtOffset(0, 0, bola.class);
        if(bola !=null) {
            getWorld().removeObject(bola);
        }
19
10.  Objek (messi) sebagai halangan objek (ronaldo) untuk mengambil bolaUntuk membuat program ini, terlebih dahulu kita masuk ke open editor pada actor (messi), dengan program
public void act() 
    {
        // Add your action code here.
         if (foundronaldo()) {
            eatronaldo(); 
        }
        if(canMove()) {
            move (3);
        } else {
            turn(180);
            move(5);
        }
            }
public boolean canMove()
{
World myWorld = getWorld();
int x = getX();
if (x >= (myWorld.getWidth() – 10)) {
return false;
} else if (x <= 10) {
return false;
} else {
return true;
}
}
public boolean foundronaldo() { 
      Actor ronaldo = getOneObjectAtOffset(0, 0, ronaldo.class);
      if(ronaldo !=null) {
          return true;
        } else {
            return false;
        }
    } 
        public void eatronaldo() {
        Actor wombat = getOneObjectAtOffset(0, 0, ronaldo.class);
        if(wombat !=null) {
        getWorld().removeObject(wombat);
        }
}
}
20