Pages

Showing posts with label Greenfoot. Show all posts
Showing posts with label Greenfoot. Show all posts

November 9, 2014

Implementing Derby in Greenfoot’s Jar Deployment: Tetris Game

Hello, this November should be called database month in my blog! I’ll post databases related technology such as MySQL, Derby, etc (from {Java} developer’s point of view) to familiarize myself with such technology so I can learn more advanced technology, such as spatial database technology.

Simple greenfoot tetris game
While there are so many libraries out there on the internet that you can use within greenfoot, this post will be the implementation of embedded derby in your greenfoot scenario deployment and a little of its problem. A little knowledge about greenfoot (2.4.0), jar packaging, and embedded derby will be helpful when reading this article. I also post my tetris game distribution which you can download below this post.



Imagine a situation where you have developed from scratch, a tetris game in greenfoot, and then you said to yourself,

“Hmm, I’m too lazy to write down the score saving code manually, I should use derby instead.“

If you want to utilize derby or any other libraries in greenfoot IDE, the IDE has to know where the derby library is and load the derby library’s driver from there. For that, you need to do:

Set the classpath in greenfoot environment by:
  1. Clicking edit -> preferences.
  2. In libraries tab, in user libraries, click add and enter the location to your derby.jar files .
  3. Finally, restart greenfoot.
Then, you can connect to the database via JDBC through derby’s driver. The path to the database will begin from your greenfoot scenario’s root folder.

Problem with Deployment

While it is relatively easy to use derby to create and access database right away in your greenfoot scenario, it’s not the same if you deploy it into a jar file.

You see me losing the game..
If you deploy (or ‘export’) your scenario and run it as is, all of your database related code will be useless. I don’t know the exact problem, but what I do know is that I’ve never saw any ‘jar in a jar’ files in any Java application’s jar. Maybe, your game can’t access the jar files when it is a jar file by itself and thus, the driver will never loaded.

But, worry not--remembering the Java packaging/deployment tutorials, I’ve decided to put derby library (jar) in the same directory as the game’s jar file (not inside the jar) and set the classpath in the game’s jar manifest file to include the derby library.

Derby’s database system and your database folder, will belong in the directory (root directory) that contain your game and derby library’s jar files.

These are the highscore which is saved using derby library
Finally, besides your game’s jar file and the derby’s library, you should put the (pre-generated) database in your game distribution.

The final file structure of your distribution more or less should look like this:

[your game directories] /
   |--- [your game].jar
   |--- derby.jar
   |---derby.log
   |---database /
     |---[your database]

To summarize things up, you can use external libraries in greenfoot by addressing the libraries in the preferences. After you deploy your greenfoot scenario into jar file, you should put the library besides your scenario jar’s file (or database folder) and tell your game’s jar file manifest where the library is.

Tetris game: https://drive.google.com/file/d/0B27ziWaCDimLenNKNkZVYWNwdms/view?usp=sharing


June 27, 2012

Next up! Online game!

Di tutorial berikutnya saya akan membuat tutorial cara membuat game online dengan menggunakan Greenfoot!

Sebenernya gamenya udah jadi dan udah bisa dimainin dengan LAN atau WAN. Tapi masih tahap experimental dan banyak bugnya. Kan saya sambil buat game sambil belajar juga -__- hahaha. Jadi yaa, saya belum begitu mengerti fundamentalnya.

Oh iya, saya emang sekalian belajar juga dengan bikin semua tutorial dipost-post terdahulu. Bikin game online bisa sekalian belajar networking dan I/O Java. Jadi, yaa sangat berguna.


Tutorial nanti bakalan ngebahas dua aplikasi, Client dan Server game tersebut.


Oh iya, kalo mau liat applikasi clientnya, silahkan download di:
http://www.greenfoot.org/scenarios/4238

May 26, 2012

Grapher

Skenario ini untuk menampilkan fungsi matematika.


Ini link skenario yang udah diupload ke Greenfoot Gallery:
http://www.greenfoot.org/scenarios/3423

Ini screenshootnya:



Berikut ini class-classnya:

  • Graph hmm ini koordinat kartesian berisikan x,y, dengan 1 unit = 1 pixel, dan ada grid 5px*5px. Semua garis yang ada ditampilkan di sini berada dalam variabel "lines" yang merupakan vector. Berikut ini fungsi-fungsi (metode) yang utama, fungsi lain selain ini hanya pendukung untuk menggerakan graph ini(dengan cara digeser)..
    • Graph() -- constructor disini tempat kita membuat/menambahkan garis baru. Dengan membuat objek(sebenernya interface..) "line", dan menambahkannya kedalam kumpulan "lines". 
    • drawMap() -- fungsi ini berisi fungsi drawGrid() sama drawLines(), supaya simple hehe. drawGrid() didahulukan supaya fungsi garisnya tidak nabrak sama grid-gridnya.
    • drawLines() --  ini isinya manggi metode drawGrid() terus drawLine(). Supaya lebih rapih sedikit.
    • drawLine() --  menggambar garis, dari paling kiri ke kanan layar, relatif dengan posisi-x dan posisi-y grafik tersebut. Jadi fungsi ini melakukan sebuah loop dari kiri ke kanan sepanjang layar. Jadi awalnya gini, kita menghitung posisi relatif titik pojok kiri-atas layar itu dengan titik (0, 0). Setelah kita mendapatkan selisih x-nya, kita mulai loop dari kiri-layar, x-nya adalah selisih tadi. Saat ini garis belom digambar. Setelah memasukan x pada fungsi garisnya, maka kita mendapatkan y. Naah, untuk digambar giliran y-nya yang dikurangi dengan jarak layar ke titik (0,0), yang y-nya. Jadi sederhananya (xLayar - x, yLayar + y). Kenapa y tidak dikurang? Karena di Greenfoot(ngga hanya Greenfoot sih, hampir semua), semakin tinggi y-nya, semakin kebawah. Ini lebih sederhana lagi, titik yang kita gambar jadinya adalah dari titik [(xLayar - x) -1, (yLayar - y) -1] ke titik [(xLayar-x), (yLayar-y)]
    • drawGrid() -- kalo yang ini, fungsi untuk gambar garis kotak-kotak. Seperti drawLine(), mulai loop dari layar sebelah kiri (untuk garis vertikal). Lalu posisi relatif x, ditambah dengan loopan, dibagi dengan 5, jika ngga ada sisa bagi maka gambar garis deh di posisi x-layar tersebut. Garis horizontalnya juga seperti ini, namun ingat, semakin kebawah y semakin nambah, jadi harus dinegasiin (dibalikin).
  • GraphInfo -- ini objek buat nampilin info yang ada disebelah kanan, supaya keliatan keren aja haha. Soalnya kita juga ngga tau itu posisinya dimana dan ngga ada tulisan di axisnya.
  • Line --  Interface ini keren! Karena bikin kode disini jadi Object Oriented!
    • function() --  nah disini silahkan membuat fungsi buatan kalian sendiri. Eh tapi di class ini ngga bisa diapa-apain, karena ini cuma interface. Kalo mau buat garis liat petunjuknya di constructor kelas Graph.
    • getColor() --  ini untuk ditambahkan, mau warna apa garis tersebut.
Hehehe..
Tadinya sih niatnya mau nambahin parser, supaya bisa langsung masukin fungsi. Tapi belom sempet.
*Niatnya mau bikin RPN parser sendiri jadinya lama...
*Udah lama jadi sih.. jadi tinggal nambahin elemen GUI aja..

May 25, 2012

Skenario Berikutnya: Grapher!

Haduuh kasian nih blog, udah lama ngga update scenario baru, huhu.
Okee, ngga lama lagi saya akan jelaskan scenario yang namanya Grapher.
Skenario ini udah lama sih dibuat, cuma belom di-post di blog aja. hehe.

Ini link skenario yang udah diupload ke Greenfoot Gallery:
http://www.greenfoot.org/scenarios/3423

Ini screenshootnya:

Skenario ini cuma berguna untuk membuat gambar dari suatu fungsi matematika, berhubung saya pensaran, hehe. Cukup membantu dalam pelajaran matematika loh. wkwk.
Oh iya, jadi inget alasan dulu ngga di upload.
Pertama kodenya ngga begitu objek oriented. Jadi susah menjelaskannya hehe. (liat aja, class-nya cuma ada 3)
Yang kedua karena skenario ini belom selesai, belom ada fungsinya.
Kita belom bisa memasukan fungsi kedalam game ini, kalo mau ganti fungsinya, kalian harus download source kodenya dulu, terus ubah deh.

Silahkan download sourcenya dulu hehe.
Cara menambahkan garis gampang, kalian bisa liat di constructor class graph, disitu udah ada garis-garisnya hehe. Silahkan otak-atik.

Ada kelebihan kalo diotak-atik dari sourcenya, yaitu kemungkinan tak terbatas untuk membuat fungsi!
 (x-3)(x+2)
 Math.sin(x);
dan macem-macem!
dan itu yang saya bilang bikin ngerti pelajaran matematika :D

December 27, 2010

Analog Clock!!! AAA!!

http://greenfootgallery.org/scenarios/2303

Asik asik, dari kemaren emang udah kebelet mau buat jam di Greenfoot, akhirnya hari ini kesampaian. :D
Wah source code nya make bahasa Inggris tapi. T__T

Biasanya bisa dijadikan bahan pelajaran nih kalo ada jam jam begini, hoho.
Jadi ya silahkan di download dan dibaca dokumentasinya dengan (di Greenfoot) klik kelas "ClockWorld" dan tekan Ctrl+J  :D

Untuk yang bahasa Indonesianya diuploadnya ditunda, karena mau memperbaiki sistem pemasukan data di website baru saya. hehe (pake XML lho!)

December 26, 2010

Membuat game tetris!

Akhirnya game tetris yang saya buat selesai juga! Gamenya bisa dilihat disini: http://greenfootgallery.org/scenarios/2296

Pada game tetris ini saya hanya mempunyai beberapa class(kelas) pokok, yaitu:
  • TetrisWorld yang merupakan subclass dari World, disini kita akan banyak membuat gameplay.
  • Tetromino yang merupakan kelas abstrak, subclass dari Actor, disinilah fisik dan sifat dari blok-blok tetris dibuat. Kelas tetromino ini mempunya banyak subclass(subkelas) yang berupa bentuk bentuk yang sudah tidak abstrak lagi (sudah konkrit). Subkelas tersebut hanya memberikan informasi tentang lokasi dari blok-blok pembentuk tetromino, karena sifat sifatnya sudah terkandung dalam kelas tetromino ini. Berikut ini adalah subkelas dari Tetromino:
    • TBlock - bongkahan tetris berbetuk T
    • SBlock - bongkahan tetris berbetuk S
    • OBlock - bongkahan tetris berbetuk O
    • LBlock - bongkahan tetris berbetuk L
    • ZBlock - bongkahan tetris berbetuk Z
    • JBlock - bongkahan tetris berbetuk J
    • IBlock - bongkahan tetris berbetuk I
  • Block yang merupakan blok pembangun tetromino, tidak ada kode yang istimewa, hanya untuk membantu kode pada kelas Tetromino.
Sedangkan kelas lainnya pada game ini hanyalah tambahan. Berikut ini kelas tambahan dan fungsinya:
  • Counter kelas untuk menampilkan skor pada game ini. Kelas ini bisa di download di kelas pembantu    http://greenfoot.org/programming/classes.html
  • MidiPlayer kelas untuk memainkan/membuat midi. Bisa didapatkan pada link diatas juga.
  • MidiFilePlayer kelas untuk memainkan file midi. Karena saya mengalami sedikit masalah pada kelas MidiPlayer, maka saya cari kelas lainnya untuk memainkan musik midi, dan saya menemukan kelas ini dari skenario milik tantinton pada greenfootgallery.org
