Professional Documents
Culture Documents
2008
Pocong Document
http://pocong.wordpress.com/
echo.khannedy@gmail.com
http://pocong.wordpress.com/
8/27/2008
J.E.N.I.
Pemrograman
Game JAVA
Versi 1.1
February 2007
Pemrograman Game Java
Team Penyusun:
1. Eko Subiantoro, S.Pd, SST
3. Sajarwo Anggai
Referensi:
Harbour, S, Jonathan. 2006. Begining Java 5 Game Programing. United States
of America: Course Technology Inc
Mulholland, Andrew, dan Murphy, Glenn. 2003. Java 1.4 Game Programing.
Texas : Wordware Publishing.
1.1 Pendahuluan
atau wawasan yang luas. Apa yang terjadi apabila seorang programer
langsung membuat game tanpa harus mengenal seluk-beluk dari sebuah game
yang akan dibangun?, untuk itu perlu adanya penjelasan atau sosialisasi
tentang game yang nantinya cukup untuk membuka wawasan ketika seorang
bahasan ini kita terlebih dahulu mengenalkan seluk beluk dari sebuah game
1.2 Tujuan
1. Permainan anak-anak
sisi lain beberapa permainan yang lebih akhir (dan biasanya menggunakan
2. Permainan Dewasa
• Catur • Sudoku
3. Permainan Vidio
permainan video yang dimainkan pada komputer pribadi, dan bukan pada
mutakhir.
umumnya internet, sebagai medianya. Permainan online terdiri dari dua unsur
utama, yaitu server dan client. Server adalah penyedia layanan gaming yang
Online Role Playing Game) dari Korea Selatan yang dibuat berdasarkan cerita
dan latar belakang yang sama dari komik korea terkenal berjudul "Ragnarok"
Game ini dibuat oleh Gravity Corporation. Hampir seluruh versi resmi (official)
b) Konsol Permainan
buat adalah Atari, kemudian dilanjutkan dengan Nintendo yang sukses pada
tahun 1985-1989. Konsol permainan modern sekarang ini antara lain adalah
Playstation buatan perusahaan Sony. Untuk Console yang berbentuk kecil dan
Generasi Kedua
Atari 2600
Atari 2600 adalah konsol permainan video sukses yang pertama yang
memiliki 1 atau lebih permainan yang telah ada secara permanen tertanam di
dalam konsol permainan. Pertama kali Atari 2600 dirilis bulan Oktober 1977
dan dikenal dengan nama Atari VCS (Video Computer System) dan kemudian
Atari 5200
Atari 5200 Super System, atau biasa hanya disebut Atari 5200, adalah
konsol permainan video yang pertama kali diperkenalkan pada tahun 1982
oleh Atari, sebagai generasi penerus dari konsol permainan Atari 2600. Atari
bersaing dengan Colecovision setelah perilisan Atari 5200. Konsol ini secara
teknologi lebih unggul dan pengeluaran biaya yang lebih efisien dibanding
konsol lain yang ada waktu itu. Tetapi, sejumlah cacat dan kekurangan pada
Generasi Ketiga
Atari 7800
Atari 7800 adalah konsol permainan video yang di rilis oleh Atari pada
bulan Juni 1986. Atari 7800 di desain untuk menggantikan konsol Atari 5200
yang kurang sukses di pasaran, dan bertujuan untuk mendirikan lagi supremasi
pasar Atari melawan Intellivision and Colecovision. Dengan sistem konsol ini,
Atari menanggapi semua kekurangan Atari 5200 memiliki joystick yang simpel,
kompatibel penuh dengan sistem konsol sebelumnya yaitu Atari 2600 dan
dapat digunakan sebagai hadiah (karena harganya pada waktu itu $140).
permainan video 8-bit yang dirilis oleh Nintendo di Amerika Utara, Brasil,
Eropa, Asia dan Australia. Versi Jepangnya dikenal dengan nama Nintendo
permainan paling populer saat itu di Asia dan Amerika Utara, NES membantu
Super Mario Bros, merupakan killer game pertama sistem ini) sampai ke pola
bisnis.
Generasi Keempat
Sega Mega Drive adalah konsol permainan video yang dirilis oleh Sega
di Jepang pada tahun 1988 dengan kemampuan 16-bit, dan dirilis di Amerika
Utara pada tahun 1989. Sementara di Eropa dan tempat lainnya dirilis tahun
menggunakan nama Mega Drive di wilayah itu. Sega Mega Drive adalah
saingan dari Super Famicom (Super Nintendo), walaupun Sega Mega Drive
telah dirilis 2 tahun lebih awal. Jumlah unit yang terjual adalah 29 juta, dan
perangkat lunak permainan yang paling terkenal adalah Sonic the Hedgehog.
Nintendo, Super NES or SNES, adalah konsol permainan video 16-bit yang
dirilis oleh Nintendo di Amerika Utara, Brasil, Eropa dan Australia. Di Jepang ia
Elecronics.
Generasi Kelima
konsol permainan video yang dirilis pada tahun 1993 dan 1994 oleh Panasonic,
dibuat menurut spesifikasi yang dibuat oleh perusahaan 3DO, dan didesain
oleh Dave Needle dan RJ Mical dari New Technology Group. Sistem konsol ini
besar, konsol ini menjadi mahal ($699.95 dollar Amerika saat dirilis), membawa
Sega Saturn
1994 di Jepang, tanggal 11 Mei 1995 di Amerika Utara dan 8 Juli 1995 di
Eropa. Konsol ini bertahan di Amerika Utara dan Eropa sampai akhir 1998, dan
di Jepang sampai akhir tahun 2000. Game terakhir yang dirilis untuk konsol ini
bulan desember 2000. Beberapa judul permainan yang terkenal adalah Sonic
the Hedgehog, Super Monkey Ball, Crazy Taxi, Virtua Fighter, Phantasy Star
Nintendo 64
Sony PlayStation dan Sega Saturn. Teknologi tersebut antara lain teknologi
menjelajahi ruang 3-D dengan lancar. Teknologi stik analog membuka babak
baru dalam pengontrolan dari ruang 2-D ke ruang 3-D, dan sangat sukses
sehingga kompetitor lain seperti Sony PlayStation dan Sega Saturn mengikuti
Nintendo dengan menyertakan stik analog dalam konsol game buatan mereka.
64 juga mendapat posisi pertama dan terpilih sebagai console game terbaik
data, yang lebih mahal dan lebih susah dicopy/dibajak dibandingkan dengan
software Nintendo 64 berakhir pada tahun 2001 setelah rilis sekitar 350 judul
PlayStation
PlayStation adalah konsol permainan grafis dari era 32-bit. Pertama kali
beberapa yang terkenal adalah: Tomb Raider, Final Fantasy, Resident Evil,
Bandicoot, Spyro, dan seri Metal Gear Solid. Pada 18 Mei 2004, Sony telah
memproduksi 100 juta PlayStation dan PSOne ke seluruh dunia. Pada Maret
2004, sebanyak 7.300 judul permainan telah tersedia dengan jumlah akumulasi
949 juta.
Emulation di PC untuk PS
Saat ini hampir semua game PlayStation dapat dimainkan di PC. Hal ini
dapat dicapai dengan bantuan Emulator. Emulator yang paling terkenal adalah
ePSXe. ePSXe bekerja dengan konsep Plug-In, yang berarti user harus
pertama-tama meload Plug-In grafik atau suara ke memori. Selain itu ePSXe
juga hanya dapat bekerja menggunakan BIOS original PlayStation, yang bisa
Generasi Keenam
PlayStation 2
PlayStation 2 (PS2) adalah konsol video game kedua dari Sony, setelah
pertama kali di Jepang pada 4 Maret 2000. Versi AS dilepas pada 26 Oktober
namun saat ini telah tumbuh menjadi konsol game paling populer dengan
dan merupakan penerus dari konsol permainan Sega Saturn dan konsol
Xbox. Dreamcast secara umum dianggap mengungguli waktu itu dan pada
Playstation 2 pada bulan maret 2000 dan Sega akhirnya memutuskan untuk
permainan video.
Nintendo GameCube
konsol permainan rumah keempat dari Nintendo, dan masuk dalam permainan
keenam yang paling kecil dan murah. GameCube dirilis pada 14 September
Xbox
Februari 2002 di Jepang, dan 14 Maret 2002 di Eropa. Xbox adalah pendahulu
dari konsol Xbox 360. Beberapa judul perangkat lunak permainan yang terkenal
Memory Card.
Generasi Ketujuh
Playstation 3
bersaing dengan Xbox 360 dari Microsoft dan Wii dari Nintendo.
pukul tujuh, dan akan dirilis pada tanggal 17 November 2006 di Amerika Utara
(Amerika Serikat dan Kanada), Hong Kong dan Taiwan, dan 1 atau 7 Maret
2007 di Eropa dan Australasia, dan wilayah PAL lainnya. PlayStation 3 akan
diperkenalkan kepada dunia pada tanggal 16 Mei 2005 di E3. Konfigurasi final
Wii
yang merespon terhadap letaknya dalam ruang fisik tiga dimensi yang terletak
di depan televisi. Pada tahap awal pengembangan, konsol ini diberi nama
Revolution.
September 2005. Konsol ini dirilis pada November 2006 di AS dan Desember di
Jepang dan beberapa wilayah lainnya, dan bersaing dengan PlayStation 3 dan
Xbox 360.
Berbeda dari Xbox 360 dan PlayStation3, Wii lebih menitik beratkan
yang dimiliki kedua konsol tersebut. Wiimote merupakan kontroler baru yang
beberapa jenis game), bentuknya yang kecil, serta harga yang murah
konsol saingannya.
Wii merupakan konsol game generasi baru dengan harga rilis termurah
paket dengan Wii Sports, sebuah game olah raga (tennis, baseball, bowling,
permainan terbarunya.
yang digunakan GameCube, sementara untuk yang konsol lainnya hal ini
diperoleh melalui jasa konsol virtual (Virtual Console) yang merupakan salah
satu fitur Wii. Melalui Virtual Console, pengguna Wii dapat membeli dan
Wii Shop.
penjualan Playstation 3 dan hampir mendekati angka penjualan Xbox 360 yang
Xbox 360
dengan nama Xenon atau Xbox 2, adalah penerus konsol permainan video
dibeberkan di akhir bulan yang sama dalam Expo Electronic Entertainment (E3)
yang terkenal. Saat dirilis pada 22 November 2005 di Amerika Utara dan
terbaru dan akan bersaing dengan Sony PlayStation 3 dan Nintendo Wii. Xbox
360 adalah konsol pertama yang dapat memutar film HD-DVD dengan membeli
paketnya terlebih dahulu, yang akan direlease kemudian. Xbox 360 juga adalah
konsol pertama yang menggunakan stik wireless. Andalan Xbox 360 adalah
grafis dan kemampuan onlinenya. Xbox Live adalah salah satu fitur online yang
untuk merajut sebuah cerita bersama. Para pemain memilih aksi tokok-tokoh
tergantung dari sistem peraturan permainan yang telah ditentukan. Asal tetap
Pada sebuah permainan RPG, jarang ada yang "kalah" atau "menang".
Ini membuat permain RPG berbeda dari jenis permainan papan lainnya seperti
Monopoli atau Ular Tangga, permainan kartu, olah raga, dan permainan
lainnya. Seperti sebuah novel atau film, permainan RPG mempunyai daya tarik
kompetisi. Pada umumnya dalam RPG, para pemain tergabung dalam satu
kelompok.
Ada pula sejenis permainan RPG di mana para pemain bisa melakukan
gerakan fisik tokohnya oleh si pemain sendiri. Ini disebut Live-Action Role-
playing atau LARP. Dalam permainan LARP, biasanya para pemain memakai
kostum dan mengunakan alat-alat yang sesuai dengan tokoh, dunia dan cerita
membuat istilah RPG dikenal untuk RPG elektronik saja, dan mengakibatkan
munculnya istilah RPG "pen and paper" atau "tabletop" untuk mendeskripsikan
RPG tradisional.
peraturan (rulebook) dan, kadang kala, sebuah buku dunia (campaign setting)
yang akan mereka gunakan. Tahap ini sangat penting karena buku-buku ini
terperinci dan kompleks, mantera-mantera baru, senjata dan jenis tokoh baru),
buku-buku dunia yang lebih terperinci (contohnya adalah buku "Silver Marches"
negeri Silver Marches yang lebih lengkap dari buku dunia Forgotten Realms).
Tentunya, buku-buku ini tidak wajib untuk bermain, tapi bisa memberikan detil-
detil dalam permainan yang bisa membuat sebuah dunia khayalan lebih
dengan title bar, tombol close dll. Bagaimanapun juga bagian dari user
atau tampilan dari sebuah game, tanpa desktop antarmuka pengguna seperti
title bar, task bar, dll. Dengan model ini para pemain akan menjadi lebih tertarik
2.1 Pendahuluan
mendefinisikan banyak object seperti suara, gambar, dan grafik geometri yang
begitu banyak, untuk itu dibutuhkan suatu manajemen yang menangani hal
tersebut atau lebih tepatnya sebuah object untuk menangani object-object dari
gambar atau grafik yang dibuat. Java telah menyediakan sebuah container atau
collection yang digunakan untuk menangani hal tersebut. Selain itu, seiring
dengan banyaknya object gambar atau grafik geometri yang dibuat maka
proses yang dibutuhkan juga memakan waktu yang cukup lama dimana dalam
java penggambaran object itu dilakukan 1000 kali per detik yang sangat
memberatkan kinerja dari procesor, oleh sebab itu dibutuhkan thread untuk
menangani hal terebut agar komputer berjalan dengan normal sesuai dengan
keinginan.
2.2 Tujuan
object sederhana yang menampung lebih dari satu elemen di dalam satu
sebenarnya seperti Poker (kumpulan dari kartu), direktori (kumpulan dari file
SDK tidak menyediakan implementasi built-in yang lain dari interface ini
interfaces.
<root interface>
Collection
turunan dari collection framework. Pada Java 2 vektor diperluas lagi dengan
Vector();
Vector(int size);
Vector(int size,int incr);
ukuran awal dan apabila ukurannya full maka akan ditambah lagi sebanyak
incr. Dibawah ini beberapa method yang disediakan oleh class Vector.
Method Keterangan
Digunakan untuk menambahkan data object ke
addElement(<object>)
dalam Vektor.
Method ini berfungsi untuk mengambil elemen
elementAt(<index>)
berdasarkan nomor index yang dimasukan.
Berfungsi untuk mengambil nilai berupa object yang
lastElement() paling terakhir di tambahkan dari sebuah object
vektor.
Berfungsi untuk mengambil nilai berupa object
firstElement() pertama yang di tambahkan dari sebuah object
vektor.
Digunakan untuk menghapus seluruh elemen yang
clear()
tersimpan dalam object vector.
Memeriksa apakah verktor yang digunakan berisi
isEmpty() elemen atau tidak. Jika ada data maka akan
mengembalikan nilai boolean berupa false.
ArrayList hampir mirip seperti vektor. Pada JDK 1.1 ArrayList 3-4 kali
lebih cepat dari pada Vektor, sedangkan pada JDK 1.1.4 ArrayList 40 kali lebih
dibawah ini.
Method Keterangan
Digunakan untuk menambahkan data object ke
add(<object>)
dalam ArrayList.
Method ini menyediakan dua parameter untuk
add(<index>,<object>) menambahkan sebuah object dengan menentukan
nomor index elemennya.
Method get adalah method yang disediakan oleh
get(<index>) ArrayList untuk mengambil sebuah object
berdasarkan nomor indexnya.
Mothod ini berfungsi untuk menghapus elemen
remove(<index>)
ArrayList berdasarkan nomor indexnya.
Digunakan untuk memeriksa apakah object ArayList
isEmpty()
yang dibuat kosong atau tidak.
Menghapus semua elemen yang ada di dalam
clear()
object ArrayList.
2.3.3 LinkedList
Method Keterangan
Digunakan untuk menambahkan data object ke dalam
add(<object>)
LinkedList.
size() Mengambil jumlah elemen pada object LinkedList
Mengambil nilai elemen berdasarkan nomor index yang
get(<index>)
ada pada object LinkedList
addFirst() Menambahkan object pada elemen awal
addLast() Menambahkan object pada elemen akhir
getFirst() Mengambil nilai elemen pertama
getLast() Mengambil nilai elemen terakhir
clear() Menghapus semua nilai elemen pada object LinkedList
Method remove tanpa parameter akan menghapus
remove()
elemen pertama
Parameter akan menunjukan elemen mana yang akan
remove(<index>)
dihapus
2.4 Thread
Sebuah thread dapat dengan mudah dibuat dan jalankan dengan cara
Saat menjalankan kode diatas tentu saja tidak akan ada yang terjadi
selain aplikasi jalan dan langsung mati. Ketika menjalankannya JVM akan
membuat sebuah thread baru dan secara default akan memanggil method
run(), dalam hal ini run() kosong sehingga thread akan langsung mati. Berikut
kemungkinan seorang programer tidak ingin menulis class baru setiap kali ingin
konstruktor dengan object Runnable (dalam hal ini class MyThread sendiri),
Sebuah thread dapat dibuat tanpa harus membuat class baru ataupun
new Thread() {
public void run() {
System.out.println("saya adalah Thread");
}
}.start();
Cara diatas tidak lazim digunakan karena dapat beresiko terhadap sebuah
program apabila kode dalam method run() semakin besar.
Suatu saat sebuah thread perlu dihentikan untuk sementara waktu untuk
try{
Thread.sleep(1000);
}catch(Exception e){}
milidetik). Selama thread dalam kondisi sleep, thread tidak memerlukan kinerja
dari cpu. Kondisi sleep pada sebuah thread akan dimanfaatkan untuk
bersiap-siaplah melihat program tak terkendali atau bahkan mati. Method stop()
penanda, ketika penanda bernilai true maka thread tidak lagi dijalankan.
thread. Cara ini biasa digunakan pada sistem blocking. Sistem blocking adalah
flag di set. Kondisi ini setidaknya membuat thread harus menyelesaikan proses
public MyThread(){
t=new Thread(this);
t.start();
}
public void run(){
while(!t.isInterrupted()){
System.out.println(“saya adalah thread”);
}
}
}
Apa yang terjadi ketika dua thread menggunakan variabel yang sama?
Bisa saja salah satu thread mencoba mengkases data yang telah di hapus oleh
thread lainya. Dalam hal ini kedua thread harus di sinkronisasi sehingga
mengunci sebuah object, ketika sebuah object terkunci maka tidak ada yang
yang sama. Suatu saat thread a mencoba mengambil data dalam variabel
Asumsikan kedua buah thread ingin mengakses object gamePlayer yang sama.
//Thread A
int lives=gamePlayer.getLives();
gamePlayer.setLives(lives-1);
//Thread B
int lives=gamePlayer.getLives();
gamePlayer.setLives(lives-1);
// Thread A
public void waitForMessage() {
while (hasMessage == false) {
Thread.sleep(100);
}
}
// Thread B
public void setMessage(String message) {.....
hasMessage = true;
}
berikutnya thread akan sleep selama 100 ms. Kode tersebut memang bekerja,
tetapi apa yang terjadi jika hasMessage di set ketika Thread A dalam keadaan
informasi. Dengan method wait dan notify hal ini dapat di selesaikan. Thread a
telah siap.
// Thread A
public synchronized void waitForMessage() {
try {
wait();
}
catch (InterruptedException ex) { }
}
// Thread B
public synchronized void setMessage(String message) {
...
notify();
}
Seperti yang terlihat diatas apabila method waitForMessage() di panggil
3.1 Pendahuluan
mouse dan keyboard yang akan memberikan dampak atau perubahan kepada
suatu objek. Hampir keseluruhan game komputer menggunakan dua item ini,
dimana didalam java dikenal dengan istilah “event handling”. Sebenarnya event
handling di java tidak hanya sebatas pada mouse dan keyboard saja tetapi juga
objek-objek lain seperti item listener, componen listener dst, tetapi disini hanya
contoh, apabila ingin mengetahui tombol apa yang ditekan maka disinilah
fungsi event handling, tidak hanya itu tetapi masih banyak lagi seperti jika
tombol space ditekan maka bom akan meledak, apabila tombol enter ditekan
3.2 Tujuan
dan keyTyped . Ketiga parameter dari method ini hanya mempunya satu
menambahkan definisi dari class yang telah dibuat dengan menggunakan kata
Fitur Yang paling menarik dari implements pada java adalah dapat
mendengarkan aksi dari keyboard, agar key event akan di kirim oleh Java
method ini akan di turunkan pada class yang akan direpresentasikan dengan
dalam program dimana konstruktor akan di panggil pertama kali ketika sebuah
program dijalankan.
Ada tiga jalan untuk menentukan key yang telah ditekan atau dilepaskan
akan mengirimkan nilai bertype char, tetapi jika ingin mengetahui kode apapun
mengembalikan hasil berupa “a”(atau “A” jika menggunakan huruf besar), tetapi
yaitu VK_A. Semua dari kode tombol virtual terdapat di dalam class KeyEvent.
Tabel dibawah ini menampilkan sebagian daftar dari kode tombol virtual yang
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
int KodeTombol;
char KarakterTombol;
tombol yang kita tekan disetiap kita menekan tombol pada keyboard. Method
sedangkan method repaint() dipanggil ketika ada perubahan atau ketika tombol
menggunakan aksi yang dihasilkan oleh Java Runtime Environment (JRE) dan
Langkah pertama yang harus diambil untuk menangani aksi dari mouse
di dalam program adalah memanggil kedua fungsi yang berikan oleh JRE yaitu
harus diinialisasi, fungsi ini sama seperti yang telah dipelajari pada saat
menangani keyboard.
addMouseListener(this);
addMouseMotionListener(this);
aksi tombol yang hampir sama seperti interface pada keyboard. Class
dalam window, dan lokasi mouse ketika kursor mouse kedalam dan keluar dari
window.
diklik,ditekan, atau dilepaskan. Salah satu method yang yang tidak terhubung
ketiga method itu terhubung ketika terjadi aksi terhadap posisi dan pergerakan.
kemudian digunakan oleh JRE untuk mengirimkan action yang terjadi pada
mouse. Pada class ini terdapat mthod untuk mengetahui posisi mouse dan nilai
dari tombol mouse. Untuk nilai posisi mouse x dan y, dapat menggunakan
menjadi (MouseEvent e), untuk itu pada prakteknya gunakan e.getX() dan
e.getY() untuk mengetahui posisi dari mouse. Demikian juga, MouseEvent akan
memberitahu tombol mana yang telah ditekan. Pada MouseEvent ada sebuah
method getButton() yang fungsinya sama tergantung dari tombol yang telah
yang baru saja dipelajari. program ini menggunakan kode class Graphics,
semua aksi mouse secara satu persatu. Gambar 3.13 dibawah ini menampilkan
program ketika class tersebut dipanggil. Oleh sebab itu di method inilah dimana
variabel dan object game diinialisasi, dan disini juga dapat ditempatkan listener
tidak.
TestMouse(){
setTitle("Test Mouse");
addMouseListener(this); // listener tombol mouse
addMouseMotionListener(this);// listener pergerakan mouse
setSize(300, 200);
setVisible(true);
setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}
jendela. Sejak paint() dengan parameter (Graphics g), object ini dapat
Graphics.drawString().
yang kami tulis untuk menangani aksi pada mouse. Method chekButton() ini
ditekan.
dari Mouse yang didefinisikan dalam interface ini atau akan mendapatkan
meninggalkan jendela aplikasi. Kedua aksi ini tidak sering dibutuhkan dalam
pembuatan game.
menekan dan melepaskan tombol mouse. Ketika kedua aksi tersebut terjadi,
posisi akhir dari mouse dapat diambil baik ketika ditekan atau dilepaskan.
mouse selalu di dalam sebuah class yang sama, sekarang akan dibuat class
sendiri untuk menangani aksi yang terjadi pada keyboard dan mouse yang
tombol mouse beserta kode dan karakter tombol pada keyboard dengan
....................
....................
....................
for(int i=0;i<9;i++) {
tf[i]=new JTextField(30);
tf[i].setEditable(false);
tf[i].setFocusable(false);
l[i]=new JLabel(label[i]);
kemudian memberikan nilai false pada method setEditable() agar tidak dapat di
edit dan method setFocusable() supaya kursor tidak terarah langsung pada
hkm=new HandlingKeyboardMouse(tf);
p2.addMouseListener(hkm);
p2.addMouseMotionListener(hkm);
addKeyListener(hkm);
diatas kemudian diproses sesuai kebutuhan dimana pada class ini texfield
karakter dan kode tombol pada keyboard yang berada di dalam methode
update(), mothod ini selalu di panggil ketika ada aksi yang terjadi pada
4.1 Pendahuluan
game yang dibangun lebih semakin hidup dan terasa nyata, hal ini juga yang
permainan tidak ada suara sama sekali. Efek suara sangat diperlukan oleh
game misalnya ketika sebuah objek mengalami tabrakan, ledakan bom, suara
tembakan, dll.
4.2 Tujuan
• Mengetahui perbedaan antara file berekstensi midi dan (Aiff, Au, Wav)
• Mengetahui cara menggunakan class File dan URL untuk meload file suara
1. AIFF
2. AU
3. WAV
import javax.sound.sampled.*;
diikuti dengan titik maka akan terlihat package di dalamnya yaitu sampled dan
sebuah suara.
AudioInputStream. Class ini digunakan untuk memuat sebuah file suara dari file
lokal dimana program diletakkan atau dari URL lain di internet. Berikut ini
AudioInputStream suara;
didefinisikan pada baris-baris awal dalam class sebelum semua method ditulis.
Selain itu juga dapat didefinisikan sebagai variable private, public, atau
objek, public memposisikan variable agar dapat diakses oleh class lain diluar
diakses dari class lain, sedangkan protected hampir mirip dengan private hanya
menggunakannya.
konstruktor. Method yang digunakan untuk memuat sebuah file suara adalah
InputStream atau URL, ada dua cara untuk membuat audio stream
menerima input berupa string dari nama file, maka harus melewatkan sebuah
objek File kedalamnya. Cukup mudah menggunakan objek dari File, hanya
dengan memberikan nama file pada kontruktor method File. Apabila ingin
mengambil sebuah file dari sebuah URL, kode yang digunakan adalah sebagai
berikut :
Apabila ingin mendistribusikan program java yang telah dibuat dan ingin
dan new URL() untuk memuat semua sumber (seperti sebuah file gambar atau
tersebut :
untuk memainkanya. Untuk itu, perlu menggunakan class lain yang bernama
Clip, jadi hanya perlu untuk membuka file suara dan memainkannya. Langkah
ini dua-duanya dilakukan oleh class Clip. Pertama , bukalah file suara :
klip.open(suara);
Berikutnya, ada dua cara atau method untuk memainkan klip, dengan
klip.start();
seberapa banyak klip akan diulang. baik dengan jumlah tertentu maupun tak
hingga. Dibawah ini kode yang memungkinkan untuk memainkan klip suara
klip.loop(0);
ini adalah bagaimana agar klip suara dapat dimainkan terus menerus :
klip.loop(Clip.LOOP_CONTINOUSLY);
yang telah dimainkan padahal tidak semua suara dimainkan terus menerus
seperti suara tabrakan dll, untuk itu jika ingin menghentikan klip suara dapat
klip.stop();
adalah sebuah kumpulan format musik, bukan sebuah format sample, artinya
Perlu diketahui bahwa file berekstensi (aiff,au dan wav) berukuran cukup
besar, sedangkan aplikasi tidak ingin pengguna menunggu lima menit atau
open(), jadi ketika anda mencoba untuk membuka sebuah file suara berukuran
besar, maka method ini akan memaksa pengguna untuk menunggu selama
waktu download klip suara. Hal ini yang dapat menjawab permasalahan
Memuat file MIDI memerlukan sedikit lebih banyak cara dari pada
memuat file berekstensi (aiff,au dan wav). Hal ini karena file MIDI dimainkan
melalui sequencer, kita belum sama sekali membuat instance dari sequencer:
ambilSuara.setSequence(suara);
penentu:
ambilSuara.setLoopCount(1);
Apabila ingin dimainkan secara terus menerus tanpa henti gunakan kode
berikut:
ambilSuara.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
menggunakan blok try... catch. Sebagai contoh, ketika memuat sebuah file,
• IOException
• LineUnavailableException
• UnsuportedAudioFileException
KONSTRUKTOR(){
try {
//kode program
} catch (MalformedURLException e){
} catch (IOException e){
} catch (LineUnavailableException e){
} catch (UnsuportedAudioFileException e){}
}
penanganan error yang tidak jauh berbeda dengan class Class AudioSystem,
berikut:
KONSTRUKTOR(){
try {
// kode program
} catch (InvalidMidiDataException e) {
} catch (IOException e) {
} catch (MidiUnavailableException e) { }
}
mendengarkan suara.
import java.io.*;
import java.net.*;
import javax.sound.sampled.*;
public OperasiSuara(){
try{
klip = AudioSystem.getClip();
}catch(LineUnavailableException e)
{System.out.println("Terjadi kesalahan pada klip suara :
"+e.toString());}
}
klip.setFramePosition(0);
if(looping)
klip.loop(Clip.LOOP_CONTINUOUSLY);
else
klip.loop(repeat);
}
public void stop(){
klip.stop();
}
}
yang disediakan di class ini dan tanpa harus menuliskannya secara berulang-
ulang.
import java.io.*;
import java.net.*;
import javax.sound.midi.*;
public OperasiMidi(){
try{
ambilSuara = MidiSystem.getSequencer();
ambilSuara.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
ambilSuara.start();
}else{
ambilSuara.setLoopCount(repeat);
ambilSuara.start();
}
}
5.1 Pendahuluan
dimensi dimana terdapat banyak method yang sudah disediakan oleh Java
rectangle dan masih banyak lagi. Grafik vektor merupakan pelajaran dasar
modul ini juga dibahas masalah tentang penanganan grafis full screen dimana
game yang akan dibuat dapat dimainkan dalam satu layar penuh.
5.2 Tujuan
yang ada didalam Graphics2D tidak hanya menggambar saja tetapi juga dapat
koordinat yang pertama user space adalah koordinat yang digunakan oleh
Yang kedua yaitu device space adalah sistem koordinat device yang
Gambar dibawah ini menunjukan perbeadaan antara user space dan device
space.
X=0,y=
Y
Y
X=0,y=
User Space Device Space
Gambar 5.1 Sistem Koordinat
5.5 Interface Shape
seperti titik, garis, sudut, persegi panjang, kurva, dan elips seperti terlihat pada
Tipe yang paling dasar dari shape adalah garis, dibuat dengan class
dengan (100,100).
class dengan inner class Float dan Double untuk itu harus menggunakan
masing-masing sudut.
Tipe dari shape yang sangat beguna adalah Arc2D. Yang perlu
kanan atau dari arah jam 3. Perlu diingat bahwa penentuan sudut berlawanan
dengan arah jarum jam. Ada tiga macam parameter akhir yang digunakan pada
Arc2D yaitu:
OPEN
PIE
potongan dari pie dimana garis kurva merupakan garis luar dari elipse dan
CHORD
polygon cukup dengan sebuah titik tunggal atau sebuah polygon dengan empat
dan Y, jadi sebaiknya mendesain polygon pada kertas atau editor grafik terlebih
polygon atau yang lain, ada dua method pilihan yaitu method fill() untuk
method draw() untuk menggambar garis luar / border dari sebuah bentuk dalam
warna tertentu.
jenis warna.
menggunakan getDefaultScreenDevices.
ketajaman bit (banyaknya bit per pixel), dan refresh rate (frekwensi monitor
dan jika ingin menampilkan semua mode display yang didukung gunakan
nilai true berarti sistem operasi mendukung untuk merubah display mode.
....
....
if (device.isDisplayChangeSupported())
{
device.setDisplayMode(displayMode);
}else{
System.out.println("Sistem Operasi Tidak Mendukung Mode
DisplayChange");
System.exit(0);
}
....
....
}else{
System.out.println("System tidak mendukung Mode Full-screen");
}
dan bingkai pada frame, sedangkan method setResizeable() diberi nilai false
argumen yang dilewatkan adalah JFrame. Perlu diketahui bahwa JFrame yang
yang akan digunakan untuk menentukan tinggi dan lebar layar yang diinginkan
hanya dengan menentukan array dari resolusi yang telah disediakan, listing
berupa boolean yang artinya jika tidak cocok dengan kondisi yang diperiksa
diatas maka akan mengembalikan nilai false. Method ini akan dipanggil di
parameter untuk menentukan index array yang akan di gunakan. Berikut ini
operasi yang kita gunakan dan selanjutnya akan di cross-cek apakah sama
kita membuat satu method lagi yaitu tutupScreen() yang akan dipanggil apabila
mode full-screen dan mengembalikan nilai null apabila tidak dalam keadaan
mode full-screen. Method dispose() yang berada dalam class Window berfungsi
dibuat sekarang mari kita mencoba untuk memanggil dan menjalankan method-
method yang ada didalam class tersebut seperti pada baris program berikut ini:
........
private ScreenManager screen;
public void () {
screen = new ScreenManager();
try {
DisplayMode displayMode = screen.setResolusiLayar(1);
screen.setFullScreen(displayMode,new PercobaanArc2d());
}
catch (Exception e){
screen.restoreScreen();
}
}
.......
Pada potongan kode diatas kita membuat object dari DisplayMode yang
argument pertama dan class yang akan ditampilkan dalam mode full-screen
method restoreScreen() dipanggil apabila terjadi eror atau jika ingin menutup
mode full-screen.
6.1 Pendahuluan
Inti dari game 2 dimensi sebenarnya terletak pada image, dimana image
yang telah dibuat ataupun diedit dari program seperti adobe photoshop, corel
draw dll, kemudian diurutkan menjadi satu bentuk. Sebagai contoh sebuah
pesawat yang untuh sampai pada pesawat yang hancur atau meledak
ilustrasinya seperti itu dan masih banyak lagi yang lain sesuai dengan game
6.2 Tujuan
24 bit per pixel, dimana 1 byte untuk merah, hijau dan biru (komponen RGB).
File JPEG sangat bagus untuk gambar foto yang berukuran besar seperti
menggantikan file GIF, dimana format ini menyertakan sebuah chanel Alpha
untuk efek game seperti tembakan laser, asap, dll. Beberapa pengembang
maka program kita tidak akan pernah tahu kapan pemuatan gambar selesai
dilakukan, hasilnya gambar yang akan kita tampilkan bisa saja ditampilkan
sebagian karena belum selesai di muat atau bahkan tidak sama sekali.
MediaTracker, kita dapat menggunakan class ini agar aplikasi kita menunggu
membosankan jika harus melakukanya untuk setiap gambar yang akan dimuat
(bayangkan jika memuat 100 gambar). Ada cara yang lebih mudah yaitu
Image logo=null;
try
{
logo = ImageIO.read(new File(“test.jpg”));
}
catch(IOException e)
{
System.out.println(e);
}
BufferedImage im;
ImageIO lebih cepat 10% dari class ImageIcon, dan mungkin bisa semakin
kepentingan lebih lanjut, BufferedImage yang akan kita buat akan di sesuaikan
try {
BufferedImage im =
ImageIO.read(getClass( ).getResource(fnm));
g2d.drawImage(im,0,0,null);
g2d.dispose( );
return copy;
}
catch(IOException e) {
System.out.println("Load Gambar " + fnm + " eror :\n" + e);
return null;
}
dalam game sebuah object nantinya tidak hanya terdiri dari gambar statis yang
bergerak hanya karena transformasi. Pada game 2 dimensi setiap object bisa
sequencial animasi suatu karakter. Dengan teknik ini gambar tidak akan di
akan kita anggap sebagai frame). Teknik kedua adalah menggunakan gambar
yang berbeda untuk setiap frame namun dengan nama sama plus identitas
Class Image Manager yang kita buat akan menggunakan sebuah object
HashMap untuk memetakan setiap object gambar dengan sebuah kunci unik.
nama sebagai parameter. Setiap nilai yang di simpan dalam HashMap adalah
dalam HashMap bisa berisi lebih dari satu gambar. Mungkin class ini sedikit
rumit dan membingungkan, tetapi class ini akan sangat berguna untuk
postfiks urutan gambar, dan method terakhir digunakan untuk memuat gambar
HashMap).
method pemuatan gambar yang telah dibahas. Method ini mengembalikan nilai
berhasil dimuat.
if (imagesMap.containsKey(name)) {
System.out.println( "Error: " + name + " sudah digunakan");
return false;
}
BufferedImage bi = loadImage(fnm);
if (bi != null) {
ArrayList imsList = new ArrayList( );
imsList.add(bi);
imagesMap.put(name, imsList);
System.out.println(" disimpan " + name + "/" + fnm);
return true;
}
else
return false;
}
memisahkan prefix dan postfix lalu menambahkan urutan gambar setelah prefix
dugunakan sebagai kunci HashMap adalah prefix dari parameter method ini.
if (loadCount == 0)
System.out.println("Tidak ada images dengan nama " +
prefix);
else
imagesMap.put(prefix, imsList);
return loadCount;
}
file citra. Biasanya gambar strip digunakan untuk animasi dengan pixel yang
Cara kerja dari method yang akan kita buat adalah memisahkan setiap
if (loadCount == 0)
System.out.println("Tidak ada image dengan prefix " +
name);
else
imagesMap.put(name, imsList);
return loadCount;
}
BufferedImage stripIm;
if ((stripIm = loadImage(fnm)) == null) {
System.out.println("Return null");
return null;
}
stripGC = strip[j].createGraphics();
stripGC.setComposite(AlphaComposite.Src);
stripGC.drawImage(stripIm,0,0, imWidth,imHeight,
fx,fy, fx+imWidth,fy+imHeight,null);
stripGC.dispose();
}
}
return strip;
}
Bagian kode yang di cetak tebal adalah fungsi utama dari method
pada method drawImage digunakan dua buah variabel yaitu fx dan fy. Kedua
int fx=(j%column)*imWidth;
int fy=i*imHeight;
modulo nomor kolom dengan jumlah kolom di kali besar gambar per potong.
strip menggunakan prefix dari gambar tersebut. Ada tiga versi untuk
gambar, versi kedua menerima dua parameter yaitu nama gambar dan posisi
gambar dalam ArrayList dan versi ketiga mengembalikan semua gambar yang
return imsList;
}
gambar animasi) di tampilkan ke layar, akan dibuat sebuah class lagi yang
khusus menangani gambar animasi. Class ini akan mengatur urutan gambar
ImageManager.
kedua parameter ini akan sangat berpengaruh jika animasi yang dijalankan
jumlah gambar yang ada dalam sebuah ArrayList. Nilai seqDuration harus
cukup besar hingga hasil bagi (showPeriod) dengan jumlah gambar masih
animasi tidak pernah berhenti pada saat semua urutan gambar telah
ditampilkan.
ActionListener dll. Class listener ini memiliki sebuah method abstract yang
7.1 Pendahuluan
Pada sebuah game skala rotasi dan translasi sangat dibutuhkan ketika
membuat sebuah game yang menggunakan grafik vektor dan grafik bitmap.
memper kecil ukuran peta ataupun merotasi arah dari object seperti pesawat,
dll.
7.2 Tujuan
7.3 Translasi
Translasi adalah bentuk yang paling sederhana dari transformasi, yaitu
x’ = x + tx
y’ = y + ty
ini:
g2d.translate(nilai1, nilai2);
g2d.fill(shape);
Dengan demikian maka object yang akan digambar dengan fill atau draw
akan dipidah dari koordinat lama ke koordinat yang baru, diamana nilai1 dan
nilai2 akan ditambahkan ke posisix dan posisiy yang pertama kali di definisikan
dan menghasilkan posisi baru hasil penjumlahan tadi yaitu (posisix+nilai1) dan
(posisiy+nilai2).
7.4 Rotasi
objek, ada dua macam cara atau rumus untuk merotasi object di java yaitu
berpatokan pada titik acuan (0,0) atau (p,q) dibawah ini adalah rumus yang
170
Titik
Pusat
360o
18 Object 0o
90o
Arah
Perputaran
sebagai berikut:
g2d.rotate(Math.toRadians(1));
g2d.fill(shape);
Radian dan sudut adalah dua cara untuk menghitung sesuatu yang
sama. Pada sebuah lingkaran terdapat 360 derajat dan juga 2*PI radian dalam
Radian = (Sudut/180) * PI
sesuai dengan sebuah lingkaran maka kita harus menggunakan nilai Radian,
Untuk rotasi dengan sudut acuan parameternya ada 3 yang dapat dituliskan
sebagai berikut:
g2d.rotate(Math.toRadians(1),nilai1,nilai2);
g2d.fill(shape);
parameter yang kedua dan ketiga digunakan untuk menentukan titik pusat
dan (posisiy+nilai2).
7.5 Skala
Skala adalah operasi untuk membuat sebuah objek lebih besar atau
lebih kecil dari bentuk aslinya. Matriks transformasi untuk penskalaan dengan
x’ = sx . x
Pemrograman Game Java 4
J.E.N.I.
y’ = sy . y
g2d.scale(nilai1, nilai2);
g2d.fill(shape);
perbesar atau diperkecil. Parameter nilai1 diatas dikalikan dengan lebar object
sekali untuk sebuah shape. Sayangnya shape tidak digunakan dalam game
matrix seperti yang telah dibahas sebelumnya. Selain itu bisa menggabungkan
Masing masing method sebenarnya memiliki cara kerja yang sama kecuali
transformasi.
return dest;
}
transformasi gambar. Namun satu hal yang perlu diberi perhatian lebih adalah
graphics ke layar tanpa disimpan dalam object image, maka jangan khawatir
hasil dari transformasi. Ketika membuat object image paling tidak perlu
penampung ini yang sedikit bermasalah, hal itu karena kita tidak tahu bentuk
citra yang terdapat pada object image yang di transformasi. Seperti ilustrasi
transparant area dari sebuah gambar yang akan ditransformasi sesuai dengan
kebutuhan. Atau anda juga bisa merubah secara langsung luasan image
di transformasi.
8.1 Pendahuluan
Sebuah game pasti tidak lepas dari karakter dan animasi. Bisa saja
karakter lainya.
8.2 Tujuan
8.3 Sprite
contoh ketika menggunakan object shape atau gambar seperti pesawat, maka
pada java bekerja dengan cara menduplikasi object asli). Ketika proses
translasi dilakukan pada sebuah object, maka object yang di gambarkan pada
layar adalah duplikatnya sedangkan object asli tetap pada posisi awal oleh
sebab itu maka mustahil melakukan deteksi tabrakan atau bahkan sekedar
atribut dan method-method yang dibutuhkan dalam game. Selain itu sprite juga
tidak hanya menyediakan accesor dan mutator posisi object tetapi juga dapat
menyediakan arah pandang object, arah gerak object dan method lain yang
dibutuhkan. Class sprite nantinya juga dapat di gunakan sebagai parent dari
tersendiri.
arah gerak dan game side scrolling seperti MarioBros hanya butuh 3 arah
gerak. Selain itu juga pengujian benturan yang membutuhkan akurasi berbeda
mendefinisikan atribut-atribut dasar sebuah object dalam game. Class ini tidak
akan membuat sebuah class Sprite yang sudah lengkap dengan efek suara,
yang nantinya dapat diturunkan oleh class lainya yang lebih spesifik.
kelas sprite akan menyediakan sebuah Rectangle dengan besar sesuai dengan
tersebut. Kedua atribut tersebut menentukan kecepatan dan arah gerak dari
sprite tersebut. Atribut velocity akan digunakan sebagai increment posisi sprite
setiap kali sprite di update. Selain perubahan posisi sprite, update pada sprite
method update. Sebuah sprite dengan dx=5 yang di-update sebanyak 40 kali
dalam satu detik berarti sprite tersebut akan berpindah 5 x 40 pixel, nilai yang
gambar. Jika sprite memiliki lebih dari satu gambar, method ini akan meminta
berikut ini:
sprite. Cara ini adalah cara paling mudah dan tercepat, namun seperti yang
terlihat diatas cara ini kurang bagus secara akurasi. Program akan mendeteksi
kasat mata sprite tersebut sama sekali tidak bersinggungan. Cara ini ideal
untuk game yang tidak terlalu memperhatikan akurasi deteksi tabrakan atau
bounding box ( kotak batas yang diperkecil). Cara ini cukup mudah, hanya
perlu mengurangi beberapa pixel dari ukuran sebenarnya dari image sprite
sehingga pendeteksian masuk lebih dalam seperti terlihat pada gambar cara
Dengan cara ini bisa menggunakan sebanyak mungkin bounding box agar
lebih akurat dengan catatan semakin banyak bounding box maka akan semakin
9.1 Pendahuluan
pembuat game seperti yang kita rasakan saat ini dimana banyak game online
masih banyak lagi. Bagi para pembuat, pengembang game ataupun yang
dihasilkan tidak hanya berjalan secara stand alone tetapi juga di dalam jaringan
(multi player). Dalam hal ini, Java dapat menjawab dan memberi solusi kepada
para developer untuk membuat game baik di jaringan local maupun global
9.2 Tujuan:
9.3 Socket
Mengirim data
Menerima data
Menutup koneksi
berikutnya hanya dibutuhkan untuk server yang menunggu client untuk koneksi
datagra. Setiap datagram berisi header dan payload. header berisi alamat dan
port untuk setiap paket, addres dan port untuk tiap paket yang masuk,
programer dari low-level yang detail dari sebuah jaringan, seperti deteksi
atau String sedangkan untuk definisi port menggunakan int mulai dari 0 sampai
try {
Socket koneksi = new Socket(“192.168.12.138”, 80);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Jika host tidak ditemukan atau tidak berfungsi maka konstructor akan
yang disebut dengan socket client. Berikut ini adalah cara pendefinisian
koneksi melalui port 90, kemudian method accept() yang dipanggil untuk
for(int i=0;i<1024;i++){
try {
ServerSocket s=new ServerSocket(i);
}catch (IOException e) {
System.out.println("Port ini telah digunakan : "+i);
}
}
dimana parameter pertama adalah nomor port dan parameter kedua adalah
jumlah koneksi yang akan diterima, potongan kodenya dapat dilihat sebagai
berikut.
try {
ServerSocket s=new ServerSocket(90,10);
}catch (IOException e) {
berikut:
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
nomor port kemudian parameter, kedua adalah banyaknya koneksi yang akan
diterima dan yang terakhir yaitu ip addres yang akan menerima permintaan
pada bab II, sekarang kita akan membuat server sederhana yang akan
digunakan untuk menangani koneksi dari client. Berikut ini adalah kode
import java.net.*;
import java.io.*;
import java.util.*;
integer yang akan dugunakan sebagai nomor port dari server. Jika port yang
menggunakan bantuan dari thread yang akan kita bahas nanti. Method
koneksi yang kemudian dilewatkan lagi atau ditangani pada konstruktor dari
class ProsesClient.
Ada beberapa peraturan yang harus kita gunakan untuk menangani data
data yang diterima oleh server agar program dapat berjalan sesuai dengan
keinginan. Untuk itu kita harus membuat interface Protocol yang akan kita
programnya.
integer dan nilainya tidak dapat diubah ataupun dioverride. Ada beberapa
variable diatas antara lain CHAT_USER_BARU dalam program yang akan kita
buat nanti digunakan untuk pengecekan user yang yang baru terkoneksi dan
datanya akan dikirimkan ke seluruh client yang online dalam hal ini data yang
seluruh client yang terkoneksi bahwa user telah putus koneksinya dari server (“
dimana datanya juga dikirimkan keseluruh client yang aktif dan akan
client disisi server (setiap object yang dibuat oleh class server melalui class
ProsesClient).
inteface Protocol akan diterapkan pada class ProsesClient yang potongan kode
import java.io.*;
import java.net.*;
import java.util.*;
digunakan sebagai rule dari data yang akan diproses, kemudian ada beberapa
variable yaitu antara lain client yang digunakan sebagai referensi dari socket
digunakan untuk menghandle data yang masuk dari server, kirimdata juga
berupa inner class yang digunakan untuk mengirim data, clientList digunakan
ProsesClient(Socket client){
try{
this.client = client;
koneksi = true;
synchronized(clientList)
{
clientList.add(this);
}
}catch(IOException e){
System.out.println("Tidak dapat terkoneksi: "+e);
}
}
yang melewatkan data berupa object Socket. Didalam konstruktor tersebut juga
catch(IOException e)
{
disconnect();
}
}
}
konstruktornya dan juga dithread untuk membaca data yang dikirimkan oleh
parameter ini adalah data yang ditangkap dari client yang kemudian diproses
switch(kode)
{
case SET_USER:{
nama=st.nextToken();
break;
}
case CHAT_USER_BARU :{
broadcastToClient(data);
break;
}
case CHAT_HAPUS_USER :{
broadcast(data);
break;
}
case CHAT_PESAN_USER :{
broadcast(data);
break;
}
}
}
try
{
out.writeUTF(data);
}
catch(IOException e)
{
disconnect();
}
}
}
}
dapat dilakukan setiap saat dimana data yang dikirimkan tidak langsung dikirim
tetapi dalam kenyataanya kita tidak langsung mengakses kesana tetapi masih
Kita membuat satu method lagi yaitu disconnect() yang akan digunakan
broadcast(CHAT_HAPUS_USER+"|"+nama);
koneksi = false;
kirimdata.destroy();
Sebagai lanjutan dari sisi server dimana pusatnya seluruh data diolah,
sekarang kita akan membuat aplikasi Client yang melakukan koneksi ke server
yang baru saja dibuat tadi. Disini kita hanya membuat dua class dan sebuah
Protocol yang telah dibuat pada pembahasan server diatas. Sekarang mari kita
yaitu Client dimana fungsinya untuk menerima data yang dikirimkan oleh
import java.io.*;
import java.net.*;
import java.util.*;
NetworkDataListener, didalam class ini terdapat dua inner class yang isinya
tidak jauh berbeda dengan inner class yeng berada di sisi server pada bahasan
in.readUTF() dan kemudian memanggil dan melewatkan data yang dibaca tadi
Untuk inner class KirimData tidak ada perbedaan dengan KirimData yang ada
koneksi = false;
kirimdata.destroy();
terimadata.destroy();
try
{
client.close();
}
catch(Exception e) {}
client = null;
}
System.out.println("Client Disconnected");
}
public void kirimData(String data){
kirimdata.tambahData(data);
}
networkDisconnected(...).
Sekarang membuat satu class lagi yaitu class Client yang akan
digunakan sebagai GUI dan sekaligus akhir dari program chating yang akan
kita bangun. Program ini menggunakan dua panel yaitu panel pertama
menampung nama, host dan port dan tombol connect kemudian panel yang
kedua yaitu isi, pesan dan tombol send. Pertama kali dijalanan adalah panel
pertama jika tombol connect ditekan maka panel pertama akan dihapus dan
dari container diset null oleh sebab itu semua letak dari componen
x, posisi y, panjang, tinggi) . Berikut ini adalah listing program dari class Client.
Container c;
Client(){
c=getContentPane();
c.setLayout(null);
p1.setLayout(null);
p1.add(l1).reshape(0, 0, 100, 25);
p1.add(l2).reshape(0, 40, 100, 25);
p1.add(l3).reshape(0, 80, 100, 25);
p1.add(NAMA).reshape(50, 0, 100, 25);
p1.add(HOST).reshape(50, 40, 100, 25);
p1.add(PORT).reshape(50, 80, 100, 25);
p1.add(connect).reshape(30, 120, 100, 25);
p2.setLayout(null);
isi.setEditable(false);
p2.add(new JScrollPane(isi)).reshape(0, 0, 470, 200);
p2.add(new JScrollPane(pesan)).reshape(0, 220, 350, 55);
p2.add(send).reshape(370, 220, 100, 25);
connect.addActionListener(this);
send.addActionListener(this);
setDefaultCloseOperation(this.EXIT_ON_CLOSE);
setSize(500,500);
setVisible(true);
setResizable(false);
}
akan dibuat dimana akan menangani pesan yang diterima ataupun yang
dikirimkan. Selain itu juga mengirimkan data keserver untuk memberi nama
pada object ProsesClient yang menangani data yang masuk atau keluar
ini diterima oleh server maka akan langsung mengirimkan ke seluruh client
if(e.getSource() == connect){
this.host=HOST.getText();
this.port=Integer.parseInt(PORT.getText());
this.nama=NAMA.getText();
ND=new NetworkData(host,port,NDL);
ND.kirimData(SET_USER+"|"+nama);
ke seluruh client.
client, dimana data-data tersebut akan diproses sesuai dengan Protocol yang
dengan tanda pemisah adalah “ | “ sama seperti yang dilakukan pada sisi
“disconnect”.