Pages

Showing posts with label Java. Show all posts
Showing posts with label Java. 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


November 2, 2014

MathQuiz: A little experiment using embedded Derby database.

Ok, so I've decided to write down my blog in English language to make my writings more available to the wide audiences of the Internet. This post will be my first attempt to write a post in English and also my first attempt to utilize (embedded) Apache Derby technology in my Java code. All of the resoure(s) I've put on this post are available for download below this post.

Introducing MathQuiz
MathQuiz is a very thin, Java (using JDBC) game that utilize embedded Derby database to save the player's score. It consist of only 1 source (java) file, and can only be played in command prompt interface.

The game (or should I say, quizzes?) is very straight forward: you run it, answer ten (10) mathematical problems: each will give you 1 point if answered correctly, and then save the score with your name in the database. You can download the game and the sourcecode using the link provided below this post.

The database and its table are pre-created using the ij tools from the Apache Derby distribution. The one and only table 'scores' consist of two columns, labelled username and score.
Below, using the ij tools, you can see me connecting to the database and retrieve all of the rows from the table 'scores'.


This game is part of my learning process: Learning JDBC, Apache Derby, Ant, SQL, and other usefull (database) technology, I plan to integrate it into the eBookManager project I've reviewed in this blog. As student in Department of Geography who learn GIS and stuff's, its even become more important.

Sourcecode: https://drive.google.com/file/d/0B27ziWaCDimLdnN1eXFlbVlCMEU/view?usp=sharing

September 11, 2014

Open Source Project: eKitaab EBook Manager


Halo setelah lama tidak lagi menulis akhirnya ini tulisan perdana saya di blog tahun ini..

Sekarang penulis ingin memperkenalkan sebuah software opensource bernama eKitaab yang dirilis dengan lisensi publik GNU oleh Balaji Srinivasan tahun 2007. Sebuah software manajemen ebook yang sangat berguna bagi kita-kita yang masih menjadi mahasiswa, yang sayangnya, perkembangan nya sudah lama terhenti. Meski demikian, versi “terbaru” software ini, versi 0.6 (2007) masih dapat didapatkan distribusinya di http://ebookmanager.sourceforge.net/ . Penulis ingin menyampaikan ketertarikan penulis pada software ini, kekuatan dan kelebihan software ini, serta sedikit perubahan yang telah penulis buat terhadap software ini, yang source code nya bisa kalian dapatkan di bagian bawah tulisan ini.

Ada beberapa hal yang membuat penulis tertarik pada software ini, antara lain: berguna bagi penulis yang masih mahasiswa, dan opensource, sehingga bisa dimodifikasi sesuai kebutuhan serta dapat dijadikan bahan pembelajaran sebagai developer. Untuk alasan yang pertama, penulis memang dari dahulu mencari software manajemen softcopy materi-materi perkuliahan. Manajemen file materi perkuliahan secara konvensional/manual seperti menyusunan struktur folder/direktori sesuai mata kuliah dari seabrek file materi dirasa masih belum cukup, masih banyak masalah yang melanda seperti: file yang susah dicari, bingung menempatkan file, file ganda, dan lain sebagainya. Dari kesulitan penulis sebagai mahasiswa di atas, penulis mulai, ketemulah software ini yang paling mendekati kebutuhan penulis. Mendekati loh ya...

Masuklah alasan kedua yang membuat penulis tertarik: karena software ini opensource, murni Java dimana penulis memiliki kemampuan dasar didalamnya, serta dikembangkan dalam IDE Netbeans, memudahkan software ini untuk diutak-atik sesuai dengan kebutuhan penulis. Yang tidak kalah penting, software ini bisa dijadikan sebagai alat pembelajaran serta latihan agar menjadi developer handal.
 
...#ehem...
 
Sedikit flashback, sebelum menemukan software ini, sempat terlintas dalam benak (naif) penulis untuk membuat software sendiri starting from scratch, namun penulis mengurungkan niat tersebut karena pastinya akan memakan banyak waktu. Yasudah, karenanya penulis putuskan untuk mengembangkan software punya Pak Balaji yang sudah ada ini saja. Dan ini merupakan software opensource pertama yang penulis modifikasi!
 
Keunggulan dan kelemahan
 
Penulis merasa tidak ada keunggulan yang bisa ditonjolkan dalam kesederhanaan software ini selain potensinya untuk dikembangkan lebih jauh lagi, paling tidak software ini bisa berguna bagi kalangan mahasiswa, atau kalangan developer muda yang ingin belajar menjadi developer. Itu saja cukup bagi penulis yang menilai software ini sebagai pengguna dan (calon) pengembangnya.
Ada yang unik dari software ini dalam menyimpan keterangan mengenai ebook-ebooknya: software, ini menyimpan informasi mengenai buku pada nama file, informasi tersebut tidak dipisahkan dalam sebuah database tersendiri. Hal ini menjadikan penyimpanan data menjadi praktis, namun terbatas, sehingga penulis tidak memasukannya sebagai keunggulan.
 
