BAB I
PENDAHULUAN
1.1 Latar Belakang Masalah
Telepon selular dan internet adalah dua fenomena yang paling menarik menjelang akhir abad lalu. Fenomena yang dimulai pada tahun 1990-an itu banyak merevolusi gaya hidup dan cara berbisnis. Apalagi perkawinan dari kedua teknologi itu telah melahirkan mobile internet, yang lagi- lagi melahirkan the way of living. Kini pengguna telepon selular bukan hanya berasal dari kalangan atas saja, melainkan dari semua kalangan masyarakat, dengan beragam usia. Telepon selular yang pada awalnya hanya diperuntukan untuk melakukan hubungan percakapan, ataupun mengirim pesan melalui SMS, seiring perkembangan teknologi, kini telepon selular telah berkembang menjadi sebuah alat yang memiliki berbagai fitur dan fasilitas menarik, seperti aplikasi agenda, games, multimedia yang kaya akan grafik, teks, dan sound, hingga fasilitas yang memungkinkan koneksi secara wireless ke internet. Perkembangan dan peningkatan teknologi telepon selular yang terbilang sangat cepat, memunculkan banyaknya persaingan antar produsen telepon selular, sehingga harga telepon selular semakin murah dan menjadikan alat ini sebagai barang konsumsi masyarakat. Dengan banyaknya tawaran kemudahan dan keuntungan
penggunaan alat ini, menyebabkan banyak orang yang tertarik untuk memilikinya, dan produsen telepon selular pun berlomba untuk melakukan inovasi, hingga lahirlah teknologi pemrograman yang memungkinkan telepon selular dapat menambah aplikasi diluar aplikasi standarnya. Dengan hadirnya teknologi J2ME yang menjadi tulang punggung dalam perkembangan aplikasi telepon selular, yang dapat dijalankan secara standalone atau client-server based, telah menjawab tantangan perkembangan telepon selular. Saat ini seluruh produsen telepon selular besar di dunia telah memproduksi Java Technologyenabled mobile phones. Fakta membuktikan bahwa per bulan Mei 2003 kurang lebih telah diproduksi 94 juta mobile handset Java enabled di dunia ini yang diproduksi oleh kurang lebih 20 produsen atau ma nufaktur (dalam 150 model) seperti Nokia, Siemens, Sony Ericsson, Samsung, Motorola, dan lainnya dengan harga yang kian hari kian murah saja.
Diantara sekian banyak aplikasi yang terdapat pada telepon selular, game merupakan hal yang tak terpisahkan dengan telepon selular. Setiap telepon selular pasti menyertakan aplikasi ini pada aplikasi standarnya, dan perkembangannya pun sangat menarik. Kini game pada telepon selular kaya akan grafik dan sound, sehingga dapat menjadi teman yang menarik diwaktu senggang. Pada kesempatan ini, penulis ingin memanfaatkan media telepon selular untuk membuat sebuah aplikasi game dengan menggunakan J2ME, dimana diharapkan aplikasi game ini dapat menjadi sebuah hiburan yang menarik untuk menghilangkan kebosanan di waktu senggang.
1.2 Rumusan Masalah
Pada penelitian ini penulis merumuskan masalah yakni bagaimana membangun sebuah aplikasi permainan yang utuh, menarik dan mampu diaplikasikan pada ponsel, tanpa mengesampingkan fungsi, nilai keindahan dan interaktifitas aplikasi yang dibuat.
1.3 Batasan Masalah
Karena adanya keterbatasan waktu dalam penyusunan penulisan ini, maka untuk mempersempit masalah yang akan dibahas, penulis membuat beberapa batasan masalah. Aplikasi yang dibuat merupakan aplikasi permainan yang berdiri sendiri (stand alone), dan hanya dapat dimainkan oleh satu orang (single player). Aplikasi tersebut dibuat hanya menggunakan J2ME dan tidak membahas bahasa pemrograman lain, termasuk dua buah teknologi Java lainnya, yaitu J2SE dan J2EE. Pada tahap pembuatannya, pembahasan hanya dibatasi pada pembuatan program, dan tidak dibahas tentang perangkat lunak/ keras yang digunakan, cara penginstalan, cara melakukan kompilasi dan lainnya. Penulisan tidak membahas tentang cara penginstalan aplikasi yang telah jadi kedalam ponsel, termasuk cara download/upload aplikasi melalui jaringan/ komunikasi wireless dan karena adanya perbedaan spesifikasi yang dimiliki oleh beraneka ragam telepon selular, maka aplikasi dibuat berdasarkan sebuah platform, yaitu Nokia seri 3510i, sehingga hanya dapat dijalankan pada telepon selular tersebut.
1.4 Tujuan Penulisan
Tujuan dari penulisan ini adalah membangun aplikasi permainan yang mampu dijalankan pada ponsel. Aplikasi permainan yang diberi nama Diamond Puzzle ini diharapkan mampu memenuhi fungsinya sebagai sebuah permainan yang utuh, layak dimainkan, dan menarik minat penggunanya.
1.6 Sistematika Penulisan
Penulisan ilmiah ini dibagi kedalam empat bab yaitu :
Bab I Pendahuluan
Bab ini menguraikan tentang latar belakang masalah yang mendasari pembuatan penulisan, dengan disertai batasan masalah penulisan, tujuan penulisan, metode penelitian, serta sistematika penulisannya.
Bab II Landasan teori
Bab ini menjelaskan tentang hal yang mendukung/ berhubungan dengan penulisan, yang antara lain penjelasan tentang interaksi manusia dan komputer (IMK), bahasa pemrograman OOP, struktur bahasa Java, serta penjelasan singkat tentang perkembangan teknologi J2ME.
Bab III Pembahasan Masalah
Bab ini menguraikan tahap pembuatan aplikasi permainan Diamond Puzzle, dimulai dari tahap perancangan hingga pengujian aplikasi permainan.
Bab IV Penutup
Bab ini berisi kesimpulan dari seluruh bahasan pada penulisan ilmiah ini, disertai dengan saran dan harapan ya ng ditujukan kepada semua pihak yang tertarik kepada penulisan ini.
BAB II
LANDASAN TEORI
Pada bab ini penulis mencoba mengemukakan beberapa teori sebagai dasar penulisan. Namun teori tersebut tidak dijelaskan secara keseluruhan, melainkan hanya beberapa bagian tertentu yang memiliki kaitan, serta mendukung dalam pelaksanaan pembuatan penulisan.
2.1 Pemrograman Berorientasi Obyek
Pemrograman berorientasi objek adalah gaya pemrograman yang memodelkan masalah menjadi objek terpisah dan berdiri sendiri. Pemrogram yang menggunakan teknik ini akan sangat terbiasa membuat kelas objek yang dapat mewakili elemen programnya. Pemrograman berorientasi objek mempunyai beberapa ciri khusus dibandingkan dengan metode pemrograman lain. Pemrograman berorientasi objek selalu menggunakan kelas untuk mengenkapsulasi (membungkus) aksi yang ada dalam suatu komponen. Aksi ini juga termasuk atribut data dan method. Objek dalam kategori pemrograman ini mempunyai kemampuan untuk menyembunyikan bagian implementasi mereka dari objek lainnya. Prinsip seperti ini disebut sebagai “penyembunyian informasi/ information hiding”. Beberapa objek memang mungkin dapat berkomunikasi dengan menggunakan metode tertentu yang ditentukan/ didefinisikan oleh pemrogram. Tetapi pada kondisi normal, objek ini akan menyembunyikan aksi dan atribut apa saja yang ada dalam strukturnya.
2.1.1 Inheritance (Pewarisan Sifat)
Apabila terdapat suatu kelas tertentu dimana kelas tersebut mempunyai atribut tertentu, maka atribut tersebut akan diturunkan kepada subkelas dibawahnya, atau dengan kata lain pewarisan sifat adalah kemampuan obyek untuk membawa fungsionalitas dari obyek yang lain dalam hal ini superkelasnya. Seorang pemrogram kadang memerlukan kelas yang berbeda dengan yang telah ada karena perlu mengubah metode yang telah disediakan. Pemrogram dapat mengubahnya dengan mudah cukup dengan memodifikasi kode aslinya, kecuali bila pemrogram ingin menggunakan keduanya dalam kondisi tertentu maka pemrogram tentu akan memisahkan hasil modifikasinya. Salah satu penyelesaiannya adalah dengan membuat kopi dari tipe aslinya, modifikasi kodenya untuk dapat mendukung program yang dibuatnya, dan memberi kelas tersebut nama baru. Hal tersebut dapat berhasil namun juga menambahkan masalah. Kode yang telah diduplikasi tersebut akan menduplikasi pula bug yang mungkin ada. Oleh karena itu pewarisan akan sangat diperlukan karena memungkinkan pemrogram untuk mendefinisikan kelas langsung dari kelas yang sudah ada.
2.1.2 Polimorfisme
Polimorfisme adalah kemampuan dari obyek turunan untuk mendefinisikan ulang suatu fungsi yang ada pada superkelas-nya. Hal tersebut bertujuan untuk menyesuaikan dengan kebutuhan obyek turunan tersebut. Misalkan terdapat suatu kelas kendaraan yang terdiri dari pesawat, mobil, motor, dan sepeda. Setiap dari kelas turunan dari kelas kendaraan tersebut dapat melaksanakan fungsinya sebagai alat pengangkut, walaupun dengan cara yang berbeda.
2.1.3 Enkapsulasi
Enkapsulasi adalah suatu metode untuk menyatukan antara data dengan fungsi. Fungsi yang ada digunakan untuk memanipulasi data tersebut. Dengan demikian suatu operasi hanya dapat dilakukan pada obyek yang bersangkutan, sehingga pemrogram dapat membagi sistem menjadi komponen dengan antarmuka yang minim. Salah satu ide utama dari enkapsulasi adalah untuk menghindari banyaknya variabel global yang digunakan oleh program. Sebuah variabel global dapat diakses oleh setiap bagian dari program tersebut. Oleh karena itu, perubahan yang terjadi di dalamnya akan mempengaruhi keseluruhan program. Sedangkan jika perubahan terjadi pada sebuah field pada sebuah kelas, yang perlu dilakukan hanyalah mengubah kode dari beberapa metode dari kelas tersebut saja.
2.2 Flow Chart
Diagram alur dapat menunjukan secara jelas alur pengendalian algoritma, yakni bagaimana rangkaian pelaksanaan kegiatan. Suatu diagram alur memberikan gambaran dua dimensi berupa simbol grafis. Setiap simbol telah ditetapkan terlebih dahulu fungsi dan artinya. Mereka dipakai untuk menunjukkan berbagai kegiatan operasi dan jalur pengendalian.
2.3 Bahasa Pemrograman Java
Java merupakan bahasa pemrograman berorientasi objek yang mendapatkan perhatian yang cukup luas dari dunia industri maupun akademis. Java dikembangkan oleh ‘James Gosling’ beserta tim di Sun Microsystems, California. Bahasa ini berbasis pada C dan C++, dan pada awalnya ditujukan untuk penulisan program yang mengontrol peralatan konsumen, seperti toaster, oven microwave, dan lainnya. Penulis Java mempergunakan pendekatan minimal, dimana mereka hanya memasukkan fungsi yang mutlak dan mengeliminasi fungsi yang berlebihan atau redundant. Pendekatan ini menyebabkan Java merupakan bahasa yang lebih mudah dipelajari daripada bahasa pemrograman berorientasi objek lainnya.
2.3.1 Pengaruh Kertas Putih
Penulis Java menulis pengaruh “kertas putih” yang menjelaskan tujuan rancangan dan keunggulannya yang disusun menjadi 11 kriteria yang dijabarkan sebagai berikut :
1. Sederhana (Simple)
Untuk menghasilkan system yang mudah dipahami, bahasa Java dirancang tidak berbeda jauh dengan C++. Syntax untuk Java seperti syntax pada C++, tetapi syntax Java tidak memerlukan header file, pointer arithmatic (atau bahkan pointer syntax), struktur, union, operator overloading, class virtual base dan lainnya.
2. Berorientasi Objek (Object Oriented)
Bahasa Java memusatkan rancangan pada objek dan interface. [3]. Cornell, Gary, and Horstmann, Cay S., Core Java, ANDI OFFSET, Yogyakarta, 1997, h. 3. [4]. Firrar Utdirartatmo, Aplikasi Database di Java dengan Jbuilder, PT Elex Media Komputindo, Jakarta, 2003, h. 2-5.
3. Terdistribusi (Distributed)
Java memiliki library rutin yang cukup luas untuk dirangkaikan pada protokol TCP/IP seperti HTTP dan FTP dengan mudah. Aplikasi Java dapat membuka dan mengakses objek untuk segala macam Net melalui URL, sama mudahnya seperti yang biasa dilakukan seorang programmer ketika mengakses file system secara lokal.
4. Kuat (Robust)
Java dimaksudkan untuk membuat suatu program yang dapat dipercaya dalam berbagai hal. Java banyak menekankan pada pengecekan awal untuk kemungkinan terjadinya masalah, pengecekan pada saat runtime, dan mengurangi kemungkinan timbulnya masalah (error). Perbedaan utama antara Java dan C++ adalah bahwa Java memiliki sebuah model pointer yang dapat mengurangi kemungkinan penimpaan (overwriting) pada memory dan terjadinya kerusakan data.
5. Aman (Secure)
Java dimaksudkan untuk digunakan pada jaringan atau lingkungan terdistribusi, sehingga penekanan utamanya dit ujukan pada masalah keamanan. Java memungkinkan penyusunan program yang bebas virus dan system yang bebas dari kerusakan.
6. Netral Arsitektur (Architecture Neutral)
Compiler membangkitkan sebuah format file dengan objek arsitektur saraf, dimana program yang di-complie dapat dijalankan pada banyak prosesor. Compiler Java melakukannya dengan membangkitkan instruksi bytecode yang tidak dapat dilakukan oleh arsitektur komputer tertentu. Bahasa Java juga dirancang untuk mempermudah penerjemahan pada banyak komputer dengan mudah dan diterjemahkan kembali pada komputer asal pada saat run-time.
7. Portable
Pada Java tidak terdapat ketergantungan pada saat implementasi (implement dependent). Pustaka (library) merupakan bagian dari system yang mendefinisikan interface yang portable, misalnya, ada class window abstrak yang diimplementasikan pada system operasi Unix, Windows dan Macintosh.
8. Interpreter
Interpreter pada Java dapat mengeksekusi bytecode Java secara langsung pada komputer yang memiliki interpreter, dan karena proses linking dalam Java merupakan proses yang kenaikannya tahap demi tahap dan berbobot ringan, maka proses pengembangannya dapat menjadi lebih cepat dan masih dalam penelitian.
9. Kinerja Tinggi (High Performance)
Meskipun kinerja bytecode yang diinterpretasi biasanya lebih memadai, tetapi masih terdapat situasi yang memerlukan kinerja yang lebih tinggi. Bytecode dapat diterjemahkan (pada saat run-time) kedalam kode mesin untuk CPU tertentu dimana aplikasi sedang berjalan.
10. Multithreaded
Java memiliki kemampuan untuk melakukan lebih dari satu pekerjaan sekaligus. Keuntungan dari multithreading adalah sifat respon yang lebih interaktif dan real-time.
11. Dinamis
Dalam sejumlah hal, Java merupakan bahasa yang lebih dinamis dibanding bahasa C atau C++. Java dirancang untuk beradaptasi dengan lingkungan yang terus berkembang. Library dapat dengan mudah menambah metode dan variabel yang baru tanpa banyak mempengaruhi client. Informasi tipe run-time dalam Java adalah langsung (straight forward).
2.3.2 Variabel pada Java
Sebuah variabel mempunyai tiga buah properti :
1. Lokasi memory untuk menyimpan nilai.
2. Tipe data yang disimpan.
3. Nama yang digunakan.
Pendeklarasian variabel dalam bahasa Java memiliki bentuk :
<data type> <variables>;
Jika terdapat urutan variabel dengan tipe data yang sama, maka penulisannya dapat disusun dalam satu baris dengan dipisahkan dengan koma, dan setiap variabel yang digunakan harus dideklarasikan.
2.3.3 Tipe Data pada Java
Java merupakan bahasa yang ‘strongly typed language’, yang artinya setiap variabel harus memiliki tipe data. Terdapat delapan tipe data primitif, dimana enam diantaranya adalah tipe bilangan (empat tipe integer dan dua tipe floating pint), satu tipe karakter dan satu tipe Boolean.
1. Integer
Digunakan untuk bilangan bulat (yang tidak memiliki fractional) dan nilai negatif
diperbolehkan.
Tipe Tempat yang dibutuhkan
byte 1 byte
short 2 byte
int 4 byte
long 8 byte
2. Floating Point
Digunakan untuk bilangan dengan pecahan.
Tipe Tempat yang dibutuhkan
float 4 byte (7 desimal signifikan)
double 8 byte (15 desimal signifikan)
3. Karakter
Tipe ini menggunakan tanda kutip tunggal untuk menyatakan suatu karakter. Tipe
karakter menyatakan karakter dalam upaya untuk meng-encode unicode.
4. Boolean
Tipe ini hanya diperbolehkan memiliki nilai diantara dua nilai yaitu true atau
false. Tipe ini dipergunakan untuk logical testing dengan menggunakan operator
relasional.
2.3.4 Package
Package adalah container class yang digunakan untuk menjaga ruang nama class tetap terbagi karena setiap identifier yang digunakan untuk menghasilkan class contoh diambil dari ruang yang sama. Package juga merupakan mekanisme penamaan dan mekanisme pembatasan visibilitas, dimana kita dapat meletakkan class didalam package sehingga dunia luar package yang kita buat tidak tahu apa yang ada didalamnya.
2.3.4.1 Perintah Package
Perintah package memberitahukan compiler tentang definisi package class didalamnya, juga mendefinisikan sejumlah pembagian ruang nama tempat class disimpan. Jika pernyataan package ini dilewat, maka class dianggap berada dalam package default yang tidak mempunyai nama. Bentuk umum perintah package adalah sebagai berikut package pkg1[.pkg2[.pkg3]];
2.3.4.2 Perintah Import
Sebelum definisi class dalam program sumber (source code) java, dapat diletakan daftar perintah import untuk mengikutsertakan package yang terdapat diluar program sumber. Semua class penting disimpan dalam sejumlah package dengan nama tertentu sehingga memudahkan para programmer untuk mengambil class tertentu, atau keseluruhan package untuk visibilitas langsung. Bentuk umum perintah import adalah sebagai berikut:
import package1[.package2].(class-name*);
2.3.5 Proteksi Akses
Java menyediakan banyak tingkatan proteksi untuk memungkinkan pengaturan yang baik terhadap tingkat visibilitas variabel dan metode. Class dan package adalah dua cara untuk meng-enkapsulasi dan mengisi ruang nama dan cakupan variabel dan metode, karena class adalah satuan abstraksi terkecil dalam Java. Dengan adanya package, Java harus menyatakan empat tingkat visibilitas antar unsur class, dimana dapat digambarkan sebagai berikut :
Tabel 2.4 Tingkat Visibilitas Unsur Class
public private
private
protected
protected
class yang sama v v v v
subclass dalam
package yang sama
v X v v
non-subclass dalam
package yang sama
v X X v
subclass dalam
package berbeda
v X v v
non-subclass dalam
package berbeda
v X X X
2.3.6 Interface
Interface (antar muka) adalah spesifikasi eksplisit suatu kumpulan metode, yang dapat diimplementasikan class tanpa implementasi sesungguhnya yang berhubungan dengan spesifikasi tersebut.
2.3.6.1 Perintah Interface
Interface didefinisikan seperti class, tetapi tanpa mendeklarasikan data variabel maupun konstruktor apapun. Bentuk umum perintah interface adalah sebagai berikut :
interface interface-name {
return-type method-name (parameter-list);
type final-variable-name = value;
}
2.3.6.2 Perintah Implements
Jika suatu class mengimplementasikan lebih dari satu interface, maka interface yang diimplementasikan dapat dituliskan dalam satu baris dengan dipisahkan tanda koma. Bentuk umum perintah import adalah sebagai berikut :
class class-name [extends superclass]
[implements interface1[, interface2 …]]
{ body-class;
}
2.3.7 Thread
Program individual memiliki kemampuan menjalankan komputasi pada waktu yang sama. Setiap unit komputasi disebut thread. Pada Java, sebuah program mampu menjalankan lebih dari satu thread pada waktu yang sama, atau dikenal dengan istilah multithreading. Setiap thread seperti berjalan dalam konteks terpisah. Konteks membuat setiap thread seolah memiliki CPU sendiri, dengan register, memory dan kode programnya sendiri. Ada empat macam status pada thread, yaitu new, runnable, blocked dan dead. dirancang agar dapat dijalankan di perangkat komputer dengan kemampuan kecil seperti Handphone, PDA, Palm, dan lainnya.
Berbagai platform Java Technology dengan J2ME didalamnya
Teknologi J2ME merupakan teknologi yang relatif baru dibandingkan platform Java lainnya (Java 2 Enterprise Edition/ J2EE dan Java 2 Standard Edition/J2SE), yang diluncurkan pada tahun 2001 oleh para engineer dari markas Java Technology, Sun Microsystem. [5]. J2ME Indonesia Community, http://faisalwiryasantika.tripod.com/index. htm, 2003, h. 1.
Teknologi J2ME ditujukan untuk cakupan user yang luas sekali, mulai dari handphone hingga set-top-box yang powerful, seperti halnya sebuah komputer (PC) yang dilengkapi dengan J2SE atau J2EE. J2ME memiliki beberapa keunggulan yaitu :
1. Sebagaimana kekhasan aplikasi yang ditulis dengan bahasa pemrograman Java,
maka aplikasi J2ME memiliki ciri running any where, any time, over any device.
2. Aplikasi dapat dijalankan secara on-line maupun off-line.
3. Memiliki kode yang portable.
4. Safe network delivery.
5. Aplikasi yang ditulis dengan J2ME akan memiliki kompatibilitas yang tinggi
dengan platform J2SE dan J2EE.
2.4.1 J2ME Configuration Dan Profile
Dalam J2ME dibagi menjadi dua bagian besar yang dikenal sebagai configuration dan profile. Dua istilah ini sangatlah penting dalam pengembangan aplikasi wireless dengan Java. J2ME configuration mendefinisikan lingkungan kerja J2ME runtime. Oleh karena handheld devices memiliki fitur yang berbeda, J2ME configuration dirancang untuk menyediakan library standar yang mengimplementasikan fitur standar dari handheld devices.
Tabel 2.5 Tabel perbandingan CLDC dan CDC
CLDC (Connected Limited Device
Configuration)
CDC (Connected Device Configuration)
Mengimplementasikan subset dari
J2SE.
Mengimplementasikan seluruh fitur dari
J2SE.
JVM yang digunakan adalah KVM. JVM yang digunakan adalah CVM.
Digunakan pada perangkat handheld
(handphone, PDA, two way pager)
dengan memory terbatas (160-512 kb).
Digunakan pada perangkat handheld
(internet TV, Nokia Communicator, car
TV) dengan memory minimal 2 Mb.
Prosesor : 16/ 32 bit. Prosesor : 32 bit.
Bila J2ME configuration menyediakan library Java untuk implementasi fitur standar dari sebuah handheld devices, maka J2ME profile menyediakan implementasi tambahan yang sangat spesifik untuk sebuah handheld devices. Terdapat lima kategori J2ME profile saat ini yaitu :
1. Mobile Information Device Profile (MIDP).
2. Foundation profile (FP).
3. Personal Profile.
4. RMI Profile.
5. Personal Digital Assistance Profile.
MIDP menyediakan library Java untuk implementasi dasar interface (GUI), implementasi networking, database, dan timer. MIDP dirancang khusus untuk wireless phone dan pager. Beberapa perusahaan mengembangkan sendiri J2ME profile, misalnya NTT Docomo, yang mengembangkan J2ME profile yang spesifik untuk perangkat keras yang dimiliki NTT Docomo. Pada Gambar 2.1 tampak terdapat Card Profile yang sebenarnya merupakan profile bagi platform Java Card (yang berada diluar kategori J2EE, J2SE, maupun J2ME), yang khusus dikembangkan untuk membuat aplikasi pada smart card seperti aplikasi kartu telepon, chip kartu, kartu visa, kartu SIM pada handphone, dan aplikasi mobile banking BCA yang saat ini digunakan di masyarakat Indonesia.
2.4.2 Aplikasi MIDlet
MIDlet merupakan istilah yang diberikan untuk aplikasi java J2ME yang menggunakan profile MIDP (Mobile Information Device Profile) pada implementasinya. Sebuah aplikasi MIDlet memiliki arsitektur minimal sebagai berikut :
import javax.microedition.midlet.*;
public class class-name
extends MIDlet [implements] interface {
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Paket javax.microedition.midlet memiliki kelas MIDlet yang mendefinisikan MIDP dan interaksinya dengan perangkat handheld yang bersangkutan. Kelas ini merupakan kelas utama dalam sebuah MIDlet, yang berarti semua aplikasi MIDlet harus merupakan turunan dari kelas ini. Kelas ini mempunyai tiga fungsi yang bersifat abstract (fungsi yang didefinisikan tanpa memiliki isi/ fungsi kosong), sehingga kelas turunannya harus mengimplementasikan fungsi abstrak tersebut. Fungsi abstrak yang dimaksud adalah startApp(), pauseApp() dan destroyApp(). MIDlet memiliki daur hidup yang didefinisikan dalam tiga buah status, yaitu active, paused dan destroyed.
2.4.3 Keuntungan Penggunaan Teknologi J2ME
Keuntungan yang paling menonjol dari J2ME dibandingkan dengan teknologi wireless sebelumnya adalah keamanan dan disconnected access serta synchronization. Keamanan menjadi sebuah isu yang sangat penting dewasa ini. Dalam teknologi WAP, device me-retrieve dan men-display data melalui microbrowser dan dibutuhkan suatu gateway untuk jembatan antara jaringan internet dan jaringan wireless itu sendiri. Maka wilayah jaringan internet menjadi salah satu hal potensial terhadap gangguan keamanan data. Disconnected access and synchronization maksudnya adalah wireless device tetap dapat me-run aplikasinya secara stand alone meskipun telah terdiskoneksi dari jaringan wireless- nya atau out of coverage area. Pada aplikasi WAP, device harus selalu terkoneksi pada jaringan wireless-nya untuk mengakses aplikasi berbasis WML tersebut.
Selain dari kedua keuntungan diatas, juga terdapat keuntungan yang secara umum dimiliki oleh aplikasi berbasis Java lainnya yaitu :
1. Dynamic delivery of application and services. Aplikasi berbasis Java dapat didownload secara real time over the air (OTA) dan me-running-nya dalam berbagai device.
2. Cross platform compatibility.
3. Enhances user experience. Teknologi Java kaya akan grafik dengan interaksi
yang cepat pula serta grafik di-generate secara lokal sehingga kebutuhan terhadap
network bandwidth menjadi tereduksi.
4. Scalability and performance. Skalabilitas dan performance dapat ditingkatkan
karena aplikasi Java dapat berjalan secara stand alone mode.
BAB III
PEMBAHASAN
3.1 Metode Penelitian
Metode yang dilakukan dalam pembuatan penulisan ini adalah studi pustaka, yaitu dengan mempelajari berbagai buku yang menunjang penulisan dan pembuatan program.
3.2 Teknik Analisis
Dalam permainan terdapat tiga buah benda, yaitu item yang berbentuk kotak dan memiliki tujuh buah warna berbeda, intan emas, dan intan warna-warni. Dalam permainan ini yang perlu dilakukan adalah menyusun warna item sedemikian rupa agar terangkai warna item yang sama/ sejenis sebanyak-banyaknya pada papan permainan. Permainan dimulai dengan menjatuhkan tiga buah item yang tersusun secara vertikal, dimana setiap item memiliki warna yang telah diacak dari tujuh buah warna yang disediakan. Item tersebut akan turun terus menerus hingga mencapai batas bawah papan permainan, atau menumbuk item lain yang telah berada di papan permainan. Selama item tersebut masih bergerak turun, user dapat menggesernya kearah kiri, kanan, maupun mempercepat turunnya item. User juga dapat melakukan rotasi warna item dari ketiga warna item yang dijatuhkan, maupun melakukan rotasi perputaran item yang dijatuhkan sebanyak 90o. Apabila item telah mencapai batas bawah ataupun menumbuk item lain yang telah berada di papan permainan, maka item tersebut akan tersimpan pada papan permainan dan item selanjutnya dijatuhkan. Untuk yang berikutnya terdapat tiga buah kemungkinan item, yaitu dijatuhkannya item biasa (kotak), intan emas dan intan warna-warni. Apabila intan yang dijatuhkan merupakan intan emas, user memiliki kesempatan untuk menghancurkan item yang terdapat di papan permainan dengan cara menjatuhkannya tepat diatas warna item yang ingin dihancurkan, maka semua warna item pada papan permainan yang sama dengan warna item yang ditumbuk akan dihancurkan. Sebaliknya apabila intan warna-warni yang dijatuhkan, maka hanya warna sama di papan yang terhubung dengan item yang ditumbuk dengan intan warna-warni saja yang dihancurkan. Perhitungan score terjadi setiap bergeraknya item yang dijatuhkan kebawah
dan setiap hancurnya item pada papan permainan. Permainan akan berlangsung terus dengan urutan yang sama seperti yang telah dijabarkan sebelumnya hingga terjadi kondisi game over atau user memenangkan permainan. Kondisi game over terjadi apabila item yang dijatuhkan bertumbukan dengan item di papan permainan pada batas atas papan permainan. Sedangkan user dapat memenangkan permainan dengan cara memperoleh score hingga mencapai angka yang ditentukan, yaitu 9999.
3.2 Flowchart Program
Agar lebih memudahkan dalam pembuatan program, maka terlebih dahulu penulis membuat flowchart (diagram alur) yang akan menggambarkan alur program secara umum. Flowchart tersebut dapat digambarkan sebagai berikut : User dapat memilih menu yang tersedia, dan pada tahap ini pilihan user akan diproses untuk setiap pilihan menu yang ada.
3.2.1 Flowchart Layar Splash
Layar splash (splash screen) merupakan sebuah tampilan yang biasanya digunakan sebagai pembuka sebuah aplikasi, dimana layar ini berguna pada tahap inisialisasi aplikasi yang memerlukan waktu cukup panjang, sehingga user akan memperoleh informasi bahwa tindakan user sedang diproses. Pada penulisan ini, penulis menggunakan layar splash sebagai layar pembuka permainan, dimana alur programnya dapat digambarkan sebagai berikut :
Gambar 3.2
Awal alur program dimulai dengan menampilkan layar splash yang berisi gambar (image) dengan keterangan “Loading…” untuk menginformasikan ke user bahwa permainan sedang di-load. Alur selanjutnya akan mengarah pada sebuah kondisi, apakah permainan dimulai baru (user memilih “New” di menu utama), atau melanjutkan permainan sebelumnya (user memilih “Continue”). Apabila memulai permainan baru, maka data permainan yang terdapat di storage akan dihapus, dan apabila melanjutkan permainan sebelumnya, data permainan sebelumnya yang tersimpan di storage dibaca dan diload sebagai posisi permainan yang akan dimainkan. Alur terakhir adalah menampilkan papan permainan.
3.2.2 Flowchart Permainan
Papan permainan akan ditampilkan setelah layar splash. Bagian ini merupakan
inti dari aplikasi permainan, dimana pada papan permainan ini user dapat melakukan
interaksi dengan aplikasi melalui permainan. Tampilan awal papan permainan ini
dibagi menjadi dua, yaitu :
1. Tampilan papan permainan baru dimana pada papan belum terdapat item apapun
dan nilai score pun masih nol (user memilih menu “New”).
2. Tampilan yang kedua adalah sebuah papan permainan yang telah berisi posisi item dari permainan sebelumnya yang belum diselesaikan, disertai dengan nilai score pada permainan sebelumnya (user memilih menu “Continue”). Untuk alur program permainan, dapat dilihat pada gambar berikut ini :
Alur program dimulai dari tahap inisialisasi (hanya diperuntukan untuk memulai permainan baru dimana user memilih “New” pada menu utama), sedangkan untuk melanjutkan permainan selanjutnya (“Continue”) tahap ini akan dilewatkan. Setelah inisialisasi selesai dilakukan maka papan permainan akan ditampilkan.
Alur berikutnya akan mengarah pada pemeriksaan terhadap item yang dijatuhkan pada saat ini, apabila item sekarang adalah sebuah intan, maka intan tersebut akan turun bergerak kebawah hingga bertabrakan dengan batas bawah papan permainan. Apabila intan jatuh diatas item, maka warna item yang bertabrakan dengan intan akan disimpan, dan apabila intan tersebut merupakan intan emas, maka semua warna item yang sama dengan warna yang tersimpan akan dihancurkan, sebaliknya apabila bukan intan emas, maka hanya warna sama yang terhubung dengan item yang bertabrakan dengan intan saja yang dihancurkan. Apabila item yang dijatuhkan sekarang bukan intan, maka item tersebut akan turun bergerak kebawah hingga bertabrakan dengan item pada papan ataupun dengan batas bawah dari papan permainan, dan item tersebut akan menjadi bagian pada papan permainan. Hal itu akan dilakukan untuk tiga buah item yang diberikan. Apabila intan ataupun ketiga item telah bertabrakan, maka item selanjutnya akan degenerate oleh sistem melalui cara random. Permainan akan berakhir apabila memenuhi salah satu dari dua kemungkinan. Kemungkinan pertama, apabila item yang dijatuhkan bertabrakan dengan item pada batas atas papan permainan (Game Over), dan apabila score atau nilai yang diperoleh telah sama atau melebihi 9999 (user memenangkan permainan).
3.2.3 Alur Penekanan Tombol
Dalam layar permainan user dapat berinteraksi dengan aplikasi permainan melalui tombol yang terdapat dalam ponsel. Setiap tombol yang terdapat pada ponsel diberikan fungsi yang berbeda untuk memenuhi semua kemungkinan interaksi yang diperlukan dalam permainan. Untuk lebih jelasnya, alur penekanan tombol dapat dilihat pada gambar berikut ini :
1. Tombol 2, akan mengakibatkan rotasi dari warna item yang dijatuhkan, dengan
aturan warna item kedua = warna item kesatu, warna item ketiga = warna item
kedua dan warna item kesatu = warna item ketiga.
2. Tombol 4, akan mengakibatkan pergeseran item ke kiri satu blok.
3. Tombol 5, akan mengakibatkan rotasi item memutar 90o sehingga rangkaian tiga
buah item yang semula vertikal akan menjadi horizontal dan sebaliknya.
4. Tombol 6, akan mengakibatkan pergeseran item ke kanan satu blok.
5. Tombol 8, akan mempercepat turunnya/ pergerakan item kebawah.
6. Tombol Softkey kanan, merupakan tombol yang berada tepat dibawah kanan layar
ponsel. Penekanan terhadap tombol ini berguna untuk mengakses menu option dalam permainan, dan posisi permainan secara otomatis akan dihentikan sementara (posisi pause) Penekanan terhadap tombol tersebut dapat dilakukan dalam dua cara, yaitu penekanan terhadap tombol dan langsung melepaskannya, yang mengakibatkan proses hanya akan dilakukan sekali, dan penekanan secara terus-menerus, yang mengakibatkan proses akan dieksekusi secara berulang hingga tombol dilepaskan.
3.2.4 Flowchart Menu Option
Menu option merupakan fasilitas yang diberikan terhadap user untuk melakukan perubahan terhadap beberapa seting yang menjadi bagian dalam permainan. Alur program menu option adalah sebagai berikut : menyebabkan posisi level dikembalikan ke 0, yang merupakan nilai awal yang diberikan.
2. Menu Audio, akan menyebabkan perubahan status audio (bunyi pada permainan)
yang semula ON menjadi OFF, ataupun sebaliknya.
3. Menu Vibration, akan menyebabkan perubahan status vibrasi (getaran pada
ponsel) yang semula ON menjadi OFF, ataupun sebaliknya.
4. Menu Back, akan menyebabkan alur program dialihkan kembali ke menu utama
(menu utama ditampilkan), yang berarti user keluar dari menu option.
3.2.5 Flowchart Menu Option dalam Permainan
Menu option dalam permainan memiliki kemiripan dengan menu option yang terdapat pada menu utama. Menu option ini dibuat agar user dapat melakukan perubahan secara langsung terhadap seting permainan seperti audio dan vibrasi ataupun untuk keluar dari permainan, tanpa harus mengakhiri permainan dan kembali ke menu utama untuk selanjutnya mengulangi permainan dari awal lagi. Menu option dalam permainan dapat diakses dengan menekan tombol Softkey kanan.
3.2.6 Flowchart Layar High Score
Pada umumnya setiap aplikasi permainan memiliki fasilitas untuk menyimpan data score tertinggi yang telah dicapai oleh user yang memainkan permainan tersebut. Layar High Score pada aplikasi ini juga dibuat oleh penulis untuk memungkinkan user menyimpan data score tertinggi beserta nama dan tanggal pada waktu score tersebut dicapai.
Layar High Score dapat diakses dari menu utama untuk dapat dibaca. Layar ini juga merupakan layar yang ditampilkan setiap kali permainan berakhir (Game Over). Alur program ini diawali dengan membaca score yang dicapai dalam permainan. Apabila score yang dicapai lebih besar dari setiap score yang tersimpan ataupun masih terdapat ruang kosong untuk menyimpan score, maka user akan diminta untuk menginput nama, yang kemudian nama tersebut beserta score dan tanggal akan ditambahkan kedalam data score untuk disimpan. Apabila score yang dicapai sama atau lebih kecil dari setiap score yang tersimpan ataupun tidak terdapat lagi ruang kosong untuk menyimpan score, maka
user akan langsung diarahkan ke tampilan layar High Score yang berisi data score yang tersimpan. Pada layar High Score ini user dapat menghapus semua score yang telah tersimpan dengan memilih menu Clear All yang disediakan. Untuk mencegah kemungkinan user salah menekan tombol, maka disediakan tampilan konfirmasi untuk memastikan pilihan user. Apabila user memilih menu yes pada layer konfirmasi, barulah semua score yang tersimpan akan dihapus. Selanjutnya user akan diarahkan kembali ke menu utama.
3.3 Struktur Menu
Pada aplikasi permainan yang dibuat, penulis menggunakan beberapa buah menu yang tujuannya adalah untuk memudahkan dan membantu pengguna aplikasi dalam mengakses fasilitas dalam permainan yang disediakan seperti memulai permainan, melihat high score, melihat layar bantuan (help), termasuk pula melakukan pengaturan terhadap beberapa seting yang tersedia seperti seting level, audio dan vibrasi. Menu yang terdapat dalam aplikasi ini dibagi kedalam dua kelompok, yaitu menu utama yang terdapat pada awal tampilan aplikasi permainan dan menu yang terdapat dalam permainan, dimana pemakai aplikasi dapat memilih menu ketika permainan sedang berjalan.
3.3.1 Menu Utama
Menu utama ini merupakan menu yang akan ditampilkan pada saat pertama kali aplikasi permainan dijalankan. Menu ini memiliki bagan sebagai berikut :
&RQWLQXH
$ERXW
+RZ_7R_3OD\
2 SWLRQ
+LJK_6FRUH
1 HZ_* DPH
/ HYHO
$XGLR
9LEUDWLRQ
Pada menu utama terdapat lima buah pilihan yang tersedia pada saat aplikasi
game pertama kali dijalankan, yaitu :
1. “New Game”, digunakan untuk memulai permainan dari awal.
2. “High Score”, digunakan untuk melihat daftar score yang tersimpan.
3. “Option”, digunakan untuk melakukan perubahan terhadap opsi yang mendukung
permainan, seperti level, audio dan vibrasi.
4. “How To Play”, digunakan untuk melihat bantuan cara memainkan game.
5. “About”, digunakan untuk melihat dokumentasi aplikasi, seperti pembuat
aplikasi, versi dan kapan aplikasi ini dibuat. Selain kelima menu tersebut, terdapat sebuah menu lagi yaitu menu “Continue” yang hanya akan tersedia apabila user memainkan permainan (memilih menu ”New Game”) dan tidak menyelesaikannya (permainan dapat dihentikan sebelum berakhir dengan memilih menu yang tersedia dalam permainan). Menu ini digunakan untuk melanjutkan permainan sebelumnya yang belum diselesaikan.
Pemilihan terhadap menu “Option” akan memunculkan tiga buah submenu yaitu :
1. “Level”, digunakan untuk memilih tingkat kesulitan permainan, dimana semakin
tinggi level yang dipilih maka akan semakin tinggi tingkat kesulitannya.
2. “Audio”, digunakan untuk menghidupkan atau mematikan suara dalam
permainan.
3. “Vibration”, digunakan untuk mematikan atau menghidupkan efek getaran dalam
permainan.
3.3.2 Menu Dalam Permainan
Menu dalam permainan yang terdapat dalam aplikasi ini memiliki bagan sebagai berikut :
pixel dan tinggi 65 pixel), serta 4096 warna. Dikarenakan adanya keterbatasan resolusi yang dimiliki oleh ponsel ini, maka pengaturan tata letak menjadi hal yang perlu diperhatikan. Dalam aplikasi permainan Diamond Puzzle ini terdapat beberapa layar tampilan yang memiliki karakteristik yang berbeda, seperti layar menu, layer permainan, dan layar High Score.
3.4.1 Layar Menu
Terdapat dua kelompok menu pada aplikasi permainan ini. Pada kedua kelompok menu tersebut akan diberikan bentuk tampilan yang sama agar user dapat dengan mudah mengenalinya.
3.4.2 Layar Permainan
Layar ini merupakan tempat dimana permainan Diamond Puzzle dilakukan,
dan pada layar ini diharapkan user dengan device (ponsel) dapat saling berinteraksi.
Aplikasi permainan Diamond Puzzle merupakan aplikasi yang animatif dan interaktif,
dimana dalam permainan ini digunakan media grafis dan audio sebagai alat
penyampaian informasi kepada user.
Rancangan Layar Permainan
Papan permainan merupakan bagian utama dari layar permainan, oleh sebab itu bagian ini diberikan porsi yang paling besar dalam layar permainan. Papan permainan diletakan disebelah kiri dengan ukuran 80% dari lebar layar. 20% sisanya menu option item selanjutnya papan permainan score & level diperuntukan bagi tampilan item selanjutnya, informasi score dan level, serta icon segitiga yang menandakan terdapat menu didalamnya. Alasan pemilihan icon segitiga sebagai penunjuk/ indikasi adanya menu dikarenakan penggunaan menu konvensional akan membatasi dimensi panjang layar yang dapat digunakan dan mengganggu visibilitas permainan.
3.4.3 Layar High Score
Pada layar ini user dapat melihat daftar score tertinggi yang tersimpan dalam ponsel. Pada aplikasi permainan Diamond Puzzle ini penulis menyediakan tempat untuk menyimpan 10 buah daftar score. Karena adanya keterbatasan ruang pada layer ponsel, maka tidak semua daftar score akan ditampilkan dalam waktu yang sama, melainkan dibagi kedalam beberapa kelompok yang akan ditampilkan sekali waktu, dan user dapat melakukan scroll dengan menekan tombol atas ataupun bawah untuk melihat kelompok data score sebelum atau sesudahnya.
3.5 Pembuatan Program
Pada pemrograman java (J2ME), setiap fungsi yang ingin dibuat harus dituliskan didalam sebuah kelas, karena pada dasarnya J2ME menganut prinsip pemrograman OOP (object oriented programming). Pada pembuatan aplikasi permainan Diamond Puzzle ini, penulis membagi fungsi yang terdapat dalam aplikasi ini kedalam beberapa kelas, dimana setiap kelas dibuat berdasarkan karakteristik layar yang dipergunakan dalam aplikasi. Dengan kata lain, setiap layar yang ada dibangun dari kelas tersendiri. Penjelasan tentang kelas yang dibuat dan isinya akan dijelaskan pada subbab terpisah.
3.5.1 Kelas diamondPuzzle
Kelas ini merupakan kelas pembangun aplikasi permainan yang utama dan juga digunakan untuk menampilkan menu utama. Kelas ini didefinisikan sebagai berikut :
public class diamondPuzzle
extends MIDlet implements CommandListener
Kelas ini didefinisikan sebagai kelas turunan MIDlet, yang berarti program ini dibuat menggunakan profile MIDP. Kelas ini juga mengimplementasi interface CommandListener, yang digunakan untuk menangkap pilihan user terhadap menu. Menu utama yang akan ditampilkan dibuat dengan menggunakan list, dimana strukturnya adalah sebagai berikut :
list = new List(" Diamond Puzzle", Choice.IMPLICIT);
list.append("New Game", null);
50
list.append("HighScore", null);
list.append("Option", null);
list.append("How To Play", null);
list.append("About", null);
list.addCommand(cmdExit);
list.addCommand(cmdSelect);
list.setCommandListener(this);
list tersebut dibuat dengan memanggil perintah new List yang diikuti dengan parameter judul dan karakteristik pemilihan menu. Setelah list terbentuk, maka isi dari list tersebut dapat ditambahkan dengan menggunakan perintah append yang diikuti dengan parameter teks yang akan ditampilkan sebagai item menu, dan tipe dari menu. Selanjutnya pada list dikaitkan command yang merupakan opsi tindakan yang dapat dilakukan user terhadap list (menu) tersebut, dimana command yang diberikan didefinisikan sebagai berikut :
private Command cmdExit =
new Command("Exit", Command.EXIT, 1);
pembuatan command dilakukan dengan menggunakan perintah new dan pengiriman parameter teks yang akan ditampilkan ke layar, tipe command dan prioritas yang diberikan. Dalam implementasinya, command tersebut akan ditampilkan sebagai menu dibagian bawah layar. Tahap akhir yang dilakukan adalah melakukan implementasi commandListener untuk menangkap pilihan user terhadap menu. Untuk menangani pilihan user terhadap menu, dibuatkan sebuah metode yang isinya sebagai berikut :
public void commandAction(Command c, Displayable s) {
if (c == cmdExit) {
51
destroyApp(true);
notifyDestroyed();
} else if (c == cmdSelect) {
genIndex();
int i = list.getSelectedIndex();
if (i == CONTINUE) {
splashScreen sScrean = new splashScreen
(display, list, true);
display.setCurrent(sScrean);
} else if (i == NEW) {
splashScreen sScrean = new splashScreen
(display, list, false);
display.setCurrent(sScrean);
...
}
}
}
Metode ini meng-override metode sama yang didefinisikan pada interface CommandListener secara abstrak. Metode ini mengembalikan dua buah nilai, yaitu c
(command yang dipilih user) dan s (layar tempat user memilih). Selanjutnya tindakan user ditangani melalui sebuah struktur percabangan yang memeriksa pilihan user. Apabila user memilih Exit, maka aplikasi akan dihentikan, dan apabila user memilih menu Select, maka index dari item menu akan diperiksa dan user diarahkan sesuai dengan pilihan pada menu. Sebagai contoh, apabila user memilih menu Continue, maka akan dibuatkan sebuah instance dari kelas spalshScreen (akan dijelaskan kemudian) dan layar tampilan diset menjadi instance ini. Dengan kata lain, layer splash akan ditampilkan menggantikan layar menu utama. Karena kelas diamondPuzzle ini merupakan turunan dari kelas MIDlet, maka kelas ini harus meng-override tiga metode abstrak yang didefinisikan pada kelas MIDlet. Ketiga metode tersebut di-override menjadi :
public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(list);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
if (availSave) storage.saveGame(display, null);
display.setCurrent(null);
notifyDestroyed();
}
Metode startApp akan dieksekusi apabila aplikasi ponsel dijalankan. Yang dilakukan pada metode ini adalah mengambil handle dari display ponsel yang selanjutnya digunakan untuk menampilkan list (menu utama) ke layar ponsel. Sedangkan untuk metode destroyApp yang akan dieksekusi apabila user keluar aplikasi dengan menekan tombol cancel pada ponsel (dilambangkan dengan icon telepon berwarna merah), diisi dengan program untuk melakukan penyimpanan posisi permainan jika memungkinkan dan melepaskan handle display.
3.5.2 Kelas optionScreen
Kelas ini digunakan untuk menampilkan menu option. Kelas ini didefinisikan
sebagai berikut :
public class optionScreen implements CommandListener
Sama seperti kelas diamondPuzzle sebelumnya, kelas ini juga mengimplementasi interface CommandListener. Untuk menampilkan menu option, pada kelas ini digunakan list seperti pada kelas diamondPuzzle yang isinya adalah pilihan untuk menaikkan level dan pilihan untuk mematikan/ menyalakan audio dan vibrasi.
3.5.3 Kelas inGameOptionScreen
Kelas ini memiliki kemiripan dengan kelas optionScreen. Kelas ini didefinisikan sebagai berikut :
public class inGameOptionScreen implements CommandListener
Perbedaan antara kelas ini dengan kelas optionScreen terletak pada item dalam list (pilihan menu). Pada kelas ini menu level dihilangkan, sebaliknya, ditambahkan menu pilihan ”Exit Game”.
3.5.4 Kelas splashScreen
Kelas ini digunakan untuk menampilkan layar splash. Kelas ini didefinisikan
sebagai berikut :
public class splashScreen
extends FullCanvas implements Runnable
Kelas ini merupakan kelas turunan FullCanvas, dimana kelas tersebut merupakan kelas bawaan dari SDK (Software Development Kit) device ponsel seri Nokia 3510i. Kelas tersebut memungkinkan untuk menggunakan layar ponsel Nokia seri 3510i secara penuh untuk menggambar grafis. Karena kelas FullCanvas merupakan kelas yang device dependent (bergantung pada platform) terhadap ponsel seri 3510i, maka aplikasi permainan diomondPuzzle ini hanya dapat dijalankan pada ponsel tersebut. Kelas splashScreen ini juga mengimplementasi interface runnable yang digunakan untuk membuat sebuah thread. Untuk menampilkan layar splash, hal yang pertama kali dilakukan adalah meload gambar dengan perintah :
try {
splash = Image.createImage("/background.png");
} catch (IOException e){}
Blok try…catch digunakan untuk melakukan percobaan eksekusi terhadap perintah yang berpotensi untuk terjadinya kesalahan (error). Seperti pada perintah diatas untuk me-load file gambar yang kemungkinan file tersebut tidak terdapat didalam sistem. Apabila terjadi kesalahan, maka kesalahan tersebut akan ditangkap oleh variable e. Yang selanjutnya dilakukan adalah menjalankan thread dengan melakukan perintah :
new Thread(this).start();
dimana thread tersebut akan memanggil metode run yang terdapat didalam kelas
splashScreen ini yang isinya :
public void run() {
55
try {
Thread.sleep(3000);
} catch (InterruptedException ie) {}
gScreen = new gameScreen(d, prev);
if (cont) {
storage.loadGame();
gScreen.paused = true;
} else new Thread(gScreen).start();
storage.delGame();
d.setCurrent(gScreen);
diamondPuzzle.availSave = true;
}
Awalnya thread ini akan melakukan delay selama 3 detik, lalu selanjutnya instance dari kelas gameScreen (dijelaskan selanjutnya) dibuat. Langkah berikutnya adalah memeriksa apakah user memilih untuk melanjutkan permainan pada menu utama, untuk kedua kemungkinan yang ada, diberikan dua buah percabangan untuk menanganinya. Langkah terakhir adalah menampilkan layar permainan. Dengan adanya thread maka memungkinkan terjadinya dua proses untuk berjalan bersamaan. Pada saat metode run berjalan, metode paint juga ikut
dijalankan. Metode ini digunakan untuk menggambar layar splash, dimana isinya
adalah sebagai berikut :
public void paint(Graphics g) {
g.drawImage(splash, 0, 0, g.LEFT | g.TOP);
g.setColor(0x147828);
g.setFont(Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_BOLD | Font.STYLE_ITALIC,
Font.SIZE_LARGE));
g.drawString("Loading...", getWidth()/2, 40,
g.TOP | g.HCENTER);
}
Layar yang ditampilkan pada metode paint berisi image (gambar) yang telah di-load sebelumnya beserta teks ”Loading...” untuk menginformasikan kepada user bahwa aplikasi permainan sedang dipersiapkan.
3.5.5 Kelas gameScreen
Kelas ini digunakan untuk menampilkan layar permainan. Kelas ini didefinisikan sebagai berikut :
public class gameScreen
extends FullCanvas implements Runnable
Kelas ini merupakan turunan dari kelas FullCanvas (untuk menggambar sepenuh layar) dan mengimplementasi runnable untuk melakukan aplikasi multithreading. Langkah pertama yang dilakukan pada kelas ini adalah melakukan inisialisasi terhadap variabel yang akan digunakan. Inisialisasi tersebut didefinisikan dalam metode init yang berisi :
private void init() {
level = diamondPuzzle.level;
score = 0;
// Initialize available color
availColor[0] = 0x0000FF;
availColor[1] = 0xFF0000;
availColor[2] = 0x00FF00;
availColor[3] = 0xFFFF00;
57
availColor[4] = 0x00FFFF;
availColor[5] = 0xFF00FF;
//Initialize image
try {
diamond = Image.createImage("/diamond.png");
special = Image.createImage("/special.png");
background = Image.createImage("/background.png");
} catch (IOException e){}
...
Pada metode ini, score dan level diinisialisasi terlebih dahulu. Selanjutnya warna yang akan digunakan dipersiapkan (menggunakan format hexa RGB 0xRRGGBB), dan barulah image yang dibutuhkan di-load. Langkah berikutnya yang dilakukan untuk mempersiapkan papan permainan adalah melakukan pengacakan terhadap item selanjutnya ya ng akan dijatuhkan dalam permainan. Hal ini dilakukan dalam metode random New yang isinya :
private void randomNew() {
...
colorItem[0] = colorNextItem[0];
colorItem[1] = colorNextItem[1];
colorItem[2] = colorNextItem[2];
isNowDiamond = isNextDiamond;
isNowSpecial = isNextSpecial;
if (a.nextInt() % 4 == 0) {
isNextDiamond = true;
if (a.nextInt() % 3 == 0) isNextSpecial = true;
else isNextSpecial = false;
} else isNextDiamond = false;
if (!isNextDiamond)
for (int i = 0; i < 3; i++)
colorNextItem[i] =
availColor[Math.abs(a.nextInt() % 6)];
}
Pada metode ini terdapat variabel colorItem yang digunakan untuk menampung warna item sekarang dan variabel colorNextItem untuk warna item berikutnya. Setiap kali metode ini dipanggil, maka warna item sekarang digantikan dengan warna item berikutnya dan warna item berikutnya diacak kembali. Pada metode ini juga dilakukan pengacakan terhadap kemungkinan munculnya intan. Semua pengacakan dilakukan dengan menggunakan variabel a yang didefinisikan sebagai berikut :
private Random a = new java.util.Random();
Setelah tahap inisialisasi dilakukan, barulah papan permainan dapat dijalankan. Permainan dijalankan dengan menggunakan thread dengan memanggil metode run yang berisi :
public void run() {
...
while(running) {
drawBoard();
if (isNowDiamond) {
if (collision(0)) {
if (y[0] != maxY*iSize) {
jumlah = 0;
if (isNowSpecial) {
new crush(cC, -1, 0, 0, true);
v.removeElementAt(0);
} else new crush(cC, (int)(x[0]/iSize),
(int)(y[0]/iSize)+1, 1, false);
59
score += jumlah*jumlah/2;
animCrush(cC);
animDrop();
System.gc();
}
randomNew();
} else y[0] += move[0];
} else {
int j = 0;
for (int i = 0; i < 3; i++)
if ((y[i] >= -iSize) && (move[i] != 0)
&& collision(i)) {
color[(int)(x[i]/iSize)][(int)(y[i]/iSize)] =
colorItem[i];
move[i] = 0;
} else {
j += move[i];
y[i] += move[i];
}
if (j == 0) randomNew();
}
if (keyCode != 0) counter++;
else counter = 0;
if (counter > 3) {
counter = 3;
watchMove(keyCode);
}
...
if (score >= 9999) {
score = 9999;
gameOver(true);
60
} else if (score > 1000*level+1000) level++;
try {
Thread.sleep(100 - 10*level);
} catch (InterruptedException ie) {}
}
}
Thread ini akan dijalankan selama kondisi running bernilai true. Hal yang membuat running bernilai false adalah kondisi game over atau user menekan menu option. Hal yang pertama kali dilakukan adalah menggambar/ menampilkan papan permainan. Selanjutnya akan diperiksa apakah telah terjadi tumbukan (item yang dijatuhkan menyentuh item yang berada di papan permainan). Metode pemeriksaan tumbukan tersebut berisi :
private boolean collision (int item) {
if (y[item] == maxY*iSize)
return(true);
else if (color[(int)(x[item]/iSize)]
[(int)(y[item]/iSize)+1] != 0)
if (!isNowDiamond && (y[item] == -iSize)) {
gameOver(false);
return(false);
} else return(true);
else return(false);
}
Pada metode collision ini terdapat beberapa kondisi yang menyebabkan tumbukan
bernilai true (telah terjadi tumbukan), yaitu :
1. Koordinat y dari item yang dijatuhkan sama dengan batas bawah papan permainan.
2. Terdapat item pada koordinat x, y+1 dari posisi item yang dijatuhkan, ditandai
dengan adanya warna pada koordinat tersebut. Pada metode collision ini juga terdapat kondisi game over yang terjadi apabila pada koordinat x, y+1 dari posisi item yang dijatuhkan terdapat item dan posisi item yang dijatuhkan berada pada batas atas papan permainan.
Apabila terjadi tumbukan, maka terdapat beberapa jenis item yang ditangani
secara berbeda, yaitu :
1. Intan warna-warni, warna item pada papan permainan yang ditumbuk disimpan, kemudian semua warna item pada papan yang terhubung dicari menggunakan kelas baru yaitu crush, untuk kemudian dilakukan animasi hancurnya item tersebut dan pengaturan kembali posisi item pada papan permainan.
2. Intan emas, warna item pada papan permainan yang ditumbuk disimpan, dan kemudian semua warna item yang sama pada papan dicari menggunakan kelas crush, untuk kemudian dilakukan animasi hancurnya item tersebut dan pengaturan kembali posisi item pada papan permainan.
3. Item biasa, item ini akan disimpan posisinya pada papan permainan dan akan menjadi bagian dari item pada papan permainan. Pada jenis intan warna-warni maupun intan emas, terdapat pembentukan instan dari kelas crush untuk pencarian item pada papan permainan yang akan dihancurkan. Isi dari kelas ini adalah sebagai berikut :
class crush {
...
public crush(int cC, int x, int y, int at, boolean all) {
...
gameScreen.jumlah++;
gameScreen.v.addElement(this);
if (all) {
if (x == gameScreen.maxX) {
x = -1;
y++;
}
while ((x != gameScreen.maxX) &&
(y != gameScreen.maxY+1) &&
(gameScreen.color[x+1][y] != cC)) {
x++;
if (x == gameScreen.maxX) {
x = -1;
y++;
}
}
if (y != gameScreen.maxY+1)
new crush(cC, x+1, y, at+1, true);
} else {
// Detect Up
if ((y != 0) && (gameScreen.color[x][y-1] == cC)
&& !added(x, y-1))
new crush(cC, x, y-1, at+1, false);
// Detect Left
if ((x != 0) && (gameScreen.color[x-1][y] == cC)
&& !added(x-1, y))
new crush(cC, x-1, y, at+1, false);
63
// Detect Right
...
// Detect Down
...
}
}
private boolean added(int x, int y) {
...
}
}
Pada kelas ini terjadi perulangan secara rekursif terhadap kelas ini sendiri, dimana disetiap perulangan variable jumlah akan bertambah untuk menghitung banyaknya item yang ditemukan. Untuk menampung item yang ditemukan, digunakan objek vektor yang bersifat dinamis. Terhadap vektor ini dapat ditambahkan objek tak terbatas (hanya kapasitas memory-lah yang membatasinya), sehingga ideal sebagai tempat menampung objek yang tidak diketahui banyaknya. Untuk algoritma pencarian item, pada kelas ini terdapat dua algoritma yang digunakan. Algoritma pertama digunakan untuk menangani pencarian untuk kasus tumbukan intan emas, dimana pada algoritma ini, semua item yang terdapat pada papan permainan dicocokan warnanya dengan warna yang tersimpan untuk
dihancurkan, dimulai dari posisi paling kiri-atas. Alur algoritma pencarian semua item dapat digambarkan sebagai berikut :
Transisi Algoritma Pencarian Semua Item
Arah Pencarian (1) dan Urutan Penemuan Item (2)
Sedangkan algoritma kedua digunakan pada kasus intan warna-warni, dimana pencarian item dimulai dari posisi item yang tertumbuk dan dilakukan deteksi item dengan pencocokan warna sama yang terhubung secara berantai. Alur algoritma pencarian item yang terhubung dapat digambarkan sebagai berikut :
Transisi Algoritma Pencarian Item Terhubung
Arah Pencarian (1) dan Urutan Penemuan Item (2)
b
b k
b k b k
k k k m m
b
b k
b k b k
k k k m m
b
b
b k b k
k k k m m
b
b
b k b k
k k k m m
posisi
tumbukan
1
2 3
4
arah
deteksi
arah
deteksi
2 3
4
Apabila tidak terjadi tumbukan, maka dilakukan pertambahan nilai koordinat y dari item. Setiap terjadi tumbukan maupun tidak nilai, score akan selalu di-update, dan bila telah mencapai nilai 9999 maka permainan akan dihentikan dan dinyatakan berakhir untuk kemenangan user. Agar dapat terjadi interaksi antara user dengan permainan, maka pada kelas gameScreen ini penekanan tombol yang dilakukan oleh user dimonitor menggunakan metode keyPressed dan keyReleased yang isinya sebagai berikut :
public void keyPressed(int keyCode) {
if (paused) {
running = true;
paused = false;
new Thread(this).start();
}
if ((keyCode == Canvas.KEY_NUM2) ||
(keyCode == Canvas.KEY_NUM4) ||
(keyCode == Canvas.KEY_NUM5) ||
(keyCode == Canvas.KEY_NUM6) ||
(keyCode == Canvas.KEY_NUM8)) {
if (diamondPuzzle.audio) bip.play(1);
watchMove(keyCode);
this.keyCode = keyCode;
if (keyCode == Canvas.KEY_NUM8) pressDown = true;
}
if ((keyCode == FullCanvas.KEY_SOFTKEY2) && running) {
running = false;
paused = true;
if (diamondPuzzle.audio) bip.play(1);
inGameOptionScreen gOpt =
66
new inGameOptionScreen(this, d, prev);
}
}
public void keyReleased(int keyCode) {
this.keyCode = 0;
pressDown = false;
}
Pada metode keyPressed, apabila permainan dalam posisi terhenti (paused) maka dapat digunakan sembarang tombol untuk menjalankannya kembali. Sedangkan untuk melakukan pergeseran item, hanya terdapat lima buah tombol yang memungkinkan, yaitu tombol angka 2, 4, 5, 6 dan 8. Untuk penekanan salah satu dari kelima buah tombol tersebut, akan mengeluarkan bunyi beep pada ponsel, dan untuk selanjutnya pergerakan item akan ditangani oleh metode watchMove. Sedangkan penekanan terhadap tombol softkey kanan akan membentuk sebuah instan objek dari inGameOptionScreen untuk menampilkan menu option. Metode keyReleased digunakan untuk menghentikan pergeseran item akibat ditekannya tombol secara terus- menerus (tanpa dilepaskan), pada saat tombol tersebut dilepaskan. Hal ini dimaksudkan agar user dapat melakukan pergeseran berulang dengan menekan tombol secara terus-menerus tanpa dilepaskan, daripada harus menekannya berkali-kali.
3.5.6 Kelas highScoreScreen
Kelas ini digunakan untuk menampilkan layar high score yang berisi data score yang tersimpan pada ponsel. Kelas ini didefinisikan sebagai berikut :
public class highScoreScreen extends FullCanvas
implements Runnable, CommandListener
Kelas ini juga merupakan turunan dari kelas FullCanvas dan mengimplementasi runnable. Sebelum menampilkan layar high score, variabel yang akan digunakan diinisialisasi, dan selanjutnya data score di-load dari memory ponsel. Langkah berikutnya adalah melakukan pemeriksaan terhadap nilai score yang dikirimkan ke konstruktor kelas ini (digunakan untuk penyimpanan score), dimana alur programnya adalah sebagai berikut :
if (minScore() < newScore) {
tB = new TextBox
(" NEW HIGH SCORE", "", 10, TextField.ANY);
tB.addCommand(cmdOk);
tB.setCommandListener(this);
d.setCurrent(tB);
} else d.setCurrent(this);
Metode minScore akan mengembalikan nilai score terendah yang terdapat didalam data score yang di-load sebelumnya, dan nilai ini dibandingkan dengan nilai newScore (score yang dikirimkan ke konstruktor kelas). Apabila nilai newScore lebih besar dari nilai minScore, maka akan dibuatkan sebuah kotak teks untuk menginput nama user. Hal ini juga berlaku apabila banyaknya data score belum mencapai sepuluh. Setelah user selesai menginput nama, maka data user seperti nama, score dan tanggal akan ditambahkan ke data score yang ada menggunakan metode addScore yang isinya sebagai berikut :
private void addScore() {
int i = 0;
Calendar cal = Calendar.getInstance();
while (i < 10) {
if (topScore[i] < newScore) {
for (int j = 9; j > i; j--) {
topScore[j] = topScore[j-1];
topName[j] = topName[j-1];
topTime[j] = topTime[j-1];
}
topScore[i] = newScore;
topName[i] = tB.getString();
topTime[i] = String.valueOf(cal.get(Calendar.DATE))
+ "/" + String.valueOf(cal.get(Calendar.MONTH))
+ "/" + String.valueOf(cal.get(Calendar.YEAR)).
substring(2);
i = 10;
}
i++;
}
if (dataSize < 10) dataSize++;
}
Metode tersebut digunakan untuk menyisipkan data score baru kedalam data score yang telah di-load sebelumnya menurut besar kecilnya score. Hal ini akan menyebabkan data score tersusun secara ascending (dari besar ke kecil). Setelah semua hal yang diperlukan telah siap, maka langkah yang dilakukan berikutnya adalah menampilkan layar high score dengan menggunakan metode paint yang isinya :
public void paint(Graphics g) {
...
int i = 0;
while ((pos*2+i < dataSize) && (i < 2)) {
if (i == 0) g.setColor(0xC8DCF0);
else g.setColor(0xF0F0AA);
g.fillRect(0, i*20+14, getWidth(), 21);
g.setColor(0x0000FF);
g.drawString(String.valueOf(pos*2+i+1) + ".", 12,
i*20+15, g.TOP | g.RIGHT);
g.drawString(String.valueOf(topName[pos*2+i]), 18,
i*20+15, g.TOP | g.LEFT);
g.drawString(String.valueOf(topTime[pos*2+i]), 18,
i*20+25, g.TOP | g.LEFT);
g.drawString(String.valueOf(topScore[pos*2+i]),
getWidth(), i*20+25, g.TOP | g.RIGHT);
i++;
}
if (pos*2+i == dataSize) atEnd = true;
g.setColor(0x000000);
g.setFont(Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_PLAIN, Font.SIZE_SMALL));
g.drawString("Clear All", 0, getHeight()-1, g.BOTTOM |
g.LEFT);
g.drawString("Back", getWidth()-1, getHeight()-1,
g.BOTTOM | g.RIGHT);
}
Karena adanya keterbatasan dimensi layar ponsel, maka banyaknya data score yang mungkin untuk ditampilkan sekali waktu dibatasi menjadi dua buah. Hal tersebut ditangani oleh variabel pos yang menampung nilai halaman dari kelompok data score yang akan ditampilkan. Pada bagian bawah layar, ditampilkan pula dua buah string yaitu ”Clear All” dan “Back” yang digunakan sebagai menu. Penekanan tombol navigasi yang dilakukan oleh user untuk melihat data score sebelum/ sesudahnya dan untuk memilih menu, ditangani oleh metode keyPressed yang isinya :
public void keyPressed(int keyCode) {
if ((getGameAction(keyCode) == Canvas.UP) && (pos != 0))
{
pos--;
atEnd = false;
repaint();
} else if ((getGameAction(keyCode) == Canvas.DOWN)
&& !atEnd) {
pos++;
repaint();
}
else if (keyCode == FullCanvas.KEY_SOFTKEY1) {
clearForm = new Form("Confirm Clear");
StringItem clr = new StringItem(null,
"Are you sure to clear all the High Score List ?");
clearForm.append(clr);
clearForm.addCommand(cmdNo);
clearForm.addCommand(cmdYes);
clearForm.setCommandListener(this);
d.setCurrent(clearForm);
} else if (keyCode == FullCanvas.KEY_SOFTKEY2) {
d.setCurrent(prev);
diamondPuzzle.genList();
}
}
Pada metode ini hanya terdapat empat buah tombol yang akan ditangani, yaitu :
1. Tombol Atas, nilai variabel pos yang menunjukan halaman kelompok data score yang ingin ditampilkan di-decreement untuk menampilkan kelompok data score sebelumnya.
2. Tombol Bawah, nilai variabel pos di-increement untuk menampilkan kelompok data score berikutnya.
3. Tombol Softkey Kiri, digunakan untuk memilih menu ”Clear All” untuk menghapus semua data score yang tersimpan. Untuk mengatasi kemungkinan kesalahan yang dilakukan user pada saat menekan tombol, maka sebelum seluruh data score dihapus, terlebih dahulu dibuatkan sebuah layar konfirmasi yang menanyakan keyakinan user dalam melakukan tindakan penghapusan seluruh data score.
4. Tombol Softkey Kanan, digunakan untuk memilih menu ”Back” yang akan mengarahkan user kembali ke layar menu utama.
3.5.7 Kelas storage
Kelas ini digunakan untuk menangani perintah load, save dan delete untuk me-load, menyimpan posisi ataupun menghapus posisi permainan pada memory ponsel. Semua metode dalam kelas ini didefinisikan sebagai metode statis, sehingga dapat secara langsung dipanggil dari kelas lainnya tanpa terlebih dahulu membuatkan instan objeknya. Metode yang dibuat dalam kelas storage ini adalah sebagai berikut :
1. Metode saveGame, digunakan untuk menyimpan data posisi permainan, yang
memiliki alur program sebagai berikut :
static void saveGame(Display d, Displayable prev) {
try {
recordStore = RecordStore.openRecordStore
("game", true);
recordStore.closeRecordStore();
recordStore.deleteRecordStore("game");
recordStore = RecordStore.openRecordStore
("game", true);
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
DataOutputStream outputStream =
new DataOutputStream(baos);
for (int i = 0; i <= gameScreen.maxX; i++)
for (int j = 0; j <= gameScreen.maxY; j++)
outputStream.writeInt(gameScreen.color[i][j]);
for (int i = 0; i < 3; i++) {
outputStream.writeInt(gameScreen.x[i]);
outputStream.writeInt(gameScreen.y[i]);
outputStream.writeInt
(gameScreen.colorItem[i]);
outputStream.writeInt
(gameScreen.colorNextItem[i]);
}
outputStream.writeBoolean(gameScreen.isNextDiamond);
outputStream.writeBoolean(gameScreen.isNowDiamond);
outputStream.writeBoolean(gameScreen.isNowSpecial);
outputStream.writeBoolean(gameScreen.isNextSpecial);
outputStream.writeInt(gameScreen.score);
outputStream.writeInt(diamondPuzzle.level);
byte[] b = baos.toByteArray();
recordStore.addRecord(b, 0, b.length);
recordStore.closeRecordStore();
} catch (RecordStoreException rse) {
Alert a = new Alert("Save State Error",
"Cannot save game state, " + "check memory space",
null, AlertType.WARNING);
d.setCurrent(a, prev);
} catch (IOException ioe) {}
}
Penyimpanan data dilakukan dengan menggunakan objek RecordStore. Langkah pertama yang dilakukan untuk menyimpan posisi permainan adalah membuat sebuah record kosong dengan nama “game”. Langkah berikutnya adalah mempersiapkan saluran (stream) untuk mengalirkan data kedalam record. Hal ini dilakukan untuk menjembatani perbedaan tipe data antara data yang ingin disimpan dengan data yang dapat diterima oleh RecordStore. Data stream yang digunakan ada dua yaitu ByteArrayOutputStream (sebagai saluran data ke RecordStore) dan DataOutputStream (sebagai saluran data ke ByteArrayOutputStream). Setelah kedua saluran data dibuat, maka langkah berikutnya adalah menyalurkan data yang ingin disimpan ke saluran tersebut. Karena RecordStore hanya dapat menerima data dalam bentuk Array of Byte,
maka langkah terakhir yang dilakukan adalah mengubah tipe data yang telah disalurkan kedalam array untuk selanjutnya disimpan ke RecordStore. Untuk menangani kesalahan akibat tidak tersedianya cukup tempat dalam memory ponsel untuk menyimpan data, maka dibuatkan sebuah layar peringatan untuk menginformasikan hal tersebut kepada user.
2. Metode loadGame, digunakan untuk menyimpan data posisi permainan, yang
memiliki alur program sebagai berikut :
static void loadGame() {
try {
recordStore = RecordStore.openRecordStore
("game", true);
RecordEnumeration re =
recordStore.enumerateRecords(null, null, true);
int id = re.nextRecordId();
ByteArrayInputStream bais = new ByteArrayInputStream
(recordStore.getRecord(id));
DataInputStream inputStream =
new DataInputStream(bais);
for (int i = 0; i <= gameScreen.maxX; i++)
for (int j = 0; j <= gameScreen.maxY; j++)
gameScreen.color[i][j] = inputStream.readInt();
for (int i = 0; i < 3; i++) {
gameScreen.x[i] = inputStream.readInt();
...
}
...
recordStore.closeRecordStore();
75
} catch (RecordStoreException rse) {
} catch (IOException ioe) {}
}
Algoritma untuk me-load data posisi permainan mirip dengan algoritma untuk menyimpan posisi permainan. Awalnya RecordStore dibuka lalu dibuatkan sebuah RecordEnumeration untuk mencacah isi RecordStore satu-persatu mulai dari awal hingga akhir. Karena setiap record dalam RecordStore memiliki ID, maka untuk membaca setiap record dibutuhkan ID sebagai handle dan pengenal dalam pembacaannya. Sama halnya dengan penyimpanan data, pembacaan data membutuhkan saluran (stream) menjembatani perbedaan tipe data, dimana saluran yang digunakan adalah ByteArrayInputStream (sebagai saluran data dari RecordStore) dan DataInputStream (sebagai saluran data dari ByteArrayInputStream). Setelah saluran data dipersiapkan, maka langkah selanjutnya adalah melakukan pembacaan data.
3. Metode delGame, digunakan untuk menghapus data posisi permainan di memory,
yang memiliki alur program sebagai berikut :
static void delGame() {
try {
recordStore.deleteRecordStore("game");
} catch (RecordStoreException rse) {}
}
Untuk menghapus data pada memory ponsel, cukup dengan menghilangkan nama
dari record yang meng-handle record yang ingin dihapus.
4. Metode isSaved, digunakan untuk menguji apakah ada data posisi permainan yang
tersimpan, yang memiliki alur program sebagai berikut :
static boolean isSaved() {
boolean temp = false;
try {
recordStore = RecordStore.openRecordStore
("game", true);
if (recordStore.getNumRecords() > 0) temp = true;
recordStore.closeRecordStore();
} catch (RecordStoreException rse) {}
return(temp);
}
}
Untuk melakukan pengecekan, cukup dengan memeriksa jumlah record yang tersimpan dalam RecordStore. Jika bernilai nol, maka berarti tidak ada data posisi permainan yang tersimpan, demikian pula sebaliknya.
3.6 Uji Coba Program
Uji coba program merupakan hal paling akhir yang dilakukan penulis dalam membangun aplikasi permainan Diamond Puzzle ini. Pada bagian ini penulis mencoba untuk menguji apakah program yang dibuat telah sesuai dengan rancangan awal yang dibuat, dan jalannya program telah sesuai dengan alur yang diharapkan. Untuk menjalankan program, penulis menggunakan sebuah emulator ponsel yaitu Nokia_3510i_MIDP_SDK_v1_0. Emulator ini dapat berfungsi sebagai sebuah ponsel virtual (ponsel Nokia seri 3510i) yang dijalankan pada PC, dan memiliki fungsi serta spesifikasi (fitur, warna, dimensi layar, tombol, suara, dan lainnya) yang sama seperti pada ponsel yang sebenarnya.