Oke bagi yang mau mempelajarinya, silahkan download dulu sourcenya dari sini:
http://greenfootgallery.org/scenarios/2296
      Update!!! 30, April 2011 
       Telah terjadi error pada pemutar midi, jadi scenarionya tidak bisa dimainkan, tetapi bisa di akali dengan tidak menggunakan suaranya.

      October 12, 2010

      Snake Game!

      Untuk gamenya dapat dimainkan di sini : http://greenfootgallery.org/scenarios/1942
      :D

      Source code telah diubah agar lebih sistematis. Tapi dasarnya sih tetep seperti dibawah ini :D

      Akhirnya seteleah sekian lama, saya ngeblog juga hehe..
      Okee, sekarang kita akan membuat Snake Game! game ular ularan itu lho yang ada di handphone handphone lama. Namun sekarang kita buat versi Greenfootnya!
      Tanpa banyak basa basi, ayoo kita mulai!

      Snake Game... Start!
      Kali ini, kita akan bahas pembuatan game ini per tipe/kelas hohoho!
      Berikut ini adalah kelas kelas yang ada dalam game ini:
      • DuniaUlar, yang merupakan subclass dari World.
      • KepalaUlar, yang akan membuat kepala ular, yang menentukan kendali.
      • KepalaUlar.BadanUlar, inner-class(kelas dalam)nya KepalaUlar, yang menentukan badan dari kepala ular tersebut(yang akan dimasukan kedalam parameter konstruktor BadanUlar).
      • MakananUlar, makanan ular :D.
      Dan ada interface pembantu yang akan digunakan, sekalian untuk belajar apa itu interface di Java, serta penggunaannya sebagai tipe. Adapun interface interfacenya disini adalah:
      • BisaDiikuti, menunjukan bahwa objek yang mengiplementasikan interface ini bisa diikuti.
      • BisaDimakan, menunjukan bahwa objek yang mengiplementasikan interface ini bisa dimakan.
      Oke! mari kita bahas kelas kelas tersebut satu persatu!

      DuniaUlar..
      Berikut ini merupakan keseluruhan source code dari DuniaUlar.java

      import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
      import java.awt.Color;

      /**
      * Dunia Ular!
      *
      * @author Keenan M. Gebze
      * @version 1.0
      */
      public class DuniaUlar extends World
      {
      /**
      * Konstruktor untuk DuniaUlar.
      * Membuat latar belakang DuniaUlar.
      * Menambahkan objek objek yang diperlukan.
      */
      public DuniaUlar()
      {
      /**
      * Membuat DuniaUlar dengan ukuran 20x20, dan setiap kotak 20 pixel * 20 pixel
      */
      super(20, 20, 20);

      /**
      * Mengisi latar belakang dengan warna 0, 100, 0, kira kira hijau tua.
      */
      GreenfootImage latar = new GreenfootImage(20,20);
      latar.setColor(new Color(0, 100, 0));
      latar.fill();
      setBackground(latar);

      /**
      * Membuat dan menambahkan KepalaUlar "utama", Dan menambah makanan masuk kedalam DuniaUlar ini.
      */
      KepalaUlar utama = new KepalaUlar();
      addObject(utama, getWidth()/2, getHeight()/2);
      addObject(new MakananUlar(), Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getWidth()));
      }
      }


      Kelas ini berfungsi untuk membuat Dunia Ularnya dan menambahkan ular kedalamnya.

      GreenfootImage latar = new GreenfootImage(20,20);
      latar.setColor(new Color(0, 100, 0));
      latar.fill();
      setBackground(latar);


      Baris pertama kode ini adalah menciptakan gambar baru berukuran 20px*20px dengan nama "latar".
      "latar" ini di-set warnanya, namun BELUM DIGAMBAR! Bisa diumpamakan warnanya masih berada di kuas. Lalu, barulah kita menolehkan warnanya pada gambar tersebut dengan method fill() (isi).
      Setelah penggambaran gambar "latar", maka tinggal meng-set background DuniaUlar ini dengan gambar latar "latar", yang sudah kita buat tadi.
      Oh iya, kita meng-set warna dengan objek Color pada java.awt.Color, yang sudah kita import di atas.
      Untuk mencari cari warna baru, sebaiknya baca dokumentasi java.awt.Color disini.

      KepalaUlar utama = new KepalaUlar();
      addObject(utama, getWidth()/2, getHeight()/2);
      addObject(new MakananUlar(), Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getWidth()));


      Lalu cuplikan kode ini, pertama kita membuat objek KepalaUlar kedalam variabel "utama", dan menambahkan KepalaUlar"utama" ini kedalam world, pada posisi tengah tengah (setengah dari lebar, setengah dari tinggi DuniaUlar).
      Setelah menambahkan KepalaUlar utama kedalam DuniaUlar, kita menambahkan makanan ular yang langsung dibuat(tanpa membutuhkan variabel) kedalam posisi acak x, dan posisi acak y.
      Seharusnya baris kode ini ditulis setelah kita selesai membuat objek KepalaUlar-nya. Tapi tidak apa apa karena kita sudah tau bakal ada KepalaUlar, heheheh.

      Okeee! kita sudah berhasil menyiapkan tempatnya, mari kita buat ULARNYA!


      Ular.... lar... lar...
      lar lar lar.... -_____-
      Yang pertama harus diketahui tentang ular ini adalah, bahwa sebenernya kita hanya memainkan "kepalanya" saja, sedangkan badannya? hanya mengikuti :D.
      Lalu badannya saya masukan kedalam kelas KepalaUlar sebagai Innerclass agar lebih enak aja :D. Jika class BadanUlar dikeluarkan dari class KepalaUlar tidak akan mempengaruhi apa apa!

      mari kita bahas KepalaUlarnya! (tanpa innerclass BadanUlar!)
      import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
      import java.awt.Point;
      import java.awt.Color;
      import java.util.ArrayList;

      /**
       * Kepala ular, yang mengontrol seluruh gerakan ular.
       * Berwarna merah.
       *
       * @author Keenan M. Gebze
       * @version 1.0
       */
      public class KepalaUlar extends Actor implements BisaDiikuti
      {
          /**
           * Membuat enumerasi arah.
           */
          enum Arah {
              ATAS, BAWAH, KIRI, KANAN;
          }
        
          /**
           * posisiAkhir, menunjukan posisi terakhir dari ular ini.
           * arah, menunjukan arah ular ini.
           * bagianBadan, bagian bagian badan yang akan bertambah bila ular ini makan.
           *
           * kita buat semua variabel disini private (privat) karena
           * variabel ini tidak digunakan oleh kelas lainnya (hanya digunakan oleh kelas ini).
           * hal ini bisa mengurangi penggunaan memori.
           */
          private Point posisiAkhir;
          private Arah arah = Arah.KANAN;
          private ArrayList<BadanUlar> bagianBadan;

          /**
           * Membuat Kepala Ular baru.
           *
           * Membuat gambar ular.
           * Mempersiapkan variabel bagianBadan.
           * Mengawali bagianBadan dengan 6 bagian badan.
           */
          public KepalaUlar() {
              /**
               * Membuat gambar untuk KepalaUlar ini.
               */
              GreenfootImage gambar = new GreenfootImage(20,20);
              gambar.setColor(Color.BLUE);
              gambar.fill();
              setImage(gambar);
            
              /**
               * Membuat list array untuk menunjukan jumlah badan kita.
               */
              bagianBadan = new ArrayList<BadanUlar>();
              bagianBadan.add(new BadanUlar(this));
              for(int i=0; i<=6; i++) {
                  bagianBadan.add((bagianBadan.size() > 0)?new BadanUlar(bagianBadan.get(bagianBadan.size()-1)):new BadanUlar(this));
              }
          }
        
          /**
           * Fungsi ini dipanggil oleh Greenfoot ketika objek KepalaUlar masuk ke World w.
           * Setelah masuk ke World, kita hanya ingin memperbaharui badannya, tergantung dari
           * ArrayList bagianBadan tadi.
           *
           * Fungsi ini hanya dipanggil sekali, yaitu ketika objek ini masuk ke Dunia (World)
           */
          public void addedToWorld(World w) {
              perbaharuiBadan();
          }
            
          /**
           * Fungsi ini dipanggil oleh Greenfoot selalu.
           */
          public void act()
          {
              if(Greenfoot.isKeyDown("up") && arah != Arah.BAWAH) {
                 arah = Arah.ATAS;
              }else if(Greenfoot.isKeyDown("down") && arah != Arah.ATAS) {
                 arah = Arah.BAWAH;
              }else if(Greenfoot.isKeyDown("left") && arah != Arah.KANAN) {
                 arah = Arah.KIRI;
              }else if(Greenfoot.isKeyDown("right") && arah != Arah.KIRI) {
                 arah = Arah.KANAN;
              }
            
              posisiAkhir = new Point(getX(), getY());
            
              switch(arah) {
                  case ATAS: setLocation(getX(), getY()-1); break;
                  case BAWAH: setLocation(getX(), getY()+1); break;
                  case KIRI: setLocation(getX()-1, getY()); break;
                  case KANAN: setLocation(getX()+1, getY()); break;
                  default: arah=Arah.KANAN;
              }
            
              if(getOneObjectAtOffset(0,0, MakananUlar.class) != null) {
                  MakananUlar makanan = (MakananUlar) getOneObjectAtOffset(0,0, MakananUlar.class);
                  makan(makanan);
              }else if(getOneObjectAtOffset(0,0, KepalaUlar.BadanUlar.class) != null) {
                  getWorld().removeObject(this);
              }
          }
        
          public Point posisiAkhir() {
              return posisiAkhir;
          }
        
          public BisaDiikuti yangDiikuti() {
              return null;
          }
        
          /**
           * Makan makanan ular.
           *
           * @param makanan makanan ular yang akan dimakan.
           */
          public void makan(MakananUlar makanan) {
              makanan.dimakan();
              bagianBadan.add(new BadanUlar(bagianBadan.get(bagianBadan.size()-1)));
              perbaharuiBadan();
          }
        
          /**
           * Memperbaharui badan tergantung dari ArrayList<BadanUlar> bagianBadan.
           */
          private void perbaharuiBadan() {
              for(BadanUlar bu : bagianBadan) {
                  getWorld().addObject(bu, ((Actor)bu.yangDiikuti()).getX(), ((Actor)bu.yangDiikuti()).getY());
              }
          }
      }


      Lihat awal classnya.

      public class KepalaUlar extends Actor implements BisaDiikuti{.....

      implements BisaDiikuti menunjukan bahwa class ini bisa Diikuti, dan harus mempunyai fungsi yang ada di interface BisaDiikuti.
      Lalu lihat, ada sesuatu yang baru, Enum type(Tipe Enum), alias enumerasi!

      enum Arah {
              ATAS, BAWAH, KIRI, KANAN;
          }


      Enumerasi memudahkan kita dalam pengkodean. Tanpa enumerasi, kode disini akan lebih kacau dan membuat class KepalaUlar menjadi lebih sulit. Jika ingin belajar tentang enumerasi, silahkan lihat tutorial javanya disini.
      Tapi dengan tutorial ini, semoga cukuplah untuk mengerti apa itu tipe enum dan penggunaannya :-).
      Lihat nih contohnya:

      private Arah arah = Arah.KANAN;

      Jauh lebih mudah bukan? daripada menggunakan seperti ini:

      private static final int ARAH_KANAN = 0;
      private static final int ARAH_KANAN = 1;
      private static final int ARAH_KANAN = 2;
      private static final int ARAH_KANAN = 3;
      private arah = 0; // berarti arah kanan.. 

      Lame.. :D itulah keuntungan dari Enumerasi.

      Wah lihat, ada yang baru lagi.

      private ArrayList<BadanUlar> bagianBadan;
       
      Kode diatas menggunakan apa yang disebut dengan Generics. Anda dapat belajar mengenai Generics disini.
      Maksud dari kode diatas adalah untuk menyiapkan sebuah Array yang semuanya nantinya akan dan hanya akan berisikan objek objek dari tipe BadanUlar. Hampir sama seperti Array biasa, namun keuntungan menggunakan ArrayList adalah daya tampungnya yang bisa berubah ubah.

      BadanUlar[] bagianBadan ={.....} //tidak bisa diubah.

      Jadi itulah mengapa saya menggunakan ArrayList! untuk dokumentasi ArrayList, dapat dilihat disini.

      Lanjuut.

      for(int i=0; i<=6; i++) {
                  bagianBadan.add((bagianBadan.size() > 0)?new BadanUlar(bagianBadan.get(bagianBadan.size()-1)):new BadanUlar(this));
              }for(int i=0; i<=6; i++) {
                  bagianBadan.add((bagianBadan.size() > 0)?new BadanUlar(bagianBadan.get(bagianBadan.size()-1)):new BadanUlar(this));
              }


      Maksud dari kode ini sebenarnya sederhana, cuma memang penulisannya yang agak ribet.
      Maksud dari kode ini adalah untuk membuat KepalaUlar ini agar mempunyai 6 buah BadanUlar pada awal awal ia diciptakan, jadi dia tidak hanya kepala saja.
      Sebenarnya, kode ini berfungsi untuk memasukan objek objek BadanUlar kedalam ArrayList<BadanUlar> yang nantinya akan dimasukan kedalam DuniaUlar.

      Oke, sekarang kita akan belajar mengenai kelas BadanUlar!

      BadanUlar
      Sesuai dengan nama kelasnya, BadanUlar adalah kelas yang digunakan untuk membuat bagian badan dari sesuatu yang diikutinya (alias kelas yang mengimplementasikan BisaDiikuti)
      Berikut ini adalah source code dari kelas BadanUlar (yang berada dalam kelas KepalaUlar):

      /**
      * BadanUlar.
      *
      * Nampaknya lebih bagus kalau dimasukan kedalam kelas KepalaUlar.
      */
      public class BadanUlar extends Actor implements BisaDiikuti{

      private BisaDiikuti bagianUlar;
      private Point posisiAkhir;

      public BadanUlar(BisaDiikuti bagianLainnya) {
      this.bagianUlar = bagianLainnya;
      GreenfootImage gambar = new GreenfootImage(20,20);
      gambar.setColor(Color.BLACK);
      gambar.fill();
      setImage(gambar);
      }

      public void act() {
      posisiAkhir = new Point(getX(), getY());
      setLocation((int)bagianUlar.posisiAkhir().getX(), (int)bagianUlar.posisiAkhir().getY());
      if(((Actor)yangDiikuti()).getWorld() == null) {
      getWorld().removeObject(this);
      }
      }

      public BisaDiikuti yangDiikuti() {
      return bagianUlar;
      }

      public Point posisiAkhir() {
      return posisiAkhir;
      }
      }


      Kelas ini sebenarnya sangat sederhana, kita bahas tiap elemennya

      private BisaDiikuti bagianUlar;
      private Point posisiAkhir;


      field "bagianUlar" mewakili objek yang akan kita ikuti (alias mengimplementasikan interface BisaDiikuti), interface BisaDiikuti, menjamin bahwa objek tersebut bisa diikuti dengan mewajibkan kelas yang mengimplementasikannya agar mempunyai fungsi yang ada dalam interface itu, dalam hal ini adalah fungsi "yangDiikuti()" yang mengembalikan objek BisaDiikuti dari field "bagianUlar".

      public BisaDiikuti yangDiikuti() {
                  return bagianUlar;
      }



      Diatas adalah metode yang wajib kita pergunakan, namun isinya boleh bebas, dalam hal ini, kita hanya mengembalikan / me-return bagianUlar lain yang kita ikuti.

      public Point posisiAkhir() {
                  return posisiAkhir;
              }


      Sedangkan field/variabel "posisiAkhir" mewakili posisi terakhir benda ini, yang nantinya akan diikuti oleh objek yang mengikuti kita. Variabel ini kita return pada fungsi "posisiAkhir()" yang merupakan fungsi yang harus kita tulis (karena mengimplementasikan BisaDiikuti). Objek yang mengikuti kita, dapat menggunakan fungsi ini untuk mendapatkan posisi terakhir kita dan... mengikutinya!
      Sedangkan kelas Point merupakan kelas yang diimport dari java.util.Point. Point sendiri merupakan kelas yang dapat menampung/menunjukan posisi X, dan posisi Y, ya Point memang merupakan kelas yang sederhana, heheheh. Untuk dokumentasi dari kelas Point, anda dapat membacanya disini.

      public BadanUlar(BisaDiikuti bagianLainnya) {
                  this.bagianUlar = bagianLainnya;
                  GreenfootImage gambar = new GreenfootImage(20,20);
                  gambar.setColor(Color.BLACK);
                  gambar.fill();
                  setImage(gambar);
              }


      Ini konstruktor dari kelas BadanUlar, seperti biasa seperti kelas kelas lainnya, kita hanya akan meng-set gambar dari badan ular ini (dengan ukuran 20 x 20, dan berwarna hitam).

      Oke sekarang fungsi act-nya BadanUlar, bagaimanakah badan ular ber-act-si? heheh..

      public void act() {
                  posisiAkhir = new Point(getX(), getY());
                  setLocation((int)bagianUlar.posisiAkhir().getX(),(int)bagianUlar.posisiAkhir().getY());
                  if(((Actor)yangDiikuti()).getWorld() == null) {
                      getWorld().removeObject(this);
                  }
              }

      • Pada baris pertama, kita menampung posisi akhir kita kedalam field "posisiAkhir" yang telah kita buat tadi dengan sebuah objek yang menampung posisi x dan posisi y kita didalam DuniaUlar.
      • Lalu pada baris ke-2, kita memindahkan objek badan ular ini ke posisi akhir bagian ular yang kita ikuti. Kita perlu mengubahnya menjadi int (int, Integer) karena fungsi getX() dan getY() dari kelas Point mengembalikan nilai double(bukan int) tidak seperti getX() dan getY()nya kelas Actor. Kenapa double tidak bisa? karena fungsi "setLocation()" membutuhkan int. "setLocation(int x, int y)".
      • Inti dari baris ke-3 adalah, jika objek yang kita ikuti sudah tidak mempunyai World (DuniaUlar) atau bisa kita baca, objek yang kita ikuti tidak lagi ada di dunia "DuniaUlar"(Sebenarnya World, karena kita memanggil fungsi "getWorld()"). Lalu kita menghapus diri sendiri. Kode ini bisa kita ubah nanti bila kita tidak ingin objek ini menghilang begitu saja. Bisa saja kita tambah suara :D.
      Lihat, sederhana bukan? :D, fungsi act() kelas BadanUlar hanya terdiri dari 3 baris :D.
      Pembahasan kelas sederhana BadanUlar pun sudah selesai. Mari kita bahas yang enak enak.

      MakananUlar.... (kayanya sih ngga enak -__-)
      Kelas ini sangat sederhana, teridiri dari konstruktor yang memberikan warna merah pada gambar, dan sebuah fungsi yang menunjukan bahwa buah ini telah dimakan!

      import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
      import java.awt.Color;

      /**
       * Makanan Ular.
       *
       * @author Keenan M. Gebze
       * @version 1.0
       */
      public class MakananUlar  extends Actor implements BisaDimakan
      {
          /**
           * Membuat makanan ular.
           * Menggabar dan memberi warna merah.
           */
          public MakananUlar() {
              GreenfootImage gambar = new GreenfootImage(20,20);
              gambar.setColor(Color.RED);
              gambar.fill();
              setImage(gambar);
          }
         
          /**
           * Fungsi yang menunjukan bahwa makanan ini sudah dimakan.
           */
          public void dimakan() {
              getWorld().addObject(new MakananUlar(), Greenfoot.getRandomNumber(getWorld().getWidth()),  Greenfoot.getRandomNumber(getWorld().getWidth()));
              getWorld().removeObject(this);
          }
      }


      Fungsi "dimakan()" adalah untuk membuat makanan baru dan melatakannya secara acak, lalu menghapus dirinya sendiri. Fungsi dimakan merupakan fungsi yang wajib dituliskan karena kelas MakananUlar mengimplementasikan interface BisaDimakan. Sebenernya tidak terlalu berguna sih, cuma interface BisaDimakan saya buat agar kita bisa lebih mengenal tentang interface, hehe.

      Para Interface
      Pembahasan kita mengenai kelas kelas utama sudah selesai, mari kita lihat interfacenya! Untuk penjelasan mengenai apa itu interface, silahkan baca disini.

      BisaDiikuti

      import java.awt.Point;
      /**
       * Objek yang menggunakan interface ini berarti bisa di ikuti.
       *
       * @author Keenan M. Gebze
       * @version 1.0
       */
      public interface BisaDiikuti
      {
          Point posisiAkhir();
          BisaDiikuti yangDiikuti();
      }


       BisaDimakan

      /**
       * Objek yang bisa dimakan.
       *
       * @author Keenan M. Gebze
       * @version 1.0
       */
      public interface BisaDimakan
      {
          public void dimakan();
      }


      Kalian bisa liat fungsi dimakan() dipanggil pada saat fungsi makan() pada KepalaUlar dipanggil.

      Selesai!
      Kalian telah belajar untuk membuat game Ular ini disini, untuk download source dan memainkan game ini (lewat applet) silahkan kunjungi website greenfootgallery.org dimana saya mengupload game ini disitu.
      http://www.greenfootgallery.org/



      Keenan Mandela Gebze, 14 Oktober 2010.

      October 11, 2010

      Sebentar Lagi! Membuat Permainan Snake Sederhana

      Ngga lama lagi bakal saya buat tutorialnyaa :D

      Gamenya bisa dilihat disini: http://greenfootgallery.org/scenarios/1942

      Tapi karena melihat desain di atas ularnya terlalu kecil, maka saya gedein dan dijadikan lebih simple


      Tadaa, lebih simple!

      Tutorialnya telah dibuat dan bisa di baca disini!

      April 1, 2009

      Membuat objek muncul secara random dan membuatnya bergerak kedepan

      Ada request nih..
      Hehe, dari quest

      Begini caranya,
      Objek yang kita buat, harus berada dalam subclass Mover.
      lalu, berikut ini kodenya.

      1. Untuk menambahkan Objek dengan Posisi yang acak
      Pada subclassnya World class, di bawah Constructor super(..,..,..);

      super(...,..,..);

      addObject(new Object(...), Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getHeight()));

      Berikut ini penjelasan dari kode tersebut.

      Method addObject(Actor a, int x, int y);
      Adalah method yang digunakan untuk menambahkan suatu Actor kedalam World pada posisi x dan y.

      Method getWidth() pada World adalah method yang mengembalikan lebar World tersebut
      sedangkan getHeight() adalah method yang mereturn tinggi Worldnya

      getRandomNumber(int angka_maksimal)
      yang harus di akses melalui class Greenfoot, adalah method yang mereturn angka acak yang tidak melebihi maksimal

      2. Membuat objek bergerak kearah depan
      ini codenya, dalam Objek tersebut, pada method Act() nya

      move(1);

      method move(int panjang), digunakan untuk membuat objek bergerak kearah tujuannya.


      Tambahan, mungkin anda juga bermaksud membuat objek tersebut dengan direksi yang acak juga. Jika ingin, tambahkan pula kode ini, pada Constructor Objek tersebut.

      public NAMA_OBJEKnya()
      {
      setRotation(Greenfoot.getRandomNumber(360));
      }

      jadi, inilah kodenya

      //misalkan nama objeknya adalah "Mobil"
      public class Mobil()
      {
      public Mobil()
      {
      setRotation(Greenfoot.getRandomNumber(360));
      }

      public void act()
      {
      move(1);
      }
      }

      February 16, 2009

      Menggerakan Mobil Dengan Menggunakan Mouse

      Sekarang saya akan mencampur beberapa Scenario yang telah saya buat menggunakan Greenfoot. Pertama, saya menggunakan Scenario sebelumnya yang digunakan untuk mendeteksi Mouse input (download disini).

      Setelah semuanya siap, copy/paste class Mover dari sini.

      Pertama, saya mengcopy/paste class mover di subclass nya actor.

      public class Mover extends Actor{......

      Kedua, saya membuat subclass dari Mover, yaitu Mobil.

      public class Mobil extends Mover{......

      Setelah itu menambah fungsi/method baru, turnTo(int x, int y) di dalam class Mover.
      Method turnTo(int x, int y) menggunakan Trigonometri.

      public class Mover extends Actor
      {
      ........
      .....
      ....
      public boolean atWorldEdge()
      {
      .......
      }
      /** Ini methodnya **/
      public void turnTo(int x, int y)
      {
      int turnAngle = 0;
      int deltaX = x - this.getX();
      int deltaY = y - this.getY();

      turnAngle = (int) (180 * Math.atan2(deltaY, deltaX) /Math.PI);
      setRotation(turnAngle);
      }

      }

      Keempat, saya memindahkan method act() di subclass nya world, Papan class, Ke act() di Mobil class.

      /** di Mobil.class **/
      public void act(){
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav");
      }
      }

      Membuat Mobil Tertuju ke Arah Klik


      Didalam act() Mobil, kita tambahkan objek bernama MouseInfo, karena kita membutuhkan data tentang posisi klik mouse / tujuan kita.
      objek MouseInfo mengandung data data tentang mouse.
      objek MouseInfo dipanggil menggunakan static method Greenfoot.getMouseInfo()

      public void act()
      {
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav");
      MouseInfo mi = Greenfoot.getMouseInfo();
      }
      }

      Setelah meng "initialize" objek 'mi', kita ambil data data yang ada pada objek tersebut, diantaranya adalah posisi x dan y nya.

      public void act()
      {
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav");
      MouseInfo mi = Greenfoot.getMouseInfo();
      int mx = mi.getX(); // kita ambil posisi x nya
      int my = mi.getY(); // kita ambil posisi y nya
      }
      }

      Setelah mendapatkan data data yang dibutuhkan, mari kita laksanakan method yang kita paste sebelumnya ke class Mover, method turnTo() !

      public void act()
      {
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav");
      MouseInfo mi = Greenfoot.getMouseInfo();
      int mx = mi.getX(); // kita ambil posisi x nya
      int my = mi.getY(); // kita ambil posisi y nya
      turnTo(mx,my);
      }
      }

      Berhasil, kita telah membuat Mobil yang kita buat mengarah ke arah klik!
      Sekarang, langsung saja tambahkan method move agar mobil itu bergerak.

      public void act()
      {
      move(3); // <<<
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav");
      MouseInfo mi = Greenfoot.getMouseInfo();
      int mx = mi.getX(); // kita ambil posisi x nya
      int my = mi.getY(); // kita ambil posisi y nya
      turnTo(mx,my);
      }
      }

      Langkah terakhir! membuat dan memasukan objek Mobil kedalam Papan (subclass nya World)

      public Papan()
      {
      super(400, 200, 1);
      addObject(new Mobil(), Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getHeight()));
      }

      Compile !
      Applet sama sourcenya menyusul! :D

      February 10, 2009

      Mendeteksi Mouse Input

      Kali ini saya ingin membuat game tembak tembakan, tentunya, menggunakan Greenfoot!
      Seperti biasa, semuanya dimulai dengan langkah default.

      1. Membuat Sub Class dari World Class bernama... Papan
      2. Memasukan parameter Constructor World, super(400,200,1);

      Untuk kali ini, hanya itu saja, yap! itu saja.
      Kita akan bermain di Papan.class nya.. tanpa ada objek.

      Pada awalnya, beginilah class Papan tersebut (setelah saya hapus comment commentnya)

      import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

      /**
      * Mendapatkan Input dari Mouse
      *
      * Keenan M
      * 1.0
      */
      public class Papan extends World
      {
      public Papan()
      {
      super(400, 200, 1);
      }
      }

      Sederhana bukan ? :)
      Selanjutnya, saya tambahkan beberapa kode pada act() method.
      Sekedar info, act() method juga ada di World class lhoo.

      import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

      /**
      * Mendapatkan Input dari Mouse
      *
      * Keenan M
      * 1.0
      */
      public class Papan extends World
      {
      public Papan()
      {
      super(400, 200, 1);
      }

      public void act()
      {

      }
      }

      Kerangkanya sudah jadi.
      Sekarang baru kita tambahkan Beberapa method yang di turunkan oleh class Greenfoot.
      Yaitu method, Greenfoot.mouseClicked(Object obj).
      Dimana apabila Objek obj di klik, akan mereturn true.
      Menuliskan null di paramaternya akan mereturn true apapun klik nya.
      Method tersebut me-return, apakah objek ini di klik ? kalau iya return true, kalau tidak return false.
      Jadi, mari kita tambahkan ke kodenya

      import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

      /**
      * Mendapatkan Input dari Mouse
      *
      * Keenan M
      * 1.0
      */
      public class Papan extends World
      {
      public Papan()
      {
      super(400, 200, 1);
      }

      public void act()
      {
      if(Greenfoot.mouseClicked(null))
      {
      Greenfoot.playSound("mouseClick.wav"); // masukan mouseClick.wav di folder sounds, di folder greenfoot kita, bila belum ada, buat baru.
      }
      }
      }

      Compile, Run, maka jadilah scenario baru kita!
      Download Greenfoot source-nya

      January 31, 2009

      Greenfoot versi 1.5.1 sudah di keluarkan

      Greenfoot versi 1.5.1 sudah dikeluarkan.
      Diharapkan semua memakai Greenfoot terbaru.

      Oleh : Poul Henriksen

      Dear Greenfoot Users,

      We have just released Greenfoot version 1.5.1.

      This version fixes a few bugs that were introduced in version 1.5.0:
      - Greenfoot.delay() didn't work when called interactively
      - Some people had problems with World and Actor being striped when
      they shouldn't be. This also meant that the compiler did not catch the
      use of the deleted methods Actor.getWidth() and Actor.getHeight().

      Thanks to everyone that reported these problems.

      We recommend that all Greenfoot users upgrade to this latest version.

      Available from: http://www.greenfoot.org/

      Regards,
      The Greenfoot Team

      Download Greenfoot versi 1.5.1 disini

      January 29, 2009

      Membuat Mobil di Greenfoot !

      Yeah, setelah internet di bayar lagi, semangat langsung membara kembali. Setelah anda di bingungkan dengan dengan "kotak kotak aneh yang saya bilang mobil" disini. Saya akan membuat mobil yang lebih bagus agar anda lebih mengerti tentang pemrogramman Java di Greenfoot!


      Kita mulai..

      Mulai dengan langkah persiapan 'default'..
      -Buat Subclass dari World class, di bagian "super", isi 300,300,1.
      Setelah itu..
      -Buat Subclass dari Actor, beri nama Mover, lalu copy/paste kode berikut ini.
      -Buat Subclass dari Mover, dan beri nama Mobil, serta tambahkan gambar mobil yang horizontal di bagian transport.

      Persiapan selesai, Let's start coding!

      Pertama, kalian harus mengetahui fungsi yang diturunkan oleh class Mover disini.
      Baik, kita bahas dahulu dengan singkat, setuju? :D

      turn() -> Digunakan untuk mengganti arah, berdasarkan arah sebelumnya.
      move() -> Digunakan untuk bergerak, berdasarkan arah, dan kecepatan.
      atWorldEdge() -> Digunakan untuk men-check, apakah objek sudah berada ambang dunia.

      Setelah mengerti, fungsi tersebut, segera kita praktekan, di override method, act()! Pada Class Mobil.

      public void act()
      {
      move();
      }

      Apa yang terjadi pada mobil kita ini !?
      lalu..

      public void act()
      {
      turn(-5);
      }

      Apa yang terjadi !!!!? Aaarrgh ! :D
      lalu lagi...

      public void act()
      {
      turn(-5);
      move();
      }

      :D, lalu, kita tambahkan IF Statement! dan fungsi Greenfoot.isKeyDown(String key)!

      if(Greenfoot.isKeyDown("right"))
      {
      turn(5);
      }else if(Greenfoot.isKeyDown("left"))
      {
      turn(-5);
      }
      if(Greenfoot.isKeyDown("up"))
      {
      move(5);
      }else if(Greenfoot.isKeyDown("down"))
      {
      move(-5);
      }

      "Dan kau telah membuat mobil mu sendiri, hehehe"
      Download Greenfoot source-nya

      January 13, 2009

      Membuat Game Berbasis Java Dengan Greenfoot

      Greenfoot, adalah software yang sangat membatu kita dalam memahami bahasa pemrograman Java. Sangat baik untuk pemula yang masih sangat awam dengan bahasa pemrograman Java.
      Download Greenfoot(1.4.6) disini.

      Sebelumnya, ada baiknya belajar tentang OOP disini.

      ------------------ Membuat game sederhana --------------------
      Bagian 1: Persiapan.
      1. Buka Greenfoot.
      2. Klik Menu Scenario > New > masukan nama > Create.
      3. Klik kanan kotak bertuliskan World > New Subclass > (beri nama dunia) > OK.
      4. Klik kanan kotak bertuliskan Actor > New Subclass > (beri nama objek) > ambil gambar > OK.
      5. Compile, maka anda akan melihat sebuah kotak berwarna putih ditengah tengah.
      6. Klik objek yang baru dibuat, tekan shift, lalu klik di kotak tengah tersebut.
      7. Maka objek tersebut sudah berada di dunia!
      8. Klik reset.

      Bagian 2: Membuat objek bergerak.
      Dengan menggunakan method setLocation() yang diturunkan oleh Actor class.
      1. Klik 2 kali kotak objek (disebelah kanan), untuk membuka class editornya.
      2. Override method act() yang di turunkan Actor class.
      public void act()
      {
      setLocation(getX()-1,getY()-1);
      }

      3. Klik Compile.
      4. Masukan objek ke dunia (dengan cara klik shift tadi).
      5. Klik Run!
      6. Anda akan melihat objek bergerak serong ke atas(y-1) kiri(x-1).

      Bagian 3: Menambahkan objek ke dunia.
      1. Klik 2 kali kotak dunia (disebelah kanan), untuk membuka class editornya.
      2. Tambahkan di constructor kode berikut ini di constructor-nya(dibawah super(..,..,..);)
      addObject(new objek(), 20, 20);

      3. Klik Compile.
      4. Klik Run!

      Download greenfoot source-nya

      January 12, 2009

      Pengertian Object Oriented Programming / OOP

      Menurut id.Wikipedia.org
      Pemrograman berorientasi objek (Inggris: object-oriented programming disingkat OOP) merupakan paradigma pemrograman yang berorientasikan kepada objek. Semua data dan fungsi di dalam paradigma ini dibungkus dalam kelas-kelas atau objek-objek. Bandingkan dengan logika pemrograman terstruktur. Setiap objek dapat menerima pesan, memproses data, dan mengirim pesan ke objek lainnya.

      Menurut pendapat saya, OOP itu adalah membuat Object dalam program. Misalnya, saya tidak mampu membeli mobil, maka saya buat mobil di program komputer tersebut, dalam hal ini saya menggunakan Greenfoot.

      Dalam OOP, blueprint dari object tersebut dinamakan CLASS. Class digunakan agar kita bisa memproduksi secara massal object tersebut.
      Didalam blueprint(class), ada CONSTRUCTOR. Konstruktor digunakan untuk meng-set data data awal yang ada di objek tersebut. Konstruktor digunakan untuk menyiapkan segala sesuatu pada saat objek ini dibuat.
      Didalam blueprint(class), disebutkan berapa panjangnya, tingginya, dsb, dalam FIELDS.
      Didalam blueprint(class) juga, disebutkan fungsi fungsi dari mobil tersebut, seperti misalkan classnya merupakan kelas yang membuat Mobil, belok kiri, belok kanan, maju, mundur, didalam METHOD/fungsi-nya.

      Sudah mengerti? Ini blueprints mobil tersebut.
      public class mobil
      {
      /** Ini Fieldsnya (Deklarasi Variabel)*/
      Color warna; // warna mobilnya
      int panjang; //panjang mobilnya
      int lebar; // lebar mobilnya
      /** Fields selesai */

      /** Constructor nya */
      public mobil(Color w, int p, int l)
      {
           warna = w; /** di set supaya warna ini */
           panjang = p; /** di set supaya panjangnya segini... */
           lebar = l; /** di set supaya lebarnya seginii.... */
           visualisasikan(); // di display, supaya kelihatan
      }
      /** Constructor selesai */

      /** Fungsinya/metode(method) */
      private void visualisasikan() // private artinya supaya gak di akses objek lain
      {
           // yang berhubungan dengan grafis disini
      }
      public void belok_kanan() // void tidak mereturn apa apa
      {
           // berhubungan dengan posisi
      }
      public void belok_kiri()
      {
           // berhubungan dengan posisi
      }
      //dsb..
      /** Fungsi Selesai */
      }

      Setelah selesai membuat blueprint nya, baru kita bisa membuat objeknya. Dengan cara :
      Menggunakan Main class :
      public static void main(String[] args)
      {
      mobil honda = new mobil(new Color(220,220,220), 100, 30);
      mobil toyota = new mobil(new Color(220,120,120), 100, 40);
      }

      Menggunakan World di Greenfoot (di constructor nya):
      mobil honda = new mobil(new Color(220,220,220), 100, 30);
      mobil toyota = new mobil(new Color(220,120,120), 100, 40);


      Download greenfoot source-nya

      Bagi yang masih belum mengerti, silahkan tanya di komentarnya yaa.