Kemudian, sebagai proyek yang sudah terhenti sejak tahun 2007; software ini memiliki banyak kelemahan, antara lain: berbagai fitur kurang update sehingga tidak bisa digunakan, dokumentasi buruk, dan teknis kodingannya, dari desain sampai implementasi juga tidak begitu baik.
 
Sebagai contoh, dalam software ini ada sebuah fitur untuk secara otomatis mendapatkan informasi mengenai ebook yang kita punya dari jasa penyedia informasi buku seperti Amazon. Sama seperti Windows Media Player lah, yang secara otomatis mendownload informasi mengenai album/lagu yang sedang kita putar. Software ini sepertinya terhubung pada server Amazon untuk mengambil informasi mengenai bukunya. Namun sekarang fitur tersebut sudah tidak bisa digunakan, mungkin karena ada perubahan pada servernya, atau memang karena belum diatur konfigurasinya oleh penulis.
 
Selanjutnya untuk dokumentasi kode, penulis merasa gregetan saat pertama kali membuka source code software ini dalam IDE Netbeans, dikarenakan sedikitnya komentar serta dokumentasi di dalamnya. Komentar yang dibuat sepertinya bukan untuk developer lain (dari luar), hanya untuk kalangan sendiri. Dokumentasi yang kurang ditambah pengalaman serta pengetahuan penulis yang masih sedikit, menyebabkan usaha untuk mempelajari dan mengerti kode ini membutuhkan waktu yang cukup lama: total kira-kira 3 jam, dalam 3 hari, karena jika penulis lelah membaca kodenya, penulis suka ketiduran...
 
Sedangkan untuk kekurangan dari segi desain dan implementasi, penulis tidak akan berkomentar banyak karena belum mengerti banyak (mengenai program ini sendiri maupun ilmu design pattern), namun satu yang penulis yakin, program ini masih bisa disederhanakan lagi dari kedua segi tersebut.
 
Modifikasi pada kode
 
Sebelum membuat modifikasi terhadap software ini, tentu sebelumnya kita harus memahami dulu cara kerja software ini. Secara ringkas, software ini bertujuan untuk menampilkan keterangan/informasi mengenai ebook ke dalam tabel pada tampilan utamanya. Sekali lagi penulis ingatkan, source code bisa kalian dapatkan dibawah tulisan ini.


Gambar 1 Tampilan utama eKitaab Ebook Manager dalam Ubuntu. 

Format ebook yang didukung (untuk ditampilkan dalam tabel) software ini bermacam, ada 8, tetapi yang penulis butuhkan untuk materi kuliah hanyalah yang berformat PDF, sehingga penulis putuskan untuk mengubah sedikit kode software ini.


Gambar 2 Bagian implementasi verifikasi file dalam MainFrame.java . Penulis komentari format selain pdf dan chm.


 Gambar 3 Bagian yang memanggil fungsi verifikasi di atas, dalam BookTableDataModel.java.

Tanpa mau terkesan teknis, sedikit detail dari cara kerja di atas: Pada dasarnya semua data dan informasi yang ditampilkan dalam tabel (instansi dari JTable) ini di-handle oleh sebuah data model, yang dalam Java merupakan instansi dan implementasi dari AbstractDataModel. Pada software ini, yang digunakan adalah subclass dari AbstractDataModel, yaitu kelas BookTableDataModel. Kelas BookTableDataModel inilah yang berfungsi untuk membaca dan mengambil informasi dalam file di harddisk, memasukannya ke dalam data model, untuk kemudian ditampilkan ke dalam tabel. Tetapi sebelum memasukan informasi mengenai file ke dalam data model, ia melakukan sedikit verifikasi terhadap extensi/format file yang terbaca, memastikan hanya file ebook yang dimasukan ke dalam data model.

Nah, dengan sedikit mengubah kode dalam bagian verifikasi tersebut, penulis dapat mengatur, tipe/format file apa yang akan dimasukan ke dalam data model, untuk kemudian ditampilkan di tabel. 

Sederhana, namun seperti yang penulis katakan sebelumnya: dokumentasi yang kurang ditambah pengalaman serta pengetahuan penulis yang masih sedikit membuat mengubah kode ini—mengembangkan software ini makan waktu.

***
Kembali lagi pada penulis, penulis memutuskan menggunakan software ini karena sesuai dengan kebutuhan penulis sebagai mahasiswa dan sebagai bahan pembelajaran pemrograman serta pengembangan software Java.
Tentu banyak lagi software manajemen ebook lainnya, jika kalian punya contoh yang opensource silahkan komentar disini dan bahas apa keunggulannya, bandingkan dengan software ini. Jika ada kritik dan saran silahkan dikomentari. Jika setelah membaca artikel ini kalian berminat untuk mengembangkan software ini lebih jauh, ingin menambahkan fitur-fitur baru, ingin membuat dokumentasi, dan sebagainya, please let me know, silahkan dikomentari.




*Jika ingin mempelajari lebih lanjut mengenai hubungan antara JTable, AbstractDataModel, dan data serta cara mengolahnya bisa baca disini: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

**Bagi yang mau lihat mendownload source codenya yang sudah penulis modifikasi: https://drive.google.com/file/d/0B27ziWaCDimLM3dsMmVsbkc2VU0/edit?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

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!)

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