2008
Pocong Document http://pocong.wordpress.com/
[email protected] http://pocong.wordpress.com/ 8/27/2008
J.E.N.I.
J.E.N.I.
Pemrograman Game JAVA
Versi 1.1 February 2007 Pemrograman Pemrograman Game Java
Pemrograman Game Java
J.E.N.I. Team Penyusun: 1. Eko Subian Subiantor toro, o, S.Pd, S.Pd, SST 2. Maula Maulana na Azis Azis Asuja Asuja 3. Saja Sajarw rwo o Ang Angga gaii
Referensi: Harbour, S, Jonathan. 2006. Begining Java 5 Game Programing. United States of America: Course Technology Inc Brackeen, David@All. 2003. Developing Game in Java. United States of America: New Riders Publishing Davison, Andrew. 2005. Killer Game Programing. United States of America : O’Reilly Media. Mulholland, Andrew, dan dan Murphy, Glenn. 2003. 2003. Java 1.4 Game Programing. Texas : Wordware Publishing.
Pemrograman Game Java
J.E.N.I. BAB 1 PENGENALAN PENGENALAN GAME
1.1 Pendahuluan
Perancan Perancangan gan dan pembuata pembuatan n sebuah sebuah game game membutuh membutuhkan kan imajinasi imajinasi atau atau wawa wawasa san n yang ang luas luas.. Apa Apa yang ang terj terjad adii apab apabilila a seora eorang ng prog progra ram mer langsung membuat game tanpa harus mengenal seluk-beluk dari sebuah game yang yang akan akan dibang dibangun? un?,, untuk untuk itu perlu perlu adany adanya a penjel penjelasa asan n atau atau sosial sosialisa isasi si tentang game yang nantinya cukup untuk membuka wawasan ketika seorang progra programe merr membu membuat at sebua sebuah h game. game. Sebel Sebelum um melan melangka gkah h lebih lebih jauh, jauh, pada pada bahasan ini kita terlebih dahulu mengenalkan seluk beluk dari sebuah game yang akan memberikan gambaran ketika membuat sebuah game.
1.2 Tujuan
Setelah mempelajari modul ini peserta diharapkan dapat: •
Mengetahui Jenis-Jenis Game.
•
Mengetahui Sejarah dari Permainan(vidio game).
•
Mengetahui berbagai macam game di J2SE.
1.3 Game (Permainan)
Perm Permain ainan an meru merupa paka kan n sebu sebuah ah akti aktivi vita tas s
rekr rekrea easi si deng dengan an tujua tujuan n
bersenang-senang, mengisi waktu luang, atau berolahraga santai. Permainan biasany biasanya a dilakukan dilakukan sendiri sendiri atau bersama-s bersama-sama. ama. Permainan Permainan sendiri sendiri terbagi terbagi menjadi 3 bagian yaitu: 1. Perm Permai aina nan n anak anak-a -ana nak k
Pemrograman Game Java
1
J.E.N.I. Di lingkungan yang masih terlihat keakraban antar anggota masyarakat, bany banyak ak perma permaina inan n yang yang dilak dilakuka ukan n oleh oleh anak-a anak-anak nak secar secara a berama beramai-ra i-rama maii deng dengan an tema temann-te tema man n mere mereka ka di hala halama man n atau atau di tera teras s ruma rumah. h. Mere Mereka ka berk berkel elom ompo pok, k, berla berlari rian an,, atau atau dudu duduk k melin melingk gkar ar mema memaink inkan an sala salah h satu satu permainan dan tercipta keakraban. Beberapa permainan ini karena tercipta di masa yang lama berlalu disebut dengan permainan tradisional, sedangkan di sisi lain beberapa permainan yang lebih akhir (dan biasanya menggunakan peralatan yang canggih) disebut permainan modern. •
Bentengan
•
Goncang Kaleng
•
Main Hadang
•
Boneka
•
Kasti
•
Petak Umpet
•
Congkak
•
Layangan
•
Yoyo
2. Perm Permai aina nan n Dewa Dewasa sa •
Kartu Remi atau Bridge
•
Kuis
•
Catur
•
Sudoku
•
Domino
•
Balap karung
3. Perm Permai aina nan n Vidi Vidio o Permainan video (bahasa Inggris: video game) adalah permainan yang menggunakan interaksi antarmuka pengguna melalui gambar yang dihasilkan oleh oleh
pira pirant ntii
vide video. o.
Perm Permai aina nan n
video ideo
umum umumny nya a
meny menyed edia iaka kan n
sist sistem em
pengharga penghargaan–m an–misaln isalnya ya skor–yan skor–yang g dihitung dihitung berdasark berdasarkan an tingkat tingkat keberhasi keberhasilan lan yang dicapai dalam menyelesaikan tugas-tugas yang ada di dalam permainan. Sistem elektronik yang digunakan untuk menjalankan permainan video disebut platform, contohnya adalah komputer pribadi dan konsol permainan.
Pemrograman Game Java
2
J.E.N.I. a) Perm Permai aina nan n Kompu Kompute ter r Perm Permai aina nan n
kom kompute puterr
(bah (bahas asa a
Ingg Inggri ris: s:
com compute puterr
game game))
adal adalah ah
permai permainan nan video video yang yang dimain dimainka kan n pada pada komput komputer er priba pribadi, di, dan dan bukan bukan pada pada konso konsoll perma permaina inan, n, maupu maupun n mesin mesin ding-d ding-dong ong.. Perma Permaina inan n komput komputer er telah telah bere berevo volu lusi si dari dari sist sistem em graf grafis is sede sederh rhan ana a samp sampai ai menj menjad adii komp komple leks ks dan dan mutakhir. Permainan online (bahasa Inggris: online game) adalah jenis permainan video atau permainan permainan komputer komputer dengan dengan menggunak menggunakan an jaringan jaringan komputer komputer,, umumnya internet, sebagai medianya. Permainan online terdiri dari dua unsur utama, yaitu server dan client. Server adalah penyedia layanan gaming yang meru merupa paka kan n basi basis s agar agar clie client nt-c -clilien entt yang yang terh terhub ubun ung g dapa dapatt mema memain inka kan n perm permai aina nan n dan dan mela melaku kuka kan n komu komuni nika kasi si deng dengan an baik baik.. Suat Suatu u serv server er pada pada prinsipny prinsipnya a hanya hanya melakuka melakukan n administra administrasi si permainan permainan dan menghubu menghubungka ngkan n client client-cl -clien ient. t. Sedan Sedangk gkan an client client adalah adalah penggu pengguna na permai permainan nan dan memaka memakaii kemampuan server. Contoh permainan online adalah Ragnarok Online, Risk Your Life, Xian dll. Ragna Ragnarok rok Online Online adalah adalah sebuah sebuah MMORPG MMORPG (Mass (Massive ively ly Multip Multiplay layer er Online Role Playing Game) dari Korea Selatan yang dibuat berdasarkan cerita dan latar belakang yang sama dari komik korea terkenal berjudul "Ragnarok" yang ditulis oleh Lee Myoung-Jin.Komik ini kemudian dikembangkan menjadi sebua sebuah h game game online online yang yang memf memfoku okuska skan n fitur fitur komun komunita itas s antar antar pemain pemainny nya. a. Game ini dibuat oleh Gravity Corporation. Hampir seluruh versi resmi (official) RO sudah memasuki masa komersil di mana pemain harus membayar untuk bermai bermain n (pay-t (pay-to-p o-play lay). ). Perlu Perlu dibed dibedaka akan, n, terdap terdapat at pula pula privat private e serve serverr yang yang
Pemrograman Game Java
3
J.E.N.I. merupakan server tidak official ilegal dan tidak ada toleransi dari Gravity serta penyelenggara RO di seluruh belahan dunia. b) Kons Konsol ol Perm Permai aina nan n Konsol permainan atau Game Console adalah sebuah mesin elektronik yang ang dira diranc ncan ang g khus khusus us untu untuk k mema memain inka kan n perm permai aina nan n vide video. o. Pera Perang ngka katt kelua keluaran ranny nya a biasa biasa berupa berupa monit monitor or komput komputer er atau atau telev televisi. isi. Alat Alat masuk masukan an utamanya berupa sebuah pengendali. Konsol permainan yang pertama kali di 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 dapat dapat dibawa dibawah h kemana kemana-ma -mana na biasa biasa disebu disebutt Portab Portable le Consol Console. e. Beriku Berikutt ini adalah Generasi dari Game Console:
Generasi Kedua
Atari 2600
Atari 2600 adalah konsol permainan video sukses yang pertama yang mamp mampu u mengg menggant antii kaset kaset perma permaina inan n selai selain n daripa daripada da yang yang biasa biasany nya a hanya hanya 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 berganti nama menjadi Atari 2600.
Atari 5200
Atari 5200 Super System, atau biasa hanya disebut Atari 5200, adalah konsol konsol permainan permainan video yang yang pertama kali diperkenalk diperkenalkan an pada tahun 1982 1982 oleh Atari, sebagai generasi penerus dari konsol permainan Atari 2600. Atari
Pemrograman Game Java
4
J.E.N.I. 5200 dibuat untuk menyaingi konsol Mattel Interlllivision, tetapi kemudian lebih bersaing dengan Colecovision setelah perilisan Atari 5200. Konsol ini secara teknol teknologi ogi lebih lebih unggul unggul dan dan pengel pengeluar uaran an biaya biaya yang yang lebih lebih efisie efisien n diban dibandin ding g konsol lain yang ada waktu itu. Tetapi, sejumlah cacat dan kekurangan pada konstruksi menyebabkan dampak serius pada penggunaannya dan sistem ini secara umum dianggap gagal.
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, kompat kompatibe ibell penuh penuh dengan dengan sistem sistem konso konsoll sebel sebelum umny nya a yaitu yaitu Atari Atari 2600 2600 dan dapat digunakan sebagai hadiah (karena harganya pada waktu itu $140).
Nintendo Entertainment System (NES)
Ninten Nintendo do Entert Entertain ainme ment nt Syste System, m, atau atau NES, NES, adala adalah h sebuah sebuah konsol konsol permai permainan nan video video 8-bit 8-bit yang yang dirilis dirilis oleh oleh Ninten Nintendo do di Amerik Amerika a Utara, Utara, Brasil Brasil,, Eropa, Asia dan Australia. Versi Jepangnya dikenal dengan nama Nintendo Family Computer atau Famicom. Di Rusia ia dinamakan Dendy. Menjadi konsol permainan paling populer saat itu di Asia dan Amerika Utara, NES membantu menghidupkan kembali industri permainan video setelah kerobohan permainan vide video o tahu tahun n 1983 1983,, dan dan mene meneta tapk pkan an selu seluru ruh h stan standa darr bagi bagi kons konsol ol-k -kon onso soll
Pemrograman Game Java
5
J.E.N.I. beriku berikutny tnya a mulai mulai desain desain perma permaina inan n (perma (permaina inan n platfo platform rm moder modern n pertam pertama, a, Super Mario Bros, merupakan killer game pertama sistem ini) sampai ke pola bisnis.
Generasi Keempat
Sega Mega Drive
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 1990. Pada permulaannya di Amerika Utara, konsol ini menggunakan nama Seg Sega Gene Genes sis, is, kare karen na Sega ega gaga gagall untu untuk k menda endap pat hak hak-hak -hak huku ukum mengg mengguna unakan kan nama Mega Mega Drive Drive di wilay wilayah ah itu. itu. Sega Sega Mega Mega Drive Drive adalah 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.
Super Nintendo Entertainment System
Super Super Ninten Nintendo do Entert Entertain ainmen mentt Syste System, m, dikena dikenall juga juga dengan dengan Super Super 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 dikenal dengan nama Super Famicom (Family Computer),di Korea Selatan ia dike dikena nall deng dengan an nama nama Supe Superr Comb Comboy oy dan dan didi didist stri ribu busi sika kan n oleh oleh Hyun Hyunda daii Elecronics.
Generasi Kelima
Pemrograman Game Java
6
J.E.N.I. 3DO Interactive Multiplayer
3DO Intera Interacti ctive ve Multip Multiplay layer er (umum (umumny nya a disebu disebutt 3DO) 3DO) adalah adalah sebuah sebuah konsol permainan video yang dirilis pada tahun 1993 dan 1994 oleh Panasonic, Sanyo Sanyo,, dan Goldst Goldstar, ar, disam disampin ping g bebera beberapa pa perusa perusaha haan an lainny lainnya. a. Konsol Konsol ini dibuat menurut spesifikasi yang dibuat oleh perusahaan 3DO, dan didesain oleh Dave Needle dan RJ Mical dari New Technology Group. Sistem konsol ini disusun disusun oleh pengusah pengusaha a dan pemilik pemilik perusahaan perusahaan EA Games. Games. Dikarenak Dikarenakan an promosi peluncuran yang terlalu besar dan biaya pembuatan/teknologi yang besar, konsol ini menjadi mahal ($699.95 dollar Amerika saat dirilis), membawa 3DO segera bangkrut dengan cepat.
Sega Saturn
Sega Sega Satu Saturn rn adal adalah ah kons konsol ol perm permai aina nan n vide video o buat buatan an Sega Sega yang ang mempunyai kemampuan 32 bit. Pertama kali diluncurkan pada 22 November 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 adalah Yukyu Gensokyoku Perpetual Collection, yang dirilis oleh Mediaworks bulan desember 2000. Beberapa judul permainan yang terkenal adalah Sonic the Hedgehog, Super Monkey Ball, Crazy Taxi, Virtua Fighter, Phantasy Star
Nintendo 64
Nintendo 64 atau dikenal juga N64 merupakan konsol game generasi ke lima lima yang dike dikelu luar arka kan n oleh oleh Nint Ninten endo do,, beke bekerj rja a sama sama deng dengan an prod produs usen en workstation Silicon Graphics Inc.
Pemrograman Game Java
7
J.E.N.I. Nintendo 64 sangat revolusioner di masanya dengan memperkenalkan teknologi-teknologi baru yang kemudian diikuti oleh para pesaingnya seperti Sony PlayStation dan Sega Saturn. Teknologi tersebut antara lain teknologi geta getarr Rumb Rumble le Pak Pak (yan (yang g kemu kemudi dian an dike dikena nall dala dalam m Play PlaySt Stat atio ion n seba sebaga gaii DualShock) serta memperkenalkan stik analog yang memungkinkan pemain 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. Nintendo 64 juga merupakan console game pertama yang menyertakan fungsi Anti-Aliasing dengan filter bilinear secara real-time.Selain itu, Nintendo 64 juga mendapat posisi pertama dan terpilih sebagai console game terbaik dalam G4 baru baru ini dalam acara 10 Konsol Game Terbaik. Nintendo 64 kurang dikenal luas di Indonesia, salah satu penyebabnya karena Nintendo 64 menggunakan medium cartridge/kaset untuk menyimpan data, yang lebih mahal dan lebih susah dicopy/dibajak dibandingkan dengan medium CD yang digunakan oleh PlayStation dan Sega Saturn.Pengembangan software Nintendo 64 berakhir pada tahun 2001 setelah rilis sekitar 350 judul game dan 40 juta unit Nintendo 64 terjual.
PlayStation
PlayStation adalah konsol permainan grafis dari era 32-bit. Pertama kali diproduksi oleh Sony sekitar tahun 1990. PlayStation diluncurkan perdana di Jepang pada 3 Desember 1994, di Amerika Serikat 9 September 1995 dan Eropa Eropa 29 Septem September ber 1995. 1995. PlayS PlayStat tation ion menja menjadi di sanga sangatt terken terkenal al sehing sehingga ga
Pemrograman Game Java
8
J.E.N.I. membentuk membentuk "Generasi "Generasi PlayStati PlayStation". on". Dari sekian sekian banyak banyak game PlayStation, PlayStation, beberapa yang terkenal adalah: Tomb Raider, Final Fantasy, Resident Evil, Tekk Tekken en,, Winn Winnin ing g Elev Eleven en,, Ridg Ridge e Race Racer, r, wipE wipEou out, t, Gran Gran Turi Turism smo, o, Crash Crash 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 ePSX ePSXe. e. ePSX ePSXe e beke bekerj rja a deng dengan an kons konsep ep Plug Plug-I -In, n, yang yang bera berart rtii user user haru harus s pertama-tama meload Plug-In grafik atau suara ke memori. Selain itu ePSXe juga hanya dapat bekerja menggunakan BIOS original PlayStation, yang bisa ditransfer ke PC menggunakan menggunakan kabel khusus.
Generasi Keenam
PlayStation 2
PlayStation 2 (PS2) adalah konsol video game kedua dari Sony, setelah PlayStation. Pengembangannya diumumkan pada April 1999, dan diedarkan pertama kali di Jepang pada 4 Maret 2000. Versi AS dilepas pada 26 Oktober 2000. Di tahun pertama PlayStation 2 mengalami penjualan yang relatif sedikit, namun namun saat saat ini telah telah tumbuh tumbuh menja menjadi di konso konsoll game game paling paling popul populer er dengan dengan terjualnya 90 juta unit
Pemrograman Game Java
9
J.E.N.I. Sega Dreamcast
Sega Dreamcast adalah konsol permainan buatan Sega generasi kelima dan merupa merupaka kan n peneru penerus s dari dari konsol konsol perma permaina inan n Sega Sega Saturn Saturn dan konsol konsol permainan terakhir buatan perusahaan Sega. Dengan tujuan untuk mengambil kembali pasar konsol permainan, Dreamcast di desain untuk menggantikan Playstation dan Nintendo 64. Dreamcast di rilis 15 bulan sebelum peluncuran Playstation 2 (PS2) dan 3 tahun sebelum Nintendo Gamecube dan Microsoft Xbox. Dreamcast secara umum dianggap mengungguli waktu itu dan pada permulaannya permulaannya berhasil mengembalikan mengembalikan reputasi Sega pada industri permainan. Tetapi, Dreamcast gagal untuk menarik kepesatan konsumen sebelum perilisan Playstation 2 pada bulan maret 2000 dan Sega akhirnya memutuskan untuk menghentikan Dreamcast tahun selanjutnya, dan meninggalkan bisnis konsol permainan video.
Nintendo GameCube
Nintendo
GameCube
awalnya
bernama
sandi
Dolphin
saat
pengembangan, resmi disingkat menjadi GCN oleh Nintendo Amerika) adalah konsol permainan rumah keempat dari Nintendo, dan masuk dalam permainan vide video o gene genera rasi si keen keenam am—s —sat atu u gene genera rasi si deng dengan an Sega Sega Drea Dreamc mcas ast, t, Sony Sony PlayStation 2 dan Microsoft Xbox. GameCube sendiri adalah konsol generasi keenam yang paling kecil dan murah. GameCube dirilis pada 14 September 2001 di Jepang; 18 November 2001 di Amerika Utara; 3 Mei 2002 di Eropa; dan 17 Mei 2002 di Australia.
Xbox
Pemrograman Game Java
10
J.E.N.I. Xbox adalah konsol permainan video generasi ke-6 buatan Microsoft, dan merupakan konsol permainan video pertama bagi perusahaan Microsoft. Pertama kali dirilis tanggal 15 November 2001 di Amerika Utara, tanggal 22 Februari 2002 di Jepang, dan 14 Maret 2002 di Eropa. Xbox adalah pendahulu dari konsol Xbox 360. Beberapa judul perangkat lunak permainan yang terkenal untu ntuk
konso onsoll
ini ini
ada adalah lah
Halo Halo::
Combat bat
Evol Evolv ved, ed,
Amped: ed:
Frees reesty tyle le
Snow Snowbo boar ardin ding, g, Dead Dead or Aliv Alive e 3, Proj Projec ectt Goth Gotham am Raci Racing ng,, dan dan Oddw Oddwor orld ld:: Munch's Munch's Oddysee. Oddysee. Sistem Sistem penyimpan penyimpanan an konsol konsol Xbox adalah Harddisk Harddisk dan Memory Card.
Generasi Ketujuh
Playstation 3
PLAYSTATION 3, disingkat PS3 adalah konsol Sony generasi ketiga. PlayStation 3 adalah penerus dari PlayStation dan PlayStation 2 dan akan bersaing dengan Xbox 360 dari Microsoft dan Wii dari Nintendo. PlayStation 3 dirilis di Jepang pada tanggal 11 November 2006 tepat 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 dirilis dengan 2 tipe, Basix dan Premium/Platinum. PlayStation 3 secara resmi diperkenalkan kepada dunia pada tanggal 16 Mei 2005 di E3. Konfigurasi final pertama dipertunjukkan di Tokyo Game Show 2006. Tekn Teknolo ologi gi terb terbar aru u yang yang digu diguna naka kan n adal adalah ah cell cell proc proces esso sorn rnya ya,, tipe tipe prosesor prosesor yang benar-ben benar-benar ar dioptimalk dioptimalkan an untuk melakuka melakukan n operasi operasi floating floating point. point. Kemam Kemampua puan n cell cell proces processor sor untuk untuk melaku melakukan kan operas operasii floati floating ng point point
Pemrograman Game Java
11
J.E.N.I. sanga sangatt baik baik karena karena cell cell proces processor sor merup merupaka akan n arsite arsitektu kturr vektor vektor proces processor sor.. Selain itu GPU dibuat sendiri bekerjasama dengan NVidia.
Wii
Wii adalah konsol permainan video kelima Nintendo yang merupakan penerus penerus Nintendo Nintendo GameCube GameCube.. Inovasi Inovasi utamanya utamanya adalah adalah kontroler kontroler (joystick (joystick)) yang merespon terhadap letaknya dalam ruang fisik tiga dimensi yang terletak di depan depan televi televisi. si. Pada Pada tahap tahap awal awal pengem pengemban bangan gan,, konso konsoll ini diberi diberi nama nama Revolution. Kons Konsol ol ini ini dipe diperk rken enal alka kan n dalam dalam Toky Tokyo o Game Game Show Show 2005 2005 pada pada 16 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 pada keasyikan bermain dibandingkan tampilan grafik beresolusi tinggi seperti yang dimiliki kedua konsol tersebut. Wiimote merupakan kontroler baru yang unik unik (yang (yang dileng dilengkap kapii sebuah sebuah Nunchu Nunchuk k sebaga sebagaii kontro kontroler ler tamba tambahan han untuk untuk bebe bebera rapa pa jenis jenis game game), ), bent bentuk ukny nya a yang keci kecil, l, serta serta harg harga a yang yang mura murah h merupakan hal-hal yang menjadi keunggulan konsol ini dibandingkan kedua konsol saingannya. Wii merupakan konsol game generasi baru dengan harga rilis termurah dibandingkan para pesaingnya. Di Jepang, Wii diluncurkan dengan harga JP ¥25.000 sementara di AS seharga $249,99. Kecuali di Jepang, Wii dijual satu paket dengan Wii Sports, sebuah game olah raga (tennis, baseball, bowling,
Pemrograman Game Java
12
J.E.N.I. golf, boxing) yang ditujukan untuk memperkenalkan pengguna Wii kepada gaya permainan terbarunya. Wii mempuny mempunyai ai kompatibil kompatibilitas itas lama (backward (backward compatibil compatibility) ity) dengan dengan beberapa beberapa konsol konsol lama Nintendo dan Sega, Sega, termasuk termasuk NES, TurboGarf TurboGarfx-16, x-16, SNES SNES,, Gene Genesi sis, s, Nint Ninten endo do 64 dan dan Gam GameCub eCube. e. Komp Kompat atib ibililit itas as deng dengan an GameCube dicapai dengan diadakannya slot bagi CD berukuran 8 cm seperti yang yang diguna digunakan kan GameCu GameCube, be, semen sementar tara a untuk untuk yang yang konsol konsol lainny lainnya a hal ini diperoleh melalui jasa konsol virtual (Virtual Console) yang merupakan salah satu satu fitur fitur Wii. Wii. Melal Melalui ui Virtua Virtuall Conso Console, le, penggu pengguna na Wii dapat dapat memb membeli eli dan mengunduh game-game lama dan dimainkan langsung di Wii melalui channel Wii Shop. Semenjak peluncurannya, peluncurannya, jumlah Wii yang terjual jauh melampaui angka penjualan Playstation 3 dan hampir mendekati angka penjualan Xbox 360 yang sudah diluncurkan setahun sebelumnya. Penjualan Wii mengalahkan penjualan Playstarion 3 dengan perbandingan 2:1 di Amerika Serikat dan 4:1 di Jepang, serta 3:1 di seluruh dunia.
Xbox 360
Xbox 360 ("tiga-enampuluh"), yang pada saat pengembangan dikenal dengan nama Xenon atau Xbox 2, adalah penerus konsol permainan video Xbox milik Microsoft. Microsoft secara resmi memperkenalkannya di MTV pada 12 Mei Mei 2005 2005,, dan dan info inform rmas asii detil detil meng mengen enai ai pelu pelunc ncur uran an dan dan perm permai aina nan n dibeberkan di akhir bulan yang sama dalam Expo Electronic Entertainment (E3) yang yang terken terkenal. al. Saat Saat dirilis dirilis pada 22 Novem November ber 2005 2005 di Amerik Amerika a Utara Utara dan Puerto Rico, 2 Desember 2005 di Eropa dan 10 Desember 2005 di Jepang,
Pemrograman Game Java
13
J.E.N.I. Xbox 360 menjadi konsol pertama yang diluncurkan berbarengan untuk tiga daerah besar. Ia juga merupakan produk pertama konsol permainan generasi 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 ditawarkan Microsoft selaku produsennya.
1.4 Role Playing Game
Role-Playing Game atau disingkat RPG adalah sebuah permainan di mana para pemain memainkan peran tokoh-tokoh khayalan dan berkolaborasi untuk merajut sebuah cerita bersama. Para pemain memilih aksi tokok-tokoh mereka berdasarkan karakteristik tokoh tersebut, dan keberhasilan aksi mereka tergantung dari sistem peraturan permainan yang telah ditentukan. Asal tetap meng mengik ikut utii pera peratu tura ran n yang dite diteta tapk pkan an,, para para pema pemain in bisa bisa beri berimp mpro rovi visa sasi si membentuk arah dan hasil akhir permainan ini. Pada sebuah permainan RPG, jarang ada yang "kalah" atau "menang". Ini membuat permain RPG berbeda dari jenis permainan papan lainnya seperti Monopo Monopolili atau atau Ular Ular Tangg Tangga, a, perma permaina inan n kartu, kartu, olah olah raga, raga, dan perma permaina inan n lainnya. Seperti sebuah novel atau film, permainan RPG mempunyai daya tarik karena permainan-permainan ini mengajak para pemain untuk menggunakan imajinasi mereka. RPG biasa lebih mengarah ke kolaborasi sosial daripada kompetisi. Pada umumnya dalam RPG, para pemain tergabung dalam satu kelompok.
Pemrograman Game Java
14
J.E.N.I. Permainan RPG rata-rata dimainkan seperti sebuah drama radio: ketika seora seorang ng pemain pemain "berb "berbica icara" ra",, dia berbic berbicara ara sebag sebagai ai tokohn tokohnya ya dan ketika ketika si pemain pemain ingin ingin tokohn tokohnya ya melak melakuka ukan n sesuat sesuatu u yang yang fisik fisik (seper (seperti ti meny menyera erang ng sebuah
monster
atau
membuka
sebuah
gembok)
dia
harus
menggambarkannya menggambarkannya secara lisan. Ada pula sejenis permainan RPG di mana para pemain bisa melakukan gerakan fisik tokohnya oleh si pemain sendiri. Ini disebut Live-Action Roleplaying atau LARP. Dalam permainan LARP, biasanya para pemain memakai kostum dan mengunakan alat-alat yang sesuai dengan tokoh, dunia dan cerita yang dia mainkan. Perm Permai aina nan n
PC yang ang
mengu enguna naka kan n
unsu unsurr-un unsu surr
dan dan
meka mekani nism sme e
permainan RPG disebut sebagai computer role-playing games atau CRPG. Selain di PC, RPG juga banyak diadaptasikan ke mesin-mesin permainan atau konsol, konsol, yang yang disebut disebut console console role-playin role-playing g games, games, disingkat disingkat cRPG. cRPG. Dengan Dengan menin meningka gkatny tnya a popula popularit ritas as RPG elektr elektroni onik, k, indust industri ri perma permaina inan n video video telah telah membuat istilah RPG dikenal untuk RPG elektronik saja, dan mengakibatkan munculnya istilah RPG "pen and paper" atau "tabletop" untuk mendeskripsikan RPG tradisional. Sebelu Sebelum m memu memulai lai sebua sebuah h permai permainan nan RPG, RPG, ada beber beberapa apa hal hal yang yang haru harus s dipe dipers rsia iapk pkan an.. Perta Pertama ma,, para para pema pemain in haru harus s memi memilih lih sebu sebuah ah buku buku peraturan (rulebook) dan, kadang kala, sebuah buku dunia (campaign setting) yang akan mereka gunakan. Tahap ini sangat penting karena buku-buku ini akan akan menen menentuk tukan an jenisjenis-jen jenis is tokoh tokoh yang yang bisa bisa dimain dimainka kan n (ksatr (ksatria, ia, penyi penyihir hir,, mata-mata, ninja, polisi, dan lainnya), kepandaian-kepandaian (skill) yang bisa seseorang gunakan termasuk mantera sihir (spell), peraturan pertempuran dan
Pemrograman Game Java
15
J.E.N.I. perincian-perincian dunia khayalan yang akan digunakan (sejarah, geografi, nama raja-raja, negeri-negeri penting, orang-orang penting dan lainnya). Ada pula pula buku-b buku-buku uku lain lain yang yang bisa bisa digun digunaka akan n sepert sepertii daftar daftar-da -dafta ftar r monster monster (contohny (contohnya a adalah adalah "Monster "Monster Manual" Manual" dari permainan permainan Dungeons Dungeons & Dragon Dragons), s), buku buku peratu peraturan ran tambah tambahan an (perat (peratura uran n pertem pertempur puran an yang yang lebih lebih terperinci dan kompleks, mantera-mantera baru, senjata dan jenis tokoh baru), buku-buku dunia yang lebih terperinci (contohnya ( contohnya adalah buku "Silver Marches" dari dunia Forgotten Realms yang menggambarkan sejarah, geografi, politik negeri Silver Marches yang lebih lengkap dari buku dunia Forgotten Realms). Tentunya, buku-buku ini tidak wajib untuk bermain, tapi bisa memberikan detildetil detil dalam dalam perma permaina inan n yang yang bisa bisa memb membuat uat sebua sebuah h dunia dunia khaya khayalan lan lebih lebih menarik atau realistis.
1.5 Jenis-Jenis Game di di JAVA JAVA 1.5.1 Game Applet
Java Java Game Game Appl Applet et adal adalah ah aplik aplikas asii yang yang berj berjal alan an di web web brow browse ser. r. keunt keuntung ungann annya ya user user tidak tidak harus harus mengin menginsta stallll apapu apapun, n, tetapi tetapi pemain pemain harus harus online
dan
menjalankan
web
browser
untuk
memaink inkannya
dan
keuntungannya lagi applet mempunyai batasan keaamanan untuk menangani kode kode jahat jahat yang yang mengak mengakiba ibatka tkan n kerusa kerusakan kan atau atau kerugi kerugian. an. sebaga sebagaii conto contoh h applet applet tidak dapat menyimpan menyimpan informasi seperti menyimpa menyimpan n game game kedalam kedalam harddisk pengguna (client), applet juga hanya melakukan koneksi jaringan ke dalam server dimana kode applet tersebut di letakkan.
Pemrograman Game Java
16
J.E.N.I. 1.5.2 Game Window
Java game Window tidak mempunyai mempunyai batasan keamanan yang dilakukan seperti applet, pada kenyataannya aplikasinya kelihatan seperti aplikasi biasa deng dengan an titl title e bar, bar, tomb tombol ol clos close e dll. dll. Baga Bagaim iman anap apun un juga juga bagi bagian an dari dari user user interface dapat membingungkan si pemain, terlebih lagi ketika para pemain ingin lebih mendalami sebuah game.
1.5.3 Game Full-Screen
Java Game Game Full-Screen memberikan kontrol kontrol sepenuhnya sepenuhnya di atas layar layar atau tampilan dari sebuah game, tanpa desktop antarmuka pengguna seperti title bar, task bar, dll. Dengan model ini para pemain akan menjadi lebih tertarik terhadap game yang sedang dimainkan.
Pemrograman Game Java
17
J.E.N.I. BAB 2 COLLECTION & THREAD
2.1 Pendahuluan Pada
pembuatan
game
di
java,
sering
kali
para
programer
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 denga dengan n banya banyakny knya a object object gambar gambar atau atau grafik grafik geomet geometri ri yang yang dibuat dibuat maka maka proses yang dibutuhkan juga memakan waktu yang cukup lama dimana dalam java java pengg penggamb ambara aran n object object itu dilak dilakuka ukan n 1000 1000 kali kali per detik detik yang yang sangat sangat memberatk memberatkan an kinerja kinerja dari procesor, oleh sebab sebab itu dibutuhka dibutuhkan n thread thread untuk menangani hal terebut agar komputer berjalan dengan normal sesuai dengan keinginan.
2.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Memahami tentang interface Collection pada Java
•
Mengerti tentang pembuatan Vector, ArrayList dan LinkedList.
•
Membuat dan mengelolah Thread
•
Memahami proses sinkronisasi data
•
Menggunakan method Wait dan Notify
Pemrograman Game Java
1
J.E.N.I. 2.3 Collection Collection atau sering juga disebut sebagai container adalah sebuah objec objectt sederh sederhana ana yang yang menam menampun pung g lebih lebih dari dari satu satu eleme elemen n di dalam dalam satu satu kesa esatuan tuan..
Colle ollec ction tion
digun igunak akan an
untu untuk k
meny enyimpa impan, n,m menga engam mbil
dan dan
memanipulasi data, juga mentransmisikan data dari satu method ke method lain lain.. Coll Collec ectio tion n khus khusus us mere merepr pres esen enta tasi sika kan n data data item item dari dari bent bentuk uk yang yang sebenarnya seperti Poker (kumpulan dari kartu), direktori (kumpulan dari file atau folder), kotak surat (kumpulan dari surat-surat), dll. SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi tetapi
menga mengarah rahkan kan
subint subinterf erface aces, s,
Set inte interf rfac aces es
dan dan
List interfaces
diperbolehkan. Sekarang, apa perbedaan dari kedua interface tersebut. Set meru merupa paka kan n coll collec ectio tion n yang yang tidak tidak dipe dipesa san n dan dan tida tidak k ada ada peng pengga gand ndaa aan n dida didala lamn mnya ya.. Seme Sement ntar ara a itu, itu, list list meru merupa paka kan n colle collect ctio ion n yang dipe dipesa san n dari dari eleme elemen-e n-elem lemen en dimana dimana juga juga
diperb diperbole olehka hkanny nnya a
pengga pengganda ndaan. an. HashSet,
LinkedHashSet dan TreeSet adalah adalah implemen implementasi tasi class dari Set interfaces. ArrayList, ArrayList, LinkedList LinkedList dan Vector merupaka merupakan n implemen implementasi tasi class class dari List interfaces.
Collection Set
List
HashSet
LinkedHashSet
TreeSet
ArrayList
LinkedList
Vector
Gambar 2.1 Implementasi Interface Collection
Pemrograman Game Java
2
J.E.N.I. 2.3.1 Vektor Vekt Vektor or adal adalah ah impl implem emen ents tsii dari dari dina dinami mis s arra array y, yang hamp hampir ir sama sama dengan ArrayList perbedaanya adalah vector mempunyai method yang bukan turunan dari collection framework. Pada Java 2 vektor diperluas lagi dengan menge mengexte xtends nds Abstra AbstractL ctList ist dan dan mengi mengimp mplem lement entas asika ikan n List List interf interface ace yang yang sangat mendukung mendukung collection. Dibawah Dibawah ini adalah konstruktor konstruktor dari Vector. Vector(); Vector(int size); Vector(int size,int incr);
Konstruktor pertama adalah konstruktor default yang menginialisasikan ukura ukuran n sebany sebanyak ak 10 elemen elemen.. Konstr Konstrukt uktor or kedua kedua yaitu yaitu menen menentuk tukan an jumlah jumlah eleme elemen n yang yang akan akan diguna digunakan kan.. Konstr Konstrukt uktor or yang yang ketiga ketiga yaitu yaitu menen menentuk tukan an ukuran awal dan apabila ukurannya full maka akan ditambah lagi sebanyak incr. Dibawah ini beberapa method yang disediakan oleh class Vector. Method addElement() elementAt()
lastElement()
Keterangan Digu Diguna naka kan n untu untuk k mena menamb mbah ahka kan n data data obje object ct ke dalam Vektor. Meth Method od ini ini berfu berfung ngsi si untu untuk k meng mengam ambi bill elem elemen en berdasarkan nomor index yang dimasukan. Berfungsi untuk mengambil nilai berupa object yang palin paling g tera terakh khir ir di tamb tambah ahka kan n dari dari sebu sebuah ah obje object ct vektor. Berf Berfun ungs gsii untu untuk k meng mengam ambi bill nila nilaii beru berupa pa obje object ct
firstElement()
clear()
isEmpty()
perta pertama ma yang yang di tamb tambah ahka kan n dari dari sebu sebuah ah obje object ct vektor. Digunakan untuk menghapus seluruh elemen yang tersimpan dalam object vector. Memerik Memeriksa sa apakah apakah verkt verktor or yang yang digun digunaka akan n berisi berisi elem lemen ata atau tid tidak. ak. Jika ika ada data data maka aka aka akan mengembalikan mengembalikan nilai boolean berupa false.
Pemrograman Game Java
3
J.E.N.I. 2.3.2 ArrayList 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 cepat cepat daripa daripada da vekto vektor. r. Pembu Pembuata atan n Object Object ArrayL ArrayList ist dapat dapat diliha dilihatt sepert sepertii dibawah ini. ArrayList al=new ArrayList();
Tidak Tidak seper seperti ti array array dimana dimana untuk untuk menga mengamb mbilil ukuran ukuran mengg mengguna unakan kan .length, ArrayList menggunakan al.size(). Dibawah ini adalah beberapa method-method method-method yang dapat digunakan pada ArrayList. Method
Keterangan Digu Diguna naka kan n untu untuk k mena menamb mbah ahka kan n data data objec objectt ke
add()
dalam ArrayList. Meth Method od ini ini meny menyed edia iaka kan n dua dua para parame mete terr untu untuk k
add(,)
menambahkan sebuah object dengan menentukan nomor index elemennya. Method Method get adalah adalah metho method d yang yang disedi disediaka akan n oleh oleh
get()
remove() isEmpty() clear()
ArrayL ayList
untuk
mengambil
sebuah
object
berdasarkan nomor indexnya. Moth Mothod od ini ini berf berfun ungs gsii untu untuk k meng mengha hapu pus s elem elemen en ArrayList berdasarkan nomor indexnya. Digunakan untuk memeriksa apakah object ArayList yang dibuat kosong atau tidak. Menghapus semua elemen yang yang ada di dalam object ArrayList.
2.3.3 LinkedList Link inkedLis dListt memp memper erbo bole lehk hkan an
mengim gimplem pleme entas ntasii elem elemen enny nya a
inte interf rfac ace e
meng menggu guna naka kan n
null. null.
List List..
Link Linked edL List ist
Perta Pertama ma
yang yang
jug juga haru harus s
dilakukan adalah membuat object LinkedList seperti dibawah ini:
Pemrograman Game Java
4
J.E.N.I. LinkedList ll=new LinkedList();
Ada Ada bebera beberapa pa metho method d yang yang disedi disediaka akan n class class Linked LinkedLis Listt antar antara a lain lain adalah sebagai berikut: Method add() size() get() addFirst() addLast() getFirst() getLast() clear() remove() remove()
Keterangan Diguna Digunaka kan n untuk untuk menam menambah bahka kan n data data object object ke dalam dalam LinkedList. Mengambil jumlah elemen pada object LinkedList Mengambil nilai elemen berdasarkan nomor index yang ada pada object LinkedList Menambahkan object pada elemen awal Menambahkan object pada elemen akhir Mengambil nilai elemen pertama Mengambil nilai elemen terakhir Menghapus semua nilai elemen pada object LinkedList Meth Method od rem remove ove tanp tanpa a para parame mete terr akan akan mengh enghap apus us elemen pertama Param Paramete eterr akan akan menun menunjuk jukan an eleme elemen n mana mana yang yang akan akan dihapus
2.4 Thread 2.4.1 Membuat dan Memulai Thread Sebuah Sebuah thread dapat dapat dengan dengan mudah mudah dibuat dibuat dan jalankan dengan cara membuat instance dari object Thread dan memanggil method start(). Thread myThread= new Thread(); myThread.start();
Saat menjalankan kode diatas tentu saja tidak akan ada yang terjadi selai selain n aplika aplikasi si jalan jalan dan langsu langsung ng mati. mati. Ketik Ketika a menja menjalan lankan kanny nya a JVM akan akan membuat sebuah thread baru dan secara default akan memanggil method run(), dalam hal ini run() kosong sehingga thread akan langsung mati. Berikut ini adalah cara memberikan tugas kepada thread : 1) mengmeng-ex exten tends ds clas class s Threa Thread d 2) mengmeng-im imple pleme ments nts class class Runnabl Runnable e Pemrograman Game Java
5
J.E.N.I. 3) menggunak menggunakan an innerclas innerclass s tanpa tanpa nama
2.4.2 Menurunkan Class Thread Cara ara
cepa cepatt
memb emberik erikan an
tug tugas
kepa kepada da
thre threa ad
adala dalah h
denga engan n
mengoverride method run(). public class MyThread extends Thread { public void run(){ System.out.println(“say System.out.println(“saya a adalah thread”); } }
Berikutny Berikutnya a yang perlu di lakukan lakukan adalah adalah membuat membuat instance dari object object Thread dan memanggil method start() sama seperti bahasan sebelumnya. Thread myThread = new
MyThread();
myThread.start();
2.4.3 Mengimplementasi Class Runnable Meng Meng-e -ext xten ends ds clas class s Thre Thread ad sang sangat at muda mudah, h, teta tetapi pi tida tidak k menu menutu tup p kemungkinan seorang programer programer tidak ingin menulis class baru setiap kali ingin mengguna menggunakan kan thread. thread. Contoh Contoh nya ketika ketika sedang sedang mengexte mengextends nds class JFrame dalam lam apli aplik kasi asi
GUI dan dan
ingin ngin menggu ggunak nakan thre thread ad,,
solu solus siny inya
dapat apat
dipecahkan dengan menggunakan interface Runnable(). public class MyThread extends JFrame implements Runnable { public MyThread(){ Thread t=new Thread(this); t.start(); } public void run(){ System.out.println(“say System.out.println(“saya a adalah thread”); } }
Pemrograman Game Java
6
J.E.N.I. Dalam kode diatas MyThread membuat instance dari object thread pada konstruktor dengan object Runnable (dalam hal ini class MyThread sendiri), dan selanjutnya memulainya. memulainya.
2.4.4 Menggunakan Inner Class Tanpa Nama Sebuah Sebuah thread dapat dapat dibuat dibuat tanpa tanpa harus membuat membuat class baru ataupun ataupun mengimp mengimpleme lements nts Runnable. Runnable. Pembuata Pembuatanny nnya a dapat dapat dilakukan dilakukan dengan dengan dengan dengan cara membuat inner class. new Thread() { public void run() { System.out.println("say System.out.println("saya a adalah Thread"); } }.start();
Cara diatas tidak lazim digunakan digunakan karena karena dapat beresiko beresiko terhadap terhadap sebuah program apabila kode dalam method run() semakin besar.
2.4.5 Menggunakan Method Sleep Suatu saat sebuah thread perlu dihentikan untuk sementara waktu untuk keperluan tertentu, untuk itu dapat menggunakan menggunakan method sleep(). try{ Thread.sleep(1000); }catch(Exception e){}
Kode Kode diat diatas as akan akan memb membua uatt threa thread d berh berhen enti ti selam selama a 1 detik detik (100 (1000 0 milidetik). Selama thread dalam kondisi kondisi sleep, thread tidak tidak memerlukan memerlukan kinerja dari dari cpu. cpu. Kond Kondis isii slee sleep p pada pada sebu sebuah ah thre thread ad akan akan dim dimanfa anfaat atka kan n untu untuk k menjalankan thread lainya.
2.4.6 Menghentikan Thread
Pemrograman Game Java
7
J.E.N.I. Ada dua cara yang bisa dilakukan untuk menghentikan sebuah thread. Perta ertam ma
adal adalah ah meng engguna gunak kan
flag flag (ta (tanda) nda) dan yang ang
kedua edua adala dalah h
menggunakan method interrupt(). Apabila menggunakan method stop(), maka bersiap-siaplah melihat program tak terkendali atau bahkan mati. Method stop() mengakibatkan gangguan terhadap thread lain.
2.4.7 Menggunakan Flag(Tanda) Cara yang paling banyak digunakan untuk menghentikan sebuah thread adalah adalah mengguna menggunakan kan variabel variabel penanda. penanda. Thread Thread dapat memeriks memeriksa a variabel variabel tersebut secara berkala untuk memastikan kondisi berhenti. public class MyThread extends JFrame implements Runnable {
private volatile boolean done=false; public MyThread(){ Thread t=new Thread(this); t.start(); } public void run(){ while(!done){ System.out.println(“saya adalah thread”); } } Public void setDone(){ done=true; }
Dengan Dengan kode kode diatas diatas secar secara a berka berkala la thread thread akan akan memer memeriks iksa a kondis kondisii penanda, ketika penanda bernilai true maka thread tidak lagi dijalankan.
Pemrograman Game Java
8
J.E.N.I. 2.4.8 Menggunakan Interupsi Cara lain yang dapat digunakan adalah dengan menginterrupsi sebuah thread. Cara ini biasa digunakan pada sistem blocking. Sistem blocking adalah sistem yang mem-block jalannya sistem sampai sebuah kunci di lepaskan. Contoh Contoh sistem sistem blocki blocking ng salah salah satuny satunya a pola pola penerim penerimaan aan koneks koneksii jaring jaringan an (pembahasan jaringan akan di jelaskan pada bab berikutnya). Pada teknik penghentian menggunakan flag, terdapat sebuah kondisi yang ang
memu memung ngki kink nkan an
sist sistem em
kehi kehila lang ngan an/t /ter erla lamb mbat at
mene meneri rima ma
info inform rmas asi. i.
Contohnya ketika sebuah thread sedang memproses suatu perintah, tiba-tiba flag di set. Kondisi ini setidaknya membuat thread harus menyelesaikan proses tersebut dan baru akan menghentikan proses pada loop berikutnya. public class MyThread extends JFrame implements Runnable { private volatile boolean done=false; Thread t;
public MyThread(){ t=new Thread(this); Thread(this); t.start(); } public void run(){ while(!t.isInterrupted()){ System.out.println(“saya adalah thread”); } } }
Deng Dengan an meth method od inte interr rrup upt( t(), ), thre thread ad akan akan di paks paksa a berh berhen enti ti dan dan mengabai mengabaikan kan proses proses yang yang sedang sedang berjalan. berjalan. Pengguna Penggunaan an method method interrupt() interrupt() dapat dengan mudah dilakukan dengan memanggil method tersebut.
Pemrograman Game Java
9
J.E.N.I. 2.4.9 Sinkronisasi Data Apa yang terjadi ketika dua thread menggunakan variabel yang sama? Bisa saja salah satu thread mencoba mengkases mengkases data yang telah di hapus oleh thread thread lainya lainya.. Dalam Dalam hal ini kedua kedua thread thread harus harus di sinkro sinkronis nisasi asi
sehing sehingga ga
masin masing-m g-masi asing ng thread thread tidak tidak kehila kehilanga ngan n inform informasi asi.. Sinkro Sinkronis nisasi asi berfun berfungsi gsi mengunci sebuah object, ketika sebuah object terkunci maka tidak ada yang bisa dilakukan terhadap object tersebut sebelum kunci di lepas. Asumsikan Asumsikan bahwa buah thread yang mengakses mengakses variabel variabel dari object object yang yang sama. sama. Suatu Suatu saat saat thread thread a menco mencoba ba menga mengambi mbill data data dalam dalam variab variabel el tersebut , sementara thread b mencoba mengubah data tersebut . public class GamePlayer{ public int getLives() {
return lives; }
public void setLives(int l) {
lives = l; }
private int lives; }
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);
Kondis ndisii
yang
diin diing gink inkan
adala dalah h
varia ariabe bell
liv lives
mendap ndapat atk kan
pengurangan 2 kali. Namun ketika Thread A dan B mengakses variabel Lives dalam waktu yang yang bersamaa bersamaan n kemudian kemudian menguranginy menguranginya a maka yang terjadi terjadi variabel Lives hanya akan mengalami satu pengurangan. Untuk memperbaiki kondisi tersebut dapat menggunakan kata kunci synchronized. Pemrograman Game Java
10
J.E.N.I. //Thread A Synchronized(gamePlayer){ int lives=gamePlayer.getLives(); gamePlayer.setLives(lives-1); } //Thread B Synchronized(gamePlayer){ int lives=gamePlayer.getLives(); gamePlayer.setLives(lives-1); }
2.4.10 Menggunakan Method Wait dan Notify Sebelum bahasan ini, telah dipelajari bagaimana thread bekerja secara mandiri.
Pada
kenyataan
suatu
saat
seorang
programer
perlu
mengk mengkomu omunik nikas asika ikan n dua atau atau lebih lebih thread thread.. Katak Katakanl anlah ah dua buah buah thread thread digunakan untuk untuk komunikasi jaringan, jaringan, thread A dan dan thread B. Thread A akan akan mengirimkan pesan ketika thread B selesai mengisi pesan. // Thread A public void waitForMessage() { while (hasMessage == false) { Thread.sleep(100); } } // Thread B public void setMessage(String message) {..... hasMessage = true; }
Perhatikan kode diatas. Secara berkala thread A akan mengecek kondisi hasMessa hasMessage. ge. Jika hasMessage hasMessage tidak di set pada pengecekan pengecekan terkini maka maka berikutnya thread akan sleep selama 100 ms. Kode tersebut memang bekerja, tetapi apa yang terjadi jika hasMessage di set ketika Thread A dalam keadaan slee sleep? p? Thre Thread ad A akan akan kehi kehilan langa gan n atau atau seti setida dakn kny ya terl terlam amba batt mene meneri rima ma informasi. Dengan method wait dan notify hal ini dapat di selesaikan. Thread a Pemrograman Game Java
11
J.E.N.I. cukup menunggu sampai dengan thread B mengirimkan sinyal bahwa pesan 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 maka maka seca secara ra otom otomat atis is prog progra ram m akan akan berh berhen enti ti seca secara ra mend mendad adak ak untu untuk k menunggu method setMessage() dipanggil atau dijalankan.
Pemrograman Game Java
12
J.E.N.I. BAB 3 EVENT HANDLING 3.1 Pendahuluan Sebuah game sangat membutuhkan penanganan aksi yang terjadi pada 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 j uga objek-objek lain seperti item listener, componen listener dst, tetapi disini hanya memb membaha ahas s tentan tentang g masal masalah ah penang penangana anan n mouse mouse dan keyboa keyboard. rd. Sebag Sebagai ai conto contoh, h, apabil apabila a ingin ingin menget mengetahu ahuii tombo tomboll apa yang yang diteka ditekan n maka maka disini disinilah lah fungsi fungsi event event handli handling, ng, tidak tidak hany hanya a itu tetapi tetapi masih masih banya banyak k lagi lagi sepert sepertii jika jika tombol space ditekan maka bom akan meledak, apabila tombol enter ditekan maka permainan akan dimulai dan masih banyak lagi.
3.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Mendengarkan action dari keyboard
•
Menerima input dari keyboard
•
Mengetahui kode tombol-tombol keyboard pada KeyEvent.
•
Membaca pergerakan mouse
•
Mendeteksi tombol mouse
•
Menerima input dari mouse.
Pemrograman Game Java
1
J.E.N.I. 3.3 Input dari Keyboard Java menyediakan Interface KeyListener untuk mendengarkan aksi dari keyboard dan mengirimkan action tersebut melalui method yang diikutsertakan dalam program. Adapun method-methodnya adalah keyPressed,keyReleased, Ketiga param paramete eterr dari dari method method ini hanya hanya mempun mempunya ya satu satu dan keyTyped keyTyped . Ketiga parameter yaitu KeyEvent. Ketika menulis program yang menggunakan KeyListener, maka harus menambahkan definisi dari class yang telah dibuat dengan menggunakan kata kunci implements, sebagai contoh:
Public class TestKeyboard extends JFrame implements Keylistener{ ....................... ....................... }
Fitur Fitur Yang Yang paling paling menari menarik k dari dari
implements pada java adalah adalah dapat dapat
mengi mengimp mplem lement entasi asikan kan lebih lebih dari dari satu satu interf interface ace didala didalam m progra program m dengan dengan menggunakan tanda koma(,) sebagai pemisah dari masing-masing interface.
3.4 Mendengarkan Action dari Keyboard Sebu Sebuah ah
prog progra ram m
mendengarkan aksi dari
membu embutu tuhk hkan an
metho ethod d
addK addKey eyLi List sten ener er
untu untuk k
keyboard, agar key event akan di kirim oleh Java
Runtim Runtime e Environ Environme ment( nt(JRE JRE)) kepada kepada progra program m yang yang dibua dibuat. t. Param Paramete eterr dari dari method ini akan akan di turunkan pada class class yang akan direpresentasikan direpresentasikan dengan kata kunci (this). Bisanya untuk pemanggilan addKeyListener(this) dilakukan di dalam program dimana konstruktor akan di panggil pertama kali ketika sebuah program dijalankan.
Pemrograman Game Java
2
J.E.N.I. Selanjutnya, mengimplementasikan 3(tiga) aksi dari keyboard di dalam program agar interface dari keyListener dapat bekerja. public void keyPressed(KeyEvent keyPressed( KeyEvent e) public void keyReleased(KeyEvent keyReleased (KeyEvent e) public void keyTyped(KeyEvent keyTyped(KeyEvent e)
Ada tiga jalan untuk menentukan key yang telah ditekan atau dilepaskan dengan dengan menggunaka menggunakan n parameter parameter KeyEvent. KeyEvent. Jika ingin mengetah mengetahui ui karakter karakter tombol tombol yang ditekan, dapat menggunak menggunakan an method method getKeyCha getKeyCharr yang mana akan mengirimkan nilai bertype char, tetapi jika ingin mengetahui kode apapun dite diteka kan n
berd berdas asar arka kan n
kode kode tom tombol bol
maka maka dapa dapatt
meng menggu guna naka kan n
meth method od
getKeyCode. Sebagai contoh ketika program mendengarkan aksi dari keyboard dan
kemud emudia ian n
tom tombol bol
A
ditek itekan an,,
maka aka
method thod
getKe etKey ychar char
aka akan
mengembalikan mengembalikan hasil berupa “a”(atau “A” jika menggunakan huruf besar), tetapi method method getKeyCo getKeyCode de akan mengembalika mengembalikan n nilai berupa kode tombol virtual virtual yaitu VK_A. Semua dari kode tombol virtual terdapat di dalam class KeyEvent. Tabel dibawah ini menampilkan sebagian daftar dari kode tombol virtual yang biasanya umum digunakan didalam pembuatan game. Kode Tombol VK_LEFT VK_RIGHT VK_UP VK_DOWN VK_0 ..... VK_9 VK_A .... VK_Z VK_F1 .. VK_F12 VK_KP_LEFT VK_KP_RIGHT VK_KP_UP VK_KP_DOWN VK_ENTER VK_BACK_SPACE VK_TAB
Pemrograman Game Java
Penjelasan Panah kiri Panah kanan Panah atas Panah bawah Tombol Numerik Tombol Alphabet Tombol Fungsi Numerik left Numerik right Numerik atas Numerik bawah Tombol Enter Tombol Backspace Tombol Tab
3
J.E.N.I. Seka Sekaran rang g
memb membua uatt
clas class s
Test TestKe Key yboar board d
yang meng mengim impl plem emen enta tasi si
interface KeyListener seperti pada kode program berikut. import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; public class TestKeyboard extends JFrame implements KeyListener{ int KodeTombol KodeTombol; ; char KarakterTombol ; public static void static void main(String[] main(String[] args) { TestKeyboard tk= new TestKeyboard(); } TestKeyboard(){ setTitle("Test setTitle("Test Keyboard"); Keyboard" ); addKeyListener(this); setSize(300, 200); setVisible(true ); setDefaultCloseOperation(this.EXIT_ON_CLOSE ); ); } public void public void paint(Graphics paint(Graphics g){ g.setColor(Color.WHITE ); ); g.clearRect(0, g.clearRect(0, 0, 300, 200); g.setColor(Color.BLACK ); ); g.drawString("Tekan g.drawString("Tekan sebuah tombol : " , 20, 20); g.drawString("Kode g.drawString("Kode Tombol : " +KodeTombol KodeTombol, , 20, 50); g.drawString("Karakter g.drawString("Karakter Tombol : " +KarakterTombol , 20, 70); } public void public void keyPressed(KeyEvent e) { KodeTombol=e.getKeyCode(); KodeTombol =e.getKeyCode(); KarakterTombol=e.getKeyChar(); KarakterTombol =e.getKeyChar(); repaint(); } public void public void keyReleased(KeyEvent e) { public void public void keyTyped(KeyEvent keyTyped(KeyEvent e) { }
}
}
Kode Kode progra program m diatas diatas akan akan menam menampil pilkan kan kode kode tombol tombol dan karakt karakter er tombol yang kita tekan disetiap kita menekan tombol pada keyboard. Method clearRect() digunakan untuk menghapus tulisan ataupun gambar sebelumnya sedangkan method repaint() dipanggil ketika ada perubahan atau ketika tombol ditekan yang berfungsi untuk memanggil method paint().
Pemrograman Game Java
4
J.E.N.I. 3.5 Input dari Mouse Mendengarkan
action
dari
mouse
sama
prosesnya
seperti rti
mendengarkan action dari keyboard. Java menangani masukan dari mouse menggunakan aksi yang dihasilkan oleh Java Runtime Environment (JRE) dan mengirimkan ke program jika mengimplementasikan mengimplementasikan MouseListener. Langkah pertama yang harus diambil untuk menangani aksi dari mouse di dalam program adalah memanggil kedua fungsi yang berikan oleh JRE yaitu addMouse addMouseListe Listener() ner() dan addMouseM addMouseMotionL otionListen istener(). er(). Kedua Kedua fungsi fungsi tersebut tersebut harus harus diinia diinialis lisasi asi,, fungs fungsii ini sama sama sepert sepertii yang yang telah telah dipela dipelajar jarii pada pada saat saat menangani keyboard. addMouseListener(this); addMouseMotionListener(this);
Java menyediakan sebuah class interface untuk pergerakan mouse dan aksi aksi tomb tombol ol
yang ang hamp hampir ir sama sama sepe sepert rtii inte interf rfac ace e pada pada keyb keyboa oard rd.. Clas Class s
MouseListener adalah class abstrak yang disediakan kepada program dengan sebuah interface dengan 5(lima) method yang harus diimplementasi di dalam walupun tidak digunakan. public public public public public
void void void void void
mouseClicked(MouseEvent mouseClicke d(MouseEvent e) mouseEntered(MouseEvent mouseEntere d(MouseEvent e) mouseExited(MouseEvent mouseExited (MouseEvent e) mousePressed(MouseEvent mousePresse d(MouseEvent e) mouseReleased(MouseEvent mouseReleas ed(MouseEvent e)
Interface dari MouseListener menangani tombol mouse, posisi mouse di dalam window, dan lokasi mouse ketika kursor mouse kedalam dan keluar dari window. Sela Selain in Mous MouseL eLis iste tene nerr juga juga terd terdap apat at clas class s inte interf rfac ace e yang yang sang sangat at berbeda, yang digunakan untuk menangani pergerakan mouse. Posisi mouse Pemrograman Game Java
5
J.E.N.I. dapa dapatt diba dibaca ca mela melalu luii Mous MouseL eLis iste tene ner, r, teta tetapi pi untu untuk k mene meneri rim ma aksi aksi dari dari pergerakan pergerakan mouse membutuh membutuhkan kan interface interface yang yang lain. Untuk menerima menerima aksi perge pergerak rakan an mouse mouse melalu melaluii jendel jendela a window window harus harus menggu menggunak nakan an interf interface ace MouseMotionListener. Ada 2(dua) aksi didalam interface ini yaitu : public void mouseDragged(MouseEvent mouseDragge d(MouseEvent e) public void mouseMoved(MouseEvent mouseMoved( MouseEvent e)
3.6 Mendeteksi Tombol Mouse Beber Beberapa apa aksi aksi akan akan di berita beritahuk hukan an oleh oleh JRE ketika ketika tombol tombol mouse mouse diklik,ditekan, atau dilepaskan. Salah satu method yang yang tidak terhubung dengan tombol mouse adalah mouseEntered, mouseExited, dan mouseMoved, ketiga method itu terhubung ketika terjadi aksi terhadap posisi dan pergerakan. Semua emua
meth ethod
dari ari
(mou (mous seCli eClick cked ed,,
mouse useEnte Entere red d,
mous ouseEx eExited ited,,
mousePressed, mousePressed, dan mouseReleased) mouseReleased) berjalan apabila tombol mouse ditekan. Semu Semua a acti action on hany hanya a memp mempun uny yai 1 (sat (satu) u) para parame mete terr yang yang dise disebu butt sebag sebagai ai MouseE MouseEven vent. t. Parame Parameter ter ini sebena sebenarny rnya a adalah adalah sebuh sebuh class, class, yang yang kemudian kemudian digunakan digunakan oleh JRE untuk mengirimkan mengirimkan action yang yang terjadi 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 MouseEvent.getX() dan mouseEvent.getY(). Parameter biasanya didefinisikan menjadi menjadi (MouseE (MouseEvent vent
e), untuk untuk itu pada prakteknya prakteknya gunakan gunakan e.getX() e.getX() dan dan
e.getY() untuk mengetahui posisi dari mouse. Demikian juga, MouseEvent akan memberitahu tombol tombol mana yang telah ditekan. Pada MouseEvent MouseEvent ada sebuah method getButton() yang fungsinya sama tergantung dari tombol yang telah diteka ditekan. n. Method Method getBut getButton ton() () sangat sangat bergu berguna na ketika ketika ingin ingin mende mendetek teksi si satu satu tombol yang ditekan.
Pemrograman Game Java
6
J.E.N.I. public void mouseClicked(MouseEvent e) { public void if(e.getButton()== MouseEvent. BUTTON1){ System.out.println("button .println("button 1"); 1" ); }else if(e.getButton()== (e.getButton()== MouseEvent. BUTTON2){ System.out.println("button .println("button 2"); 2" ); }else if (e.getButton()== (e.getButton()== MouseEvent. BUTTON3){ System.out.println("button .println("button 3"); 3" ); } }
Class TestMouse dibawah ini memperlihatkan semua action dari mouse yang yang baru baru saja saja dipela dipelajar jari. i. progra program m ini mengg mengguna unakan kan kode kode class class Graphi Graphics, cs, metho method d drawS drawStrin tring g dan rangka rangkaian ian varibl varible e untuk untuk menam menampilk pilkan an status status dari dari semua aksi mouse secara satu persatu. Gambar 3.13 dibawah ini menampilkan hasil dari kode program TestMouse.
Gambar 3.13 Tampilan Hasil, Semua Action dari Mouse import java.awt.Graphics; import java.awt.event.*; import javax.swing.JFrame; public class TestMouse extends JFrame implements MouseListener,MouseMotionListener{ int int int int int int int int
clickx, clicky clickx, clicky; ; pressx, pressx , pressy pressy; ; releasex, releasex , releasey releasey; ; enterx, enterx , entery entery; ; exitx, exitx , exity exity; ; dragx, dragx , dragy dragy; ; movex, movex , movey movey; ; mousebutton; mousebutton ;
Pemrograman Game Java
7
J.E.N.I. Konstruktor adalah method pertama yang dijalankan di dalam sebuah program ketika class tersebut dipanggil. Oleh sebab itu di method inilah dimana variabel dan object game diinialisasi, dan disini juga dapat ditempatkan listener untuk untuk semua
program program peralatan peralatan masukan(I masukan(Input nput Device) Device) yang dibutuhka dibutuhkan. n.
Apab Apabil ila a prog progra ram m tidak tidak meng menghi hira rauk ukan an key keyboar board d atau atau mous mouse, e, peri periks ksal alah ah konstruktor utama untuk memastikan apakah listener telah ditambahkan atau tidak.
TestMouse(){ setTitle("Test setTitle("Test Mouse"); Mouse" ); addMouseListener(this ); // listener tombol mouse addMouseMotionListener(this);// );// listener pergerakan mouse setSize(300, 200); setVisible(true ); setDefaultCloseOperation(this.EXIT_ON_CLOSE ); ); }
Method paint() adalah method yang dipanggil ketika program merefresh jen jende dela la.. Sejak Sejak pain paint( t()) deng dengan an para parame mete terr (Gra (Graph phic ics s g), g), obje object ct ini ini dapa dapatt digunakan untuk menggambar di dalam jendela program. Untuk menampilkan teks
didalam
program
ini
kami
telah
menggunakan
method
Graphics.drawString(). public void public void paint(Graphics paint(Graphics g){ g.setColor(Color.WHITE ); ); g.clearRect(0, g.clearRect(0, 0, 300, 200); g.setColor(Color.BLACK ); ); g.drawString("Mouse g.drawString("Mouse clicked : "+clickx clickx+ +"," ","+ +clicky clicky, , 10,50); g.drawString("Mouse g.drawString("Mouse Entered : 75); g.drawString("Mouse g.drawString("Mouse Exit : 100); g.drawString("Mouse g.drawString("Mouse Pressed : "+pressx pressx+ +"," ","+ +pressy pressy, , 10,125); g.drawString("Mouse g.drawString("Mouse Released: "+releasex releasex+ +"," ","+ +releasey releasey,10,150); ,10,150); g.drawString("Mouse g.drawString("Mouse Dragged : 175); g.drawString("Mouse g.drawString("Mouse Moved : 200); }
Pemrograman Game Java
" +mousebutton +" at " +enterx enterx+ +"," ","+ +entery entery, , 10, " +exitx exitx+ +"," ","+ +exity exity, , 10, " +mousebutton +" at " +mousebutton +" at "+ " +dragx dragx+ +"," ","+ +dragy dragy, , 10, " +movex movex+ +"," ","+ +movey movey, , 10,
8
J.E.N.I.
Bagian kode selanjutnya adalah method checkButton(), adalah program yang kami tulis untuk menangani aksi pada mouse. Method chekButton() ini meme memerik riksa sa tombol tombol yang yang baru baru saja saja di tekan tekan dan meny menyimp impann annya ya kedal kedalam am variabel variabel (mousebut (mousebutton) ton) sebagai sebagai nilai yang yang merepresen merepresentasik tasikan an tombol tombol yang ditekan. checkButton(MouseEvent e){ public void public void checkButton(MouseEvent switch(e.getButton()){ case MouseEvent. BUTTON1: mousebutton=1; mousebutton =1; break; case MouseEvent. BUTTON2: mousebutton=2; mousebutton =2; break; case MouseEvent. BUTTON3: mousebutton=3; mousebutton =3; break; default: mousebutton=0; mousebutton =0; } }
Method Method mouseClic mouseClicked() ked() adalah adalah bagian bagian dari interface interface MouseList MouseListener. ener. Ketika mengimplementasi interface ini, harus mengikutsertakan semua action dari dari Mouse Mouse yang yang didefin didefinisi isikan kan dalam dalam interf interface ace ini atau atau akan akan menda mendapat patkan kan pesan kesalahan(error). Action ini dipanggil kapanpun ketika menekan tombol mouse mouse di dalam dalam jendel jendela a window window,, artiny artinya a ketika ketika meneka menekan n atau atau melepa melepaska skan n tombol mouse. Action ini tidak biasanya dibutuhkan didalam mousePressed() dan mouseReleased() sendiri. public void public void mouseClicked(MouseEvent e) { // Menyimpan posisi mouse clickx=e.getX(); clickx =e.getX(); clicky=e.getY(); clicky =e.getY(); // Mengupdate Tombol checkButton(e); // refresh tampilan repaint(); }
Pemrograman Game Java
9
J.E.N.I. Selanjutny Selanjutnya a adalah adalah aksi kedua kedua method method mouse, mouse, mouseEnte mouseEntered() red() dan mouse useExit Exited ed() ()
yang ang
dipan ipangg ggil il
ketik etika a
kurso ursorr
mous ouse
memasuk asukii
ata atau
meninggalkan jendela aplikasi. Kedua aksi ini tidak sering dibutuhkan dalam pembuatan game. public void public void mouseEntered(MouseEvent e) { enterx=e.getX(); enterx =e.getX(); entery=e.getY(); entery =e.getY(); repaint(); } public void public void mouseExited(MouseEvent e) { exitx=e.getX(); exitx =e.getX(); exity=e.getY(); exity =e.getY(); repaint(); }
Method Method mousePre mousePressed ssed() () dan mouseRel mouseReleased eased() () akan dipanggil dipanggil ketika ketika menekan dan melepaskan tombol mouse. Ketika kedua aksi tersebut terjadi, posisi akhir dari mouse dapat diambil baik ketika ditekan atau dilepaskan. public void public void mousePressed(MouseEvent e) { pressx=e.getX(); pressx =e.getX(); pressy=e.getY(); pressy =e.getY(); repaint(); } mouseReleased(MouseEvent t e) { public void public void mouseReleased(MouseEven releasex=e.getX(); releasex =e.getX(); releasey=e.getY(); releasey =e.getY(); repaint(); }
Inte Interf rfac ace e
Mous MouseM eMot otio ionL nLis iste tene nerr
mend mendef efin inis isik ikan an
2(du 2(dua) a)
aksi aksi
yaitu yaitu
mouseDragged() dan mouseMoved(). Kedua aksi tersebut sangat membantu ketika ingin mengetahui kapan mouse bergerak di dalam jendela window. public void public void mouseDragged(MouseEvent e) { dragx=e.getX(); dragx =e.getX(); dragy=e.getY(); dragy =e.getY(); repaint(); } public void public void mouseMoved(MouseEvent e) { movex=e.getX(); movex =e.getX(); movey=e.getY(); movey =e.getY(); repaint(); }
Pemrograman Game Java
10
J.E.N.I. 3.7 Membuat Class Untuk Handling Keyboard dan Mouse Pada pokok bahasan sebelumnya penanganan aksi dari keyboard dan mouse selalu di dalam sebuah class yang sama, sekarang akan dibuat class sendiri untuk menangani aksi yang terjadi pada keyboard dan mouse yang mana mana akan akan memper mempermud mudah ah user user untuk untuk mengg mengguna unakan kanny nya. a. Beriku Berikutt adalah adalah tampilan dari program yang dibuat.
Gambar 3.14 Tampilan hasil Class PercobaanKeyboardMouse PercobaanKeyboardMouse
Pada Class PercobaanKeyboardMouse diatas menampilkan koor-dinat, tombol tombol mouse mouse beser beserta ta kode kode dan karakt karakter er tombol tombol pada pada keyboa keyboard rd dengan dengan menggunakan 2 buah panel, 9 buah label dan textfield. JTextField tf tf[]= []=new JTextField[9]; JLabel l[]=new JLabel[9]; HandlingKeyboardMouse hkm hkm; ; String label label[]={ []={"Mouse "Mouse clicked", clicked" ,"Mouse Entered", Entered" ,"Mouse Exit", Exit" , "Mouse Pressed", Pressed" ,"Mouse Released", Released" ,"Mouse Dragged", Dragged" , "Mouse Moved", Moved" ,"Kode Tombol", Tombol" ,"Karakter Tombol"}; Tombol" }; .................... .................... .................... for(int i=0;i<9;i++) { tf[i]= tf [i]=new JTextField(30); tf[i].setEditable( tf [i].setEditable(false); tf[i].setFocusable( tf [i].setFocusable(false); l[i]= new JLabel(label JLabel(label[i]); [i]);
p1.add( p1 .add(l l[i]).reshape(10, [i]).reshape(10, i*30, 100, 25);
Pemrograman Game Java
11
J.E.N.I. p1.add( p1 .add(tf tf[i]).reshape(120, [i]).reshape(120, i*30, 300, 25); }
Kode diatas mendefinisikan array textfield dan label sebanyak 9 buah kemudian memberikan nilai false pada method setEditable() agar tidak dapat di edit dan method method setFocusa setFocusable() ble() supaya kursor kursor tidak terarah langsung langsung pada text textfie field ld ketik ketika a prog progra ram m di jala jalank nkan an.. Sela Selanj njut utny nya a memb membua uatt obje object ct yang yang digunakan untuk menangani keyboard dan mouse dengan melewatkan textfield yang di buat tadi dari konstruktornya. hkm=new HandlingKeyboardMouse( hkm= HandlingKeyboardMouse(tf tf); ); p2.addMouseListener( p2 .addMouseListener( hkm hkm); ); p2.addMouseMotionListener( p2 .addMouseMotionListener( hkm hkm); ); addKeyListener( hkm hkm); );
Berikut ini adalah konstruktor dari class HandlingKeyboardMouse. HandlingKeyboardMouse(JTextField a[]){ for(int i=0;i<9;i++){ tf[i]= tf [i]=new JTextField(30); tf[i]=a[i]; tf [i]=a[i]; } }
Textfield Textfield yang yang dilewatkan dilewatkan pada konstrukto konstruktorr HandlingK HandlingKeyb eyboardMo oardMouse use diatas diatas kemudian kemudian diproses sesuai kebutuhan kebutuhan dimana dimana pada class ini texfield texfield tersebut tersebut digunakan digunakan untuk menampil menampilkan kan koordinat koordinat pointer pointer pada mouse juga karakt karakter er dan kode kode tombol tombol pada pada keyboa keyboard rd yang yang berada berada di dalam dalam metho methode de upda update te() (),, moth mothod od ini ini sela selalu lu di pang panggi gill keti ketika ka ada ada aksi aksi yang ang terj terjad adii pada pada keyboard ataupun mouse. Berikut adalah potongan kode programnya. public void update(){ public void tf[0].setText( tf [0].setText(mousebutton mousebutton+ +" at "+ " +clickx clickx+ +"," ","+ +clicky clicky); ); tf[1].setText( tf [1].setText(enterx enterx+ +"," ","+ +entery entery); ); tf[2].setText( tf [2].setText(exitx exitx+ +"," ","+ +exity exity); ); tf[3].setText( tf [3].setText(mousebutton mousebutton+ +" at "+ " +pressx pressx+ +"," ","+ +pressy pressy); ); tf[4].setText( tf [4].setText(mousebutton mousebutton+ +" at "+ " +releasex releasex+ +"," ","+ +releasey releasey); ); tf[5].setText( tf [5].setText(dragx dragx+ +"," ","+ +dragy dragy); ); tf[6].setText( tf [6].setText(movex movex+ +"," ","+ +movey movey); ); tf[7].setText( tf [7].setText("" ""+ +KodeTombol KodeTombol); ); tf[8].setText( tf [8].setText("" ""+ +KarakterTombol ); }
Pemrograman Game Java
12
J.E.N.I. ........... ........... public void public void mouseMoved(MouseEvent e) { movex=e.getX(); movex =e.getX(); movey=e.getY(); movey =e.getY(); update(); } ........... ........... public void public void keyPressed(KeyEvent e) { KodeTombol=e.getKeyCode(); KodeTombol =e.getKeyCode(); KarakterTombol=e.getKeyChar(); KarakterTombol =e.getKeyChar(); update(); }
Pemrograman Game Java
13
J.E.N.I. BAB 4 EFEK SUARA
4.1 Pendahuluan Pada sebuah permainan efek suara sangat dibutuhkan untuk membuat game yang dibangun lebih semakin hidup dan terasa nyata, hal ini juga yang memb membua uatt para para pema pemain in lebih lebih tert tertar arik ik,, baya bayang ngka kan n apab apabil ila a di dala dalam m suat suatu u 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 Setelah mempelajari modul ini peserta diharapkan dapat: •
Memanggil dan Memainkan File Suara.
•
Memanggil dan Memainkan File MIDI Sequence.
•
Mengetahui perbedaan antara file berekstensi midi dan (Aiff, Au, Wav)
•
Mengetahui cara menggunakan class File dan URL untuk meload file suara
4.3 Mengakses File Suara API API Soun Sound d pada pada Java Java mend menduk ukun ung g 3 macam acam form format at suar suara a yang ang digunakan di Web dan Aplikasi Desktop yaitu: 1. AIFF 2. AU 3. WAV
Pemrograman Game Java
1
J.E.N.I. Untuk Untuk memangg memanggilil dan mendeng mendengarkan arkan suara, suara, Java Java memerluka memerlukan n paket paket javax.sound.sampled.* untuk disertakan di baris awal program yang dapat dituliskan seperti dibawah ini:
import javax.sound.sampled.*; javax.sound.sampled.*; Apabila menggunakan eclipse, maka akan terlihat menu pop-up yang menampilkan nama-nama package dalam javax. Jika mengetikan javax.sound diikuti dengan titik maka akan terlihat package di dalamnya yaitu sampled dan midi. Dengan menambahkan .* pada akhir akhir statemen statementt maka compi compiler ler sudah sudah memberitahukan memberitahukan untuk meng-import semua class dalam javax.sound.sampled. javax.sound.sampled. AudioSystem dan AudioInputStream adalah class yang berada di dalam paket javax.sound.sampled dan digunakan untuk memanggil dan memainkan sebuah suara. Kunci nci
utam utama a
untu untuk k
pem pemangg anggil ila an
sua suara
ada adalah lah
clas lass
berna ernam ma
AudioInputStream. Class ini digunakan untuk memuat sebuah file suara dari file lokal dimana program diletakkan atau dari URL lain di internet. Berikut ini adalah pembuata sebuah obyek/instance baru dari class tersebut.
AudioInputStream AudioInputStream suara; Statement ini biasanya diposisikan sebagai variable global dalam class, didefinisikan pada baris-baris awal dalam class sebelum semua method ditulis. Selai Selain n itu juga juga dapa dapatt dide didefi fini nisi sika kan n seba sebaga gaii varia variable ble priv privat ate, e, publ public ic,, atau atau protected (defaultnya adalah public). Dalam peraturan pemrograman berbasis objek, public memposisikan variable agar dapat diakses oleh class lain diluar variab variable le terseb tersebut ut didefi didefinis nisika ikan, n, private private berart berartii variab variable le terseb tersebut ut tidak tidak dapat dapat diakses dari class lain, sedangkan protected hampir mirip dengan private hanya Pemrograman Game Java
2
J.E.N.I. saja saja
clas classs-cl clas ass s
yang yang
menj menjad adii
subsub-cl clas assn sny ya(mel a(melal alui ui
inhe inheri rita tanc nce) e)
bisa bisa
menggunakannya. Kode Kode untu untuk k memu memuat at suara uara dari dari URL URL bias biasan any ya dile dileta takk kkan an dala dalam m konstruktor. Method yang digunakan untuk memuat sebuah file suara adalah Audio AudioSy Syst stem em.g .get etAu Audi dioI oInp nput utSt Stre ream am.. Meth Method od ini ini mene meneri rima ma sebu sebuah ah File File , Inp InputSt utStre ream am ata atau URL, RL, ada ada dua dua cara ara untuk tuk membuat uat audi audio o stre stream am (AudioFormat dan Encoding). suara = AudioSystem.getAudioInputStream(new File(“BOOM.wav”));
Nila ilai
bali balik k
dari
meth ethod
ini ini
adal dalah
Aud AudioIn ioInpu putS tStr trea eam m.
Kar Karena ena
getAudioIn getAudioInputSt putStream ream tidak memiliki memiliki versi yang dapat dapat di overload overload dan hanya menerima menerima input berupa berupa string dari nama file, maka harus melewatkan melewatkan sebuah sebuah objek File kedalamny kedalamnya. a. Cukup mudah menggunakan menggunakan objek dari File, hanya dengan dengan memberika memberikan n nama file pada kontrukto kontruktorr method File. File. Apabila
ingin
mengambil sebuah file dari sebuah URL, kode yang digunakan adalah sebagai berikut : URL lokasi = new URL(“http://www.vedcmalang.ac.id/suara/BOOM.wav URL(“ http://www.vedcmalang.ac.id/suara/BOOM.wav ”); suara = AudioSystem.getAudioInputStream(lokasi);
Apabila ingin mendistribusikan program java yang telah dibuat dan ingin mendapatkan hasil yang maksimal, sebaiknya mengganti method new File() dan new URL() untuk memuat semua sumber (seperti sebuah file gambar atau suara) suara) dengan dengan memanfa memanfaatkan atkan this.getClas this.getClass().ge s().getReso tResource urce(), (), dimana dimana Method Method getResource()
berada
di
instance
clas lass
yang
saat
ini
digu igunakan
this.getClass().. Berikut ini sebuah method yang di tulis menggunakan fungsi tersebut : public URL getURL(String namaFile){
Pemrograman Game Java
3
J.E.N.I. URL url=null; try{ url=this.getClass().getResource(namaFile); }catch(Exception e){} return url; }
AudioInpu AudioInputStrea tStream m tidak dapat langsung langsung digunakan digunakan untuk memainka memainkan n suara, AudioInputStream hanya dapat mengakses file audio tanpa kemampuan untuk memainkanya. Untuk itu, perlu menggunakan class lain yang bernama Clip (Import javax.sound.sampled.clip). javax.sound.sampled.clip). Clip klip =AudioSystem.getClip(); =AudioSystem.getClip();
4.4 Memuat dan Mememainkan Klip Suara Sebelumnya sudah mempunyai sebuah AudioInputStream dan sebuah 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 meng menggu guna naka kan n clas class s Clip Clip yaitu aitu : Meth Method od star start( t()) dapa dapatt digu diguna naka kan n untu untuk k memainkan klip suara dengan kode seperti berikut: klip.start();
Untu ntuk
yang ang
kedua edua
adala dalah h
meth ethod
loop loop() (),,
diman imana a
meth ethod
ini ini
meny menyed edia iaka kan n sebu sebuah ah pilih pilihan an yang ang memp memper erbo bole lehk hkan an untu untuk k mene menent ntuk ukan an seberapa banyak klip akan diulang. baik dengan jumlah tertentu maupun tak hingga. Dibawah ini kode yang memungkinkan untuk memainkan klip suara dengan method loop() : klip.loop(0);
Pemrograman Game Java
4
J.E.N.I. Ingat, parameter menunjukkan seberapa banyak ia akan diulang. Berikut ini adalah bagaimana agar klip suara dapat dimainkan terus menerus : klip.loop(Clip.LOOP_CONTINOUSLY);
Pada kenyataannya programer sering lupa untuk menghentikan suara yang telah dimainkan padahal tidak semua suara dimainkan terus menerus seperti suara tabrakan dll, untuk itu jika ingin menghentikan klip suara dapat menggunakan method method stop() seperti pada potongan kode dibawah ini:
klip.stop(); 4.5 Memuat dan Mememainkan MIDI MIDI adalah singkatan dari Musical Instrument Digital Interface. MIDI adalah sebuah kumpulan format musik, bukan sebuah format sample, artinya musik musik MIDI MIDI tidak tidak direka direkam m mengg mengguna unakan kan konve konverte rterr analog analog-to -to-dig -digita itall (yang (yang berada pada sound card di dalam komputer). Perlu diketahui bahwa file berekstensi (aiff,au dan wav) berukuran cukup besar, sedangkan aplikasi tidak ingin pengguna menunggu lima menit atau lebi lebih h (khu (khusu susn snya ya dial dial-u -up) p) hany hanya a untu untuk k menu menung nggu gu samp sampai ai klip klip sele selesa saii didow didownlo nload( ad(gam game e jaring jaringan) an).. Hal ini terjad terjadii ketika ketika anda anda meman memangg ggilil method method open(), jadi ketika anda mencoba untuk membuka sebuah file suara berukuran besar, maka method ini akan memaksa pengguna untuk menunggu selama wakt waktu u down downlo load ad klip klip suar suara. a. Hal Hal ini ini yang ang dapa dapatt menj menjaw awab ab perm permas asal alah ahan an tersebut adalah MIDI sequence. Memu Memuat at file file MIDI MIDI meme memerl rluk ukan an sedi sediki kitt lebi lebih h bany banyak ak cara cara dari dari pada pada memuat file berekstensi (aiff,au dan wav). Hal ini karena file MIDI dimainkan
Pemrograman Game Java
5
J.E.N.I. melalui perangkai (sequencer) bukan melalui sound mixer. Class Sequence digunakan untuk memuat file MIDI : Sequence suara = MidiSystem.getSequence(new File(“contoh.mid”));
Mesk Meskipu ipun n kode kode ters terseb ebut ut disi disiap apka kan n agar agar file file MIDI MIDI dapa dapatt dima dimain inka kan n melalui sequencer, kita belum sama sekali membuat instance dari sequencer: Sequencer ambilSuara= MidiSystem.getSequencer();
Beri Beriku kutn tnya ya,, Memb Member erit itah ahuk ukan an kepa kepada da clas class s Sequ Sequen ence cerr bahw bahwa a kita kita memiliki file midi (melalui class Sequence):
ambilSuara.setSequence(suara); Sekarang yang perlu dilakukan adalah membuka file dan memainkannya:
ambilSuara.open(); ambilSuara.start(); Untu Untuk k
mema memain inka kan n
MIDI MIDI
secar ecara a
beru berula lang ng-u -ula lang ng
seba sebany nyak ak
yang ang
diinginkan diinginkan gunakan gunakan method method setLoopCo setLoopCount() unt() dimana dimana parameterny parameternya a sebagai sebagai penentu:
ambilSuara.setLoopCount(1 ambilSuara.setLoopCount( 1); Apabi Apabila la ingin ingin dimain dimainkan kan secar secara a terus terus mener menerus us tanpa tanpa henti henti gunaka gunakan n kode kode berikut:
ambilSuara.setLoopCount(Sequencer.LOOP_CONTINUOUSLY ); Terakhir adalah menghentikan MIDI, prosesnya sama seperti menghentikan file (aiff,au,wav) yaitu dengan cara memanggil method stop():
ambilSuara.stop();
Pemrograman Game Java
6
J.E.N.I. 4.6 Penanganan Error Java Java meny menyedi ediaka akan n penan penangan ganan an error error pada pada class class Sound Sound,, compil compiler er secara secara otoma otomatis tis akan akan menol menolak ak atau atau membe memberika rikan n pesan pesan kesala kesalahan han apabil apabila a tidak tidak menggunakan blok try... catch. Sebagai contoh, ketika memuat sebuah file, pertam pertama a kali kali akan akan diperi diperiks ksa a dengan dengan IOExc IOExcept eption ion sebel sebelum um mengg mengguna unakan kan handler handler umum(Exce umum(Exception) ption).. Class AudioSys AudioSystem, tem, AudioInpu AudioInputStrea tStream m dan Clip membutuhkan membutuhkan handler dibawah ini : •
IOException
•
LineUnavailableException
•
UnsuportedAudioFileException
Cara Cara menggu menggunak nakan an sebuah sebuah error error handle handlerr untuk untuk progra program m yang yang akan akan memainkan sebuah sebuah suara. Kode berikut ini diletakkan pada konstruktor : (){ KONSTRUKTOR try { } } } }
//kode program catch (MalformedURLException (MalformedURLException e){ catch (IOException e){ catch (LineUnavailableException e){ catch (UnsuportedAudioFileException e){}
}
Disam Disampin ping g itu class class Seque Sequence nce dan dan Sequen Sequence cerr juga juga membut membutuhk uhkan an penanganan error yang tidak jauh berbeda dengan class Class AudioSystem, AudioInput AudioInputStrea Stream m dan Clip. Cara penangan penangananny annya a dapat dapat dituliskan dituliskan sebagai sebagai berikut: KONSTRUKTOR (){ try {
// kode program } catch (InvalidMidiDataException e) { } catch (IOException (IOException e) { } catch (MidiUnavailableExcepti (MidiUnavailableException on e) { } }
Pemrograman Game Java
7
J.E.N.I. Penanganan error sangat diperlukan untuk mencegah program yang dijalankan crash atau rusak.
4.7 Class OperasiSuara Pembua Pembuatan tan class class Operas OperasiSu iSuara ara dimaks dimaksudk udkan an agar agar dapat dapat diguna digunaka kan n pada pada pembuatan game nanti dengan mempermudah peserta ketika mengakses dan mendengarkan suara. import java.io.*; import java.net.*; import javax.sound.sampled.*; public class OperasiSuara{ private AudioInputStream suara suara; ; klip; ; private Clip klip private String namaFile = "" ""; ; private boolean private boolean looping = false; private int repeat = 0; public OperasiSuara(){ try{
klip = AudioSystem.getClip(); }catch(LineUnavailableException e) {System. out.println("Terjadi .println("Terjadi kesalahan pada klip suara : "+e.toString());} } public OperasiSuara(String filesuara) { this();//memanggil ();//memanggil default konstruktor pertama (tanpa
parameter); load(filesuara); } public boolean public boolean load(String filesuara){ try{
setFilename(filesuara); suara = AudioSystem. getAudioInputStream(getURL(namaFile (getURL(namaFile)); )); klip.open( klip .open(suara suara); ); return true ; }catch(IOException e){ return false; }catch(UnsupportedAudioFileEx (UnsupportedAudioFileException ception e){ return false; }catch(LineUnavailableException e){ return false; } } setFilename(String nama_fail) {namaFile = public void public void setFilename(String nama_fail;} {looping = ulang;} public void public void setLooping( boolean ulang) {looping boolean
Pemrograman Game Java
8
J.E.N.I. {repeat= = ulangi;} public void setRepeat(int ulangi) {repeat public void public Clip getClip() { return klip klip;} ;} repeat;} ;} public int getRepeat() {return repeat public boolean public boolean getLooping() {return looping looping;} ;} namaFile;} ;} public String getNamaFile() {return namaFile private URL getURL(String filename){ URL url = null; try { url = this.getClass().getResource(filename); System.out.println(url); }catch(Exception e){ System.out.println("error .println("error url : "+e.toString());} return url; } public boolean public boolean isLoaded(){ (boolean)(suara )(suara != null ); return boolean } public void public void play(){ if (!isLoaded()) return ; klip.setFramePosition(0); klip .setFramePosition(0); if(looping looping) )
klip.loop(Clip. klip .loop(Clip.LOOP_CONTINUOUSLY ); ); else
klip.loop( klip .loop(repeat repeat); ); } public void public void stop(){
klip.stop(); klip .stop(); } }
4.8 Class OperasiMIDI Pembuatan class OperasiMIDI sangat dibutuhkan ketika peserta sudah masuk masuk pada pembuatan pembuatan geme dimana perserta perserta hanya hanya mengakses mengakses method yang disediakan di class ini dan tanpa harus menuliskannya secara berulangulang. import java.io.*; import java.net.*; import javax.sound.midi.*; public class OperasiMidi{ private Sequence suara suara; ; private Sequencer ambilSuara ambilSuara; ; private String namaFile namaFile; ; private boolean private boolean looping = false; private int repeat = 0;
public OperasiMidi(){ try{
ambilSuara = MidiSystem.getSequencer ();
Pemrograman Game Java
9
J.E.N.I. }catch(MidiUnavailableException e){ } } public OperasiMidi(String fileMidi){ ();//memanggil default konstruktor pertama (tanpa this();//memanggil
parameter); load(fileMidi); } public boolean public boolean load(String load(String fileMidi){ try{
namaFile = fileMidi; suara = MidiSystem.getSequence(getURL(namaFile (getURL( namaFile)); )); ambilSuara.setSequence( ambilSuara .setSequence(suara suara); ); ambilSuara.open(); ambilSuara .open(); return true ; }catch(InvalidMidiDataException e){ return false; }catch(MidiUnavailableException e){ return false; }catch(IOException e){ return false; } } public void setLooping( public void boolean ulang) {looping boolean {looping =ulang;} public void public void setRepeat(int ulangi) {repeat {repeat= = ulangi;} public Sequence getSuara() { return suara suara;} ;} public String getFilename() {return namaFile namaFile;} ;} looping;} ;} public boolean public boolean getLooping() {return looping public int getRepeat() {return repeat repeat;} ;} private URL getURL(String filename){ URL url = null; try { url = this.getClass().getResource(filename); }catch(Exception e){ } return url;
} public boolean public boolean isLoaded(){ (boolean)(ambilSuara )(ambilSuara.isOpen()); .isOpen()); return boolean
} public void public void play(){ (!ambilSuara.isOpen()) .isOpen()) return; if(!ambilSuara if(looping looping){ ){
ambilSuara.setLoopCount(Sequencer. ambilSuara .setLoopCount(Sequencer. LOOP_CONTINUOUSLY ); ambilSuara.start(); ambilSuara .start(); }else { ambilSuara.setLoopCount( ambilSuara .setLoopCount( repeat repeat); ); ambilSuara.start(); ambilSuara .start(); } } public void public void stop(){
ambilSuara.stop(); ambilSuara .stop(); } }
Pemrograman Game Java
10
J.E.N.I. BAB 5 GRAFIK VEKTOR
5.1 Pendahuluan Grafik vektor banyak sekali digunakan pada pembuatan game-game 2 dimensi dimensi dimana terdapat terdapat banyak banyak method method yang sudah disediaka disediakan n oleh Java seper seperti ti ketika ketika menang menangani ani penguj pengujian ian tabrak tabrakan an,, menam menampil pilkan kan bound bound berup berupa a rectangle rectangle dan masih masih banyak banyak lagi. Grafik vektor vektor merupaka merupakan n pelajaran pelajaran dasar yang yang harus dipelajari dipelajari sebelum sebelum memasuki memasuki pembahasan pembahasan grafik bitmap. pada modul ini juga dibahas masalah tentang penanganan grafis full screen dimana game yang akan dibuat dapat dimainkan dalam satu layar penuh.
5.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Mengetahui cara menggunakan interface Shape.
•
Menggambar garis menggunakan class Graphics2D.
•
Mengetahui perbedaan antara Rectangle2D dan RoundRectangle2D.
•
Menggambar menggunakan Arc2D.
•
Memahami fungsi dari Polygon.
•
Membuat tampilan mode Full-Screen
•
Menjalankan dan menutup mode Full-screen
5.3 Grafik Vektor Java 2 Dimensi yang tepatnya terdapat pada Class Graphics2D yang berada berada didalam didalam java.awt.* java.awt.* menyediakan menyediakan banyak fitur untuk bekerja dengan dengan grafik vektor 2D, yang memungkinkan pengguna untuk menggambar bentuk Pemrograman Game Java
1
J.E.N.I. persegi panjang, poligon dan bentuk-bentuk lain dengan mudah. Class-Class yang ada didalam Graphics2D tidak hanya menggambar saja tetapi juga dapat menggeser, merotasi, dan menskala bentuk.
5.4 Koordinat di Java Berbeda dengan bahasa pemrograman lain, java mempunyai dua sistem koord koordina inatt yang yang pertam pertama a user user space space adalah adalah koordi koordinat nat yang yang diguna digunakan kan oleh oleh program java, semua yang berbentuk geometri di petakkan di koordinat ini. Yang ang kedu kedua a yaitu aitu devi device ce spac space e
adal adalah ah sist sistem em koor koordi dina natt devi device ce yang ang
tergantung pada output device yang digunakan.Bisanya konversi dari device space space ke user user space space dilaku dilakukan kan secara secara otoma otomatis tis ketika ketika proses proses render rendering ing.. Gambar dibawah ini menunjukan perbeadaan antara user space dan device space. X=0,y= x Y Y x X=0,y= User Space
Device Space
Gambar 5.1 Sistem Koordinat 5.5 Interface Shape Sebe Sebelu lum m ke pemb pembah ahas asan an yang ang lebi lebih h dala dalam m lagi lagi seba sebaik ikny nya a kita kita menge mengetah tahui ui terleb terlebih ih dahulu dahulu tentan tentang g Interf Interface ace Shape. Shape. Interf Interface ace Shape Shape ini terdapat dalam package java.awt.* yang mendefinisikan tentang grafik primitif seperti titik, garis, sudut, persegi panjang, kurva, dan elips seperti terlihat pada
Pemrograman Game Java
2
J.E.N.I. gambar gambar dibawah. dibawah. Class-clas Class-class s seperti seperti Rectangle Rectangle mengguna menggunakan kan nilai integer, integer, sedangkan Rectangle2D menggunakan menggunakan float dan double.
Gambar 3.16 Implementasi Interface Shape
5.6 Bekerja dengan Line2D Tipe yang paling dasar dari shape adalah garis, dibuat dengan class Line2D.Float, untuk membuat garis harus menuliskan secara spesifik koordinat x dan y untuk titik awal dan akhir. Sebagai contoh: Shape garis = new Line2D.Float(0,0,100,100); Line2D.Float(0,0,100,100);
Kode diatas, menentukan posisi garis dibuat mulai dari koordinat (0,0) sampai dengan (100,100). Line2D.Float adalah class mempunyai alternatif konstruktor yang dapat menerima object Point2D sebagai parameter. Point2D juga sebuah Abstract class class denga dengan n inner inner class class Float Float dan Double Double untuk untuk itu harus harus mengg mengguna unakan kan Point2D.Float atau Point2D.Double pada awal pembuatan object. Dibawah ini adalah contoh yang sama menggambarkan garis menggunkan object point2D. Pemrograman Game Java
3
J.E.N.I. Point2D awal=new Point2D.Float(0,0); Point2D akhir=new Point2D.Float(100,100); Point2D.Float(100,100); Shape garis = new Line2D.Float(awal, Line2D.Float(awal, akhir);
5.7 Bekerja dengan Rectangle2D & Ellipse Rectangle membutuhkan titik awal (x, y) dan (lebar, tinggi). Dibawah ini sebuah rectangle dimulai pada titik (20,20) dengan lebar 50 dan tinggi 30. Bentuk dari rectanggle dapat dilihat seperti gambar Gambar 3.17 Rectanggle2D
disamping. Shape rect = new Rectangle2D.Float(20,20,50,30);
Java
juga
Roun RoundR dRec ecta tang ngle le2D 2D
menyediakan yang yang
class
memu memung ngki kink nkan an
untuk menggambar dengan lengkungan pada seti setiap ap sudu sudut. t. Cons Constr truc ucto torr pada pada class lass ini ini Gambar 3.18 RoundRectanggle2D
menambahkan dua parameter lagi untuk menentukan lebar dan tinggi busur di masing-masing sudut. Shape round_rect = new RoundRectangle2D.Float(20,20,50,30,10,10);
Ellipse2D Ellipse2D tidak jauh berbeda berbeda dengan dengan Rect Rectan angl gle2 e2D D hany hanya a saja saja jika jika bata batas s dari dari rectangle adalah persegi maka ellipse adalah lingk lingkara aran. n. Bentu Bentuk k dari dari ellips ellipse e dapat dapat diliha dilihatt pada gambar disamping.
Gambar 3.19 Ellipse2D
Shape ellipse = new Ellipse2D.Float(20,20,50,30); Ellipse2D.Float(20,20,50,30);
Pemrograman Game Java
4
J.E.N.I. 5.8 Bekerja dengan Arc2D Tipe Tipe dari dari shap shape e yang ang sang sangat at begu beguna na adal adalah ah Arc2 Arc2D. D. Yang Yang perl perlu u diperhatikan dalam pembuatan Arc2D adalah: Sudut 0 o dimulai dari sebelah 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 Konstanta Konstanta ini mereperes mereperesentas entasikan ikan bentuk bentuk busur busur terbuka terbuka yang yang berupa berupa sebuah garis kurva bagian luar dari ellipse. PIE Konst Konstata atanta nta ini merep merepres resent entasi asikan kan sebuah sebuah busur busur yang yang merupa merupakan kan potongan dari pie dimana garis kurva merupakan garis luar dari elipse dan garis lurus dari ujung busur ke titik tengahnya. CHORD Konstanta ini merepresentasikan sebuah busur dimana terdapat garis lurus yang menghubungkan antara kedua ujung busur. Shape arc1 = new Arc2D.Float(20,20,50,30,90,90,Arc2D.OPEN); //atau: Shape arc1 = new Arc2D.Float(20,20,50,30,90,90,Arc2D.CHORD); //atau: Shape arc1 = new Arc2D.Float(20,20,50,30,90,90,Arc2D.PIE);
5.9 Bekerja dengan Polygon Kela Kelas s poly polygo gon n sedi sediki kitt berb berbed eda a deng dengan an Rect Rectan angle gle kare karena na Poly Polygo gon n mengijink mengijinkan an untuk mendefin mendefinisika isikan n bentuk bentuk sesuai sesuai dengan dengan keinginan keinginan sendiri sendiri deng dengan an meng menggu guna naka kan n pasa pasang ngan an nila nilaii X dan dan Y. Untu Untuk k memb membua uatt sebu sebuah ah polygon cukup dengan sebuah titik tunggal atau sebuah polygon dengan empat titik untuk menyalin class Rectangle. Pemrograman Game Java
5
J.E.N.I. int titikX[] = {200,100,130,270,300}; int titikY[] = {50,150,270,270,150};
Ketika membuat sebuah polygon dengan cara ini, perhatikan array X dan dan Y harus harus berpas berpasang angan, an, maksu maksudny dnya a setiap setiap nilai nilai X harus harus berpas berpasang angan an dengan dengan setiap setiap nilai Y. Terkadang Terkadang cukup membingu membingungka ngkan n ketika ketika anda harus mendefinisikan bentuk polygon dengan menggunakan 2 buah array dari titik X dan Y, jadi sebaiknya mendesain polygon pada kertas atau editor grafik terlebih dahulu. Gambar dibawah menunjukkan desain dari polygon 5 sisi.
Gambar 5.2 Bentuk Gambar Koordinat Poligon
Melih Melihat at sebu sebuah ah diag diagra ram m deng dengan an gamb gambar ar akan akan sang sangat at memb memban antu tu,, khusu khususny snya a ketika ketika mempu mempuny nyai ai pekerj pekerjaan aan memb membuat uat sebuah sebuah polyg polygon on yang yang kompleks. Berikut ini adalah potongan kode pendefinisian polygone. Polygon poligon= new Polygon(titikX Polygon( titikX, , titikY titikY, , titikX titikX. .length length); );
Untuk Untuk mengg menggam ambar bar sebuah sebuah bentuk bentuk,, baik baik itu sebua sebuah h kotak, kotak, sebuah sebuah polyg polygon on atau atau yang yang lain, lain, ada dua metho method d piliha pilihan n yaitu yaitu metho method d fill() fill() untuk untuk menggam menggambar bar bentuk bentuk dengan dengan warna didalamny didalamnya a atau dapat dapat mengguna menggunakan kan method draw() untuk menggambar garis luar / border dari sebuah bentuk dalam warna tertentu.
Pemrograman Game Java
6
J.E.N.I. // Gambar Bentuk dengan didalamnya g2d.fill(poligon); // Gambar garis luarnya saja g2d.draw(poligon);
Jangan lupa sebelum digambar seting warna pada Graphics2D sesuai deng dengan an
kein keingi gina nan, n,ag agar ar
lebi lebih h
muda mudah h
dala dalam m
sett settin ing g
warn warna a
sebai ebaikn kny ya
menggunakan class Color dengan pemanggilan attribut abstractnya yaitu jenis jenis warna. // Setting Warna menggunakan Class Color sebagai parameter g2d.setColor(Color.RED);
5.10 Membuat Tampilan Mode Full-Screen Mode Full-sc Full-screen reen berada berada didalam didalam object object
java.awt. java.awt.Graph GraphicsDev icsDevice, ice,
didalam singel atau multi-monitor dapat memanggil method getScreen-Devices pada
dan
java.awt.GraphicsEnvironment
untuk
sing ingle
monitor
dapat
menggunakan getDefaultScreenDevices getDefaultScreenDevices.. private GraphicsDevice device device; ;
......... .........
GraphicsEnvironment environment = GraphicsEnvironment. getLocalGraphicsEnvironment (); device = environment.getDefaultS environment.getDefaultScreenDevice( creenDevice(); );
5.10.1 Display Mode DisplayMo ayMod de
adalah
class
yang
dise isediakan
oleh
jav java
untuk
menge mengenk nkaps apsula ulasi si ukuran ukuran (tingg (tinggi, i, lebar lebar dari dari monit monitor or dengan dengan satuan satuan pixel) pixel),, ketajaman bit (banyaknya bit per pixel), dan refresh rate (frekwensi monitor untuk untuk
kecep kecepata atan n rata-ra rata-rata ta dalam dalam menampi menampilka lkan n citra) citra).. Untuk Untuk menge mengetah tahui ui
display mode pada layar cukup dengan memanggil method getDisplayMode dan dan jika jika ingin ingin menam menampilk pilkan an semua semua mode mode displa display y yang yang diduku didukung ng gunak gunakan an
Pemrograman Game Java
7
J.E.N.I. method method getDisplay getDisplayModes. Modes. Sebelum Sebelum mencoba mencoba untuk untuk merubah merubah display display mode sebai sebaikny knya a periks periksa a terleb terlebih ih dahulu dahulu apakah apakah sistem
mendu menduku kung ng atau atau tidak tidak
dengan memanggil method isDisplayChangeSupported jika meengembalikan nilai true berarti sistem operasi mendukung untuk merubah display mode. .... .... device.isDisplayChangeSupported()) .isDisplayChangeSupported()) if (device
{ device.setDisplayMode( device .setDisplayMode(displayMode displayMode); ); }else{ System. out.println("Sistem .println("Sistem Operasi Tidak Mendukung Mode DisplayChange"); DisplayChange" ); System. exit (0); } .... ....
Untuk memeriksa apakah sistem operasi mendukung mode full-screen atau tidak gunakan gunakan method method isFullScreenSupported isFullScreenSupported akan mengembalikan mengembalikan nilai true true apab apabila ila obje object ct Gaph Gaphic icsD sDev evic ices es mend menduk ukun ung g mode mode Full Full-s -scr cree een n dan dan mengembalikan mengembalikan nilai false jika tidak mendukung mode tersebut. public void setFullScreen(DisplayMode displayMode,JFrame frame) { public void if(device device.isFullScreenSupported()){ .isFullScreenSupported()){
frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE ); frame.setUndecorated(true); frame.setResizable(false); device.setFullScreenWindow(frame); device .setFullScreenWindow(frame); if(displayMode != null && device device.isDisplayChangeSupported()){ .isDisplayChangeSupported()){ try {
device.setDisplayMode(displayMode); device.setDisplayMode(displayMode); }catch (IllegalArgumentExcept (IllegalArgumentException ion ex) { } }
}else{ System.out.println("System .println("System tidak mendukung Mode Full-screen"); Full-screen" ); } }
Method setUndecorated() diberi nilai true untuk menghilangkan title bar dan bingkai pada frame, sedangkan method setResizeable() diberi nilai false agar screen tidak dapat diubah-uba diubah-ubah h ukuranny ukurannya, a, kemudian kemudian untuk untuk merubah merubah Pemrograman Game Java
8
J.E.N.I. tampil tampilan an full-s full-scre creen en mengg menggunk unkan an metho method d setFul setFullSc lScree reenWi nWindo ndow() w() dimana dimana argumen yang dilewatkan adalah JFrame. Perlu diketahui bahwa JFrame yang dilewatkan di dalam method setFullScreen(.... , ....) diatas tidak boleh di setting setVisible(true) karena jika di setting demikian maka method FullScreen tidak dapat berjalan sesuai dengan keinginan. Selanjutnya mendefinisikan beberapa DisplayMode atau ukuran resolusi yang akan digunakan untuk menentukan tinggi dan lebar layar yang diinginkan hanya dengan menentukan array dari resolusi yang telah disediakan, listing programnya adalah sebagai berikut. private static final DisplayMode new DisplayMode(1024, 768, new DisplayMode(1024, 768, new DisplayMode(1024, 768,
Mode_Pilihan [] = {
32, 0), 24, 0), 16, 0),
new DisplayMode(800, DisplayMode(800, 600, 32, 0), new DisplayMode(800, 600, 24, 0), new DisplayMode(800, 600, 16, 0), new DisplayMode(640, 480, 32, 0), new DisplayMode(640, 480, 24, 0), DisplayMode(640, 480, 16, 0) new DisplayMode(640,
};
Array
Mode_Pilihan
diatas
akan
diperiksa
oleh
method
periksaDisplayMode() yang melewatkan dua parameter yang bertujuan untuk meme memerik riksa sa apak apakah ah sist sistem em yang kita kita guna gunaka kan n mend menduk ukun ung g resol resolus usii yang yang didefinisikan tersebut atau tidak. public boolean public boolean perikasDisplayMode(DisplayMode
mode1,DisplayMode
Mode2){ if (mode1.getWidth() (mode1.getWidth() != mode2.getWidth() mode2.getWidth() ||
mode1.getHeight() mode1.getHeight() != mode2.getHeight()) mode2.getHeight()) return false; } { if (mode1.getBitDepth() != DisplayMode. BIT_DEPTH_MULTI && mode2.getBitDepth() != DisplayMode. BIT_DEPTH_MULTI && mode1.getBitDepth() != mode2.getBitDepth()) return false; } { if (mode1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN && mode2.getRefreshRate() mode2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN && mode1.getRefreshRate() != mode2.getRefreshRate()) { return false; }
Pemrograman Game Java
9
J.E.N.I. return true;
}
Pada Pada metho method d periks periksaDi aDispl splay ayMod Mode e diatas diatas akan akan menge mengemb mbali alikan kan nilai nilai berupa boolean yang artinya jika tidak cocok dengan kondisi yang diperiksa diatas diatas maka maka akan akan menge mengemb mbali alikan kan nilai nilai false. false. Method Method ini akan akan dipang dipanggil gil di dalam sebuah method setResolusiLayar() dimana method ini melewatkan satu parameter untuk menentukan index array yang akan di gunakan. Berikut ini adalah listing programnya. public DisplayMode setResolusiLayar( int nilai){ if(nilai >=9)nilai=0;
DisplayMode sistemMode[] = device device.getDisplayModes(); .getDisplayModes(); for (int j = 0; j < sistemMode.length sistemMode.length; ; j++) { if (perikasDisplayMode( Mode_Pilihan[nilai], sistemMode[j])) { return Mode_Pilihan [nilai]; } } return null ; }
Seperti
yang
getD getDis ispl play ayMo Mode des( s())
telah
yang ang
dijelaskan
bera berada da
dida didala lam m
sebelumnya clas class s
bahwa
method
Grap Graphi hics csDe Devi vice ce
akan akan
memb memberik erikan an nilai nilai berupa berupa array array Displa DisplayM yMode ode yang yang di dukung dukung oleh oleh sistem sistem operasi yang kita gunakan dan selanjutnya akan di cross-cek apakah sama dengan DisplayMode yang kita tentukan pada parameter setResolusiLayar(). Setelah mendefinisikan variabel dan beberapa method diatas, sekarang kita membuat satu method lagi yaitu tutupScreen() yang akan dipanggil apabila user akan mengakhiri mode full-screen. tutupScreen() { public void public void tutupScreen() Window window = device device.getFullScreenWindow(); .getFullScreenWindow(); if (window != null) { window.dispose(); } device.setFullScreenWindow( device .setFullScreenWindow(null); }
Pemrograman Game Java
10
J.E.N.I. Pada class class GraphicsDe GraphicsDevice vice terdapat terdapat method method getFullScre getFullScreenWin enWindow( dow()) yang akan merepresentasikan jendela full-screen jika device dalam keadaan mode full-screen dan mengembalikan nilai
null
apabila tidak dalam keadaan
mode full-screen. Method dispose() yang berada dalam class Window berfungsi untu untuk k memb membeb ebas aska kan n semu semua a
nati native ve scre screen en yang yang digu diguna naka kan n dan dan akan akan
mengemb mengembalika alikan n semua semua resource resource yang yang dipakai dipakai kepada kepada sistem sistem operasi. operasi. Jika semua berjalan lancar maka method setFullScreenWindow() diberi nilai null untuk menonaktifkan atau menutup mode full-screen.
5.10.2 Menjalankan dan Menutup Mode Full-Screen Seperti yang kita ketahui bahwa class ScreenManager telah berhasil dibuat sekarang mari kita mencoba untuk memanggil dan menjalankan methodmethod yang ada didalam class tersebut seperti pada baris program berikut ini: ........ screen; ; private ScreenManager screen public void public void () { screen = new ScreenManager(); try {
DisplayMode displayMode = screen screen.setResolusiLayar(1); .setResolusiLayar(1); screen.setFullScreen(displayMode, screen .setFullScreen(displayMode,new PercobaanArc2d()); } catch (Exception e){
screen.restoreScreen(); screen .restoreScreen(); } } .......
Pada potongan kode diatas kita membuat object dari DisplayMode yang diguna digunakan kan untuk mengat mengatur ur resolu resolusi si
yang yang kemud kemudian ian dilewatka dilewatkan n sebaga sebagaii
argument pertama dan class yang akan ditampilkan dalam mode full-screen yang dilewatkan pada argument kedua didalam method setFullScreen(). Untuk method restoreScreen() dipanggil apabila terjadi eror atau jika ingin menutup mode full-screen. Pemrograman Game Java
11
J.E.N.I. BAB 6 GRAFIK BITMAP
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 pesa pesawa watt yang yang untu untuh h samp sampai ai pada pada pesa pesawa watt yang yang hanc hancur ur atau atau mele meleda dak k dikum dikumpul pulkan kan menja menjadi di satu satu kesatu kesatuan an dan akan akan dipang dipanggil gil saat saat dibutu dibutuhka hkan n (apabi (apabila la terken terkena a bom maka maka gambar gambar pesaw pesawat at yang yang ditamp ditampilk ilkan an meleda meledak) k) ilustrasinya seperti itu dan masih banyak lagi yang lain sesuai dengan game yang akan dibuat.
6.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Mengetahui jenis-jenis format image
•
Mengetahui cara meload file image
•
Memuat gambar strip atau gambar bernomor
6.3 Pengenalan Image(Gambar) Game sebenarnya tentu saja tidak hanya menggunakan primitive object seper seperti ti grafik grafik vektor vektor melai melainka nkan n juga juga mengg mengguna unakan kan bitma bitmap. p. Sebua Sebuah h game game biasanya menggunakan format gambar GIF, GIF, JPEG, dan PNG. Grap Graphi hics cs Inte Interc rcha hang nge e Form Format at atau atau gamb gambar ar GIF GIF sang sangat at baik baik untu untuk k tampilan tampilan grafis cartoon cartoon yang yang menggunakan menggunakan beberap beberapa a warna. Gambar Gambar mengguna menggunakan kan 256 elemen elemen tabel Pemrograman Game Java
GIF
warna warna untuk menyimpan menyimpan informasi. informasi. Selah 1
J.E.N.I. satu dari table warna digunakan untuk representasi warna “Transparan” yang mana tidak digambar oleh Program JAVA. File Joint Photographic Experts Group (JPEG) menggunakan 3 byte atau 24 bit per pixel, dimana 1 byte untuk merah, hijau dan biru (komponen RGB). File File JPEG JPEG sangat sangat bagus bagus untuk untuk gambar gambar foto foto yang yang beruku berukuran ran besar besar sepert sepertii background game. File JPEG tidak menyediakan transparansi. Form Format at
Port Portab able le
Netw Networ ork k
Grap Graphi hics cs
(PNG (PNG))
dima dimaks ksud udka kan n
untu untuk k
menggantikan file GIF, dimana format ini menyertakan sebuah chanel Alpha yang memungkinkan adanya area tembus cahaya(Transluccency) cahaya(Transluccency) pada sebuah gambar. Tembus cahaya (Transluccency) adalah bagian yang sangat berguna untuk efek game seperti tembakan laser, asap, dll. Beberapa pengembang lebih suka menggunakan PNG karena standarnya open source.
6.4 Memuat Gambar Aplik likasi
java
dapat
dengan
mudah
memuat
sebuah
gambar
menggunakan class Toolkit. Toolkit tk = new Toolkit.getDefaultTollkit(); Image = tk.getImage(“test.jpg”);
Ketika menggunakan Toolkit, class tersebut menggunakan thread untuk memuat gambar secara terpisah. Karena class Toolkit menggunakan thread maka program kita tidak akan pernah tahu kapan pemuatan gambar selesai dilakukan, dilakukan, hasilnya hasilnya gambar gambar yang akan kita tampilkan tampilkan bisa saja ditampilkan ditampilkan sebagian karena belum selesai di muat atau bahkan tidak sama sekali.
Pemrograman Game Java
2
J.E.N.I. Untu ntuk
menu enutupi tupi
kelam lamahan han
Toolk oolkit it,,
Jav Java
menyed nyedia iak kan
clas lass
MediaTracker, kita dapat menggunakan class ini agar aplikasi kita menunggu sampai sebuah gambar dimuat. Image logo = getToolkit().getImage("test.jpg");
MediaTracker mediaTracker = new MediaTracker(this); mediaTracker.addImage(logo, 0); try { mediaTracker.waitForID(0); } catch(InterruptedException e) { System.out.println(e); }
Meskip Meskipun un mengg mengguna unakan kan MediaT MediaTrac racker ker mudah mudah,, namun namun akan akan sangat sangat membosankan jika harus melakukanya untuk setiap gambar yang akan dimuat (bay (bayan angk gkan an jika jika memu memuat at 100 100 gamb gambar ar). ). Ada Ada cara cara yang yang lebi lebih h muda mudah h yaitu aitu denga dengan n menggu menggunak nakan an class class ImageI ImageIO. O. Class Class ImageI ImageIO O menye menyedia diakan kan cara cara tercepat memuat image. Image logo=null; try { logo = ImageIO.read(new ImageIO.read(new File(“test.jpg”)); } catch(IOException catch(IOException e) { System.out.println(e); }
Pemrograman Game Java
3
J.E.N.I. 6.5 Menggunakan BufferedImage Buffe uffere redI dIm mage
merup rupaka akan
turu turuna nan n
dari dari
class lass
Imag Image. e.
Deng Dengan an
Buffer BufferedI edImag mage e maka maka gambar gambar yang yang akan akan di tampilk tampilkan an akan akan dimuat dimuat sampa sampaii selesai sehingga menghindari terjadinya penggambaran secara partial. Class Buffer Bufferred redIma Image ge juga juga memil memiliki iki keung keunggu gulan lan dalam dalam hal manup manupula ulasi si gamba gambar r melalui method-methodnya dan kemampuan untuk secara otomatis di ubah ke dalam Managed Managed Image Image oleh JVM. Managed Managed Image Image memungki memungkinkan nkan adanya adanya akselerasi secara hardware. BufferedImage im;
public void init( ) { try { im =ImageIO.read( getClass( ).getResource("ball.gif") ); } catch(IOException e) { System.out.println("Error Loading Image : "e.toString()); } }
Cara termudah dan tercepat tercepat memuat memuat image image kedalam kedalam BufferedIm BufferedImage age adala adalah h menggu menggunak nakan an class class ImageI ImageIO. O. Menuru Menurutt bebera beberapa pa penguj pengujian ian class class ImageIO ImageIO lebih cepat 10% dari class ImageIco ImageIcon, n, dan mungkin bisa bisa semakin semakin besar besar jarakn jaraknya ya jika jika yang yang di muat muat adalah adalah gambar gambar beres beresolu olusi si besar. besar.Unt Untuk uk kepentingan lebih lanjut, BufferedImage yang akan kita buat akan di sesuaikan dengan konfigurasi device yang kita miliki. try { BufferedImage im = ImageIO.read(getClass( ).getResource(fnm));
int transparency = im.getColorModel( ).getTransparency( ); BufferedImage BufferedImag e copy =
Pemrograman Game Java
gc.createCompatibleImage( gc.createComp atibleImage(
4
J.E.N.I. im.getWidth( ),im.getHeight( ),transparency );
Graphics2D g2d = copy.createGraphics( copy.createGraphics( );
g2d.drawImage(im,0,0,null); g2d.dispose( g2d.dispose( ); return copy; } catch(IOException e) { System.out.println("Loa System.out.println("Load d Gambar " + fnm + " eror :\n" + e); return null;
}
Tiga Tiga argum argumen en dalam dalam metho method d create createCom Compat patibl ibleIm eImage age adalah adalah lebar, lebar, tin tinggi ggi
dan
nilai ilai
tran transp spa aran ransi. si.
Tran Transp spar aren ency cy.O .OPA PAQU QUE, E, TRANS RANSLU LUCE CENT NT
.
Terda erdap pat
tiga tiga
nila nilaii
Tran Transp spare arenc ncy. y.BIT BITMA MASK, SK,
Opa Opaque que
digu diguna naka kan n
untu untuk k
tran trans sparan arans si
dan dan
mewak ewakil ilii
yaitu aitu
Tran Transp spar aren ency cy.. gambar bar
tanp tanpa a
kemam kemampua puan n transp transpara aransi nsi,, conto contohny hnya a gambar gambar bereks bereksten tensi si JPG. JPG. Bitma Bitmask sk digunakan untuk merepresentasikan area kosong (tidak digambar) yang dimiliki gamba gambarr berfor berforma matt GIF. GIF. Transl Transluce ucent nt diguna digunaka kan n PNG sebag sebagai ai area area tembus tembus cahaya. cahaya. Tanpa adanya parameter parameter transparan transparansi si kemungki kemungkinan nan besar besar gambar gambar akan di gambar tidak sesuai dengan yang diharapkan.
6.6 Membuat Image Manager Sebelumnya telah dibahas cara memuat image kedalam aplikasi, tetapi dalam game sebuah object nantinya tidak hanya terdiri dari gambar statis yang bergerak hanya hanya karena transformasi. Pada game 2 dimensi setiap setiap object bisa saja merupakan animasi bahkan ketika ia tidak mengalami transformasi. Untuk mengakom mengakomodas odasii keperluan keperluan tersebut maka akan digunakan digunakan 2 teknik. teknik. Teknik Teknik pert pertam ama a adal adalah ah meny menyed edia iaka kan n sebu sebuah ah gam gambar bar yang ang isin isiny ya terd terdir irii dari dari sequencial animasi suatu karakter. Dengan teknik ini gambar tidak akan di Pemrograman Game Java
5
J.E.N.I. tampilkan seluruhnya melainkan per frame ( setiap bagian dalam sequence akan kita anggap sebagai frame). Teknik kedua adalah menggunakan gambar yang berbeda untuk setiap frame namun dengan nama sama plus identitas iterasi (contohnya : player1.png, player2.png, player3.png dst).
6.7 Mendefinisikan Aturan Pemuatan Gambar Untuk membuat sebuah class yang akan menerima pemuatan pemuatan semua semua tipe tipe
gamb gambar ar
maka maka
perl perlu u
mend mendef efin inis isik ikan an
pera peratu tura rann-pe pera ratu tura rany nya. a.
Clas Class s
ImageManager akan memiliki method yang berbeda untuk setiap penganganan jenis gambar yang berbeda. Class Image Manager yang kita buat akan menggunakan sebuah object HashMap untuk memetakan setiap object gambar dengan sebuah kunci unik. Setiap gambar dapat diakses melalui method accessor dengan melewatkan nama sebagai parameter. Setiap nilai yang di simpan dalam HashMap adalah sebua sebuah h Array ArrayLis List. t. Array ArrayLis Listt diguna digunakan kan karena karena anggot anggota a dari dari sebua sebuah h record record dalam HashMap bisa berisi lebih dari satu gambar. Mungkin class ini sedikit rumi rumitt dan dan memb membin ingu gung ngka kan, n, teta tetapi pi clas class s ini ini akan akan sang sangat at berg bergun una a untu untuk k keperluan game berikutnya. Untu Untuk k kepe keperl rlua uan n pemu pemuat atan an gamb gambar ar keda kedala lam m clas class s ini, ini, kita kita akan akan memb membua uatt 3 meth method od.. Meth Method od pert pertam ama a digu diguna naka kan n untu untuk k memu memuat at gamb gambar ar tunggal, method kedua digunakan untuk memuat gambar berurutan dengan postfiks urutan gambar, dan method terakhir digunakan untuk memuat gambar strip strip (frame (frame). ). Setiap Setiap method method akan akan mengg mengguna unakan kan sepas sepasang ang metho method d yang yang berfungsi memisahkan prefix dan postfix parameter method bersangkutan dan sebuah sebuah method method untuk me-muat me-muat image image (jangan (jangan bingung, bingung, sebenarny sebenarnya a ketiga ketiga Pemrograman Game Java
6
J.E.N.I. method yang disebutkan sebelumnya tidak berfungsi memuat gambar secara langs langsung ung melai melainka nkan n berfun berfungs gsii me-me me-metak takan an gambar gambar yang yang di muat muat kedala kedalam m HashMap). private String getPrefix(String fnm) // mengambil String sebelum '.' dari nama file { int posn; if ((posn = fnm.lastIndexOf(".")) fnm.lastIndexOf(".")) == -1) { System.out.println("Prefix tidak ditemukan untuk nama file: " + fnm); return fnm; } else return fnm.substring(0, posn); }
private String getPosfix(String fnm) // mengambil String sesudah '.' dari nama file { int posn; if ((posn = fnm.lastIndexOf(".")) fnm.lastIndexOf(".")) == -1) { System.out.println("Posfix tidak ditemukan untuk nama file:" + fnm); return fnm; } else return fnm.substring(posn); }
6.8 Gambar Tunggal Untuk meload gambar tunggal, method yang digunakan sama dengan method pemuatan gambar yang telah dibahas. Method ini mengembalikan nilai boole boolean an sehin sehingga gga kita kita bisa bisa mengg mengguna unakan kanny nya a untuk untuk mema memasti stikan kan gamba gambar r berhasil dimuat. public boolean loadSingleImage(String fnm) {
Pemrograman Game Java
7
J.E.N.I. String name = getPrefix(fnm); getPrefix(fnm);
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, imagesMap.put(name, imsList); System.out.println(" System.out.println("
disimpan " + name + "/" + fnm);
return true; } else return false;
}
6.9 Gambar Ber-Nomor Meth ethod
yang ang
menan enang gani
gambar bar
ber-n er-nom omor or
bek bekerja erja
deng engan
memisahkan memisahkan prefix dan postfix lalu menambahkan urutan gambar setelah prefix dan dan mengg menggabu abungk ngkan an kemaba kemabalili denga dengan n postfix postfix menja menjadi di argum argumen en metho method d LoadI LoadImag mage() e().. Sepert Sepertii halny halnya a pemua pemuatan tan gambar gambar tungga tunggal, l, nama nama unik unik yang yang dugunakan sebagai kunci HashMap adalah prefix dari parameter method ini.
Dig0.gif
Dig1.gif
Dig2.gif
Dig3.gif
Dig4.gif
Dig5.gif
Gambar 6.1 Gambar Bernomor public int loadNumImages(String fnm, int number) { String prefix = getPrefix(fnm); getPrefix(fnm); String postfix = getPosfix(fnm);
Pemrograman Game Java
8
J.E.N.I. String imFnm; BufferedImage BufferedImage bi; ArrayList imsList = new ArrayList(); ArrayList(); int loadCount = 0; for(int i=0; i < number; i++) { imFnm = prefix + i + postfix; if ((bi = loadImage(imFnm)) loadImage(imFnm)) != null) { loadCount++; imsList.add(bi); } }
if (loadCount == 0) System.out.println("Tidak ada images dengan nama " + prefix); else imagesMap.put(prefix, imsList);
return loadCount; }
6.10 Gambar Strip Sepe Sepert rtii yang tela telah h di sing singgu gung ng,, gamb gambar ar strip strip sebe sebena narn rny ya adala adalah h susunan gambar berurutan yang membentuk sebuah animasi dalam sebuah file citra. Biasanya gambar strip digunakan untuk animasi dengan pixel yang kecil. kecil. Gambar Gambar strip strip unggul unggul dalam dalam penggu penggunaa naan n waktu waktu proses proses diband dibanding ingkan kan gamb gambar ar ber-n ber-nom omor or.. Kare Karena na meru merupa paka kan n poto potong ngan an gamb gambar ar,, maka maka setia setiap p potongan harus di pisahkan dari gambar asli sebelum di render.
Gambar 6.2 Gambar Strip 6x1 6x1
Pemrograman Game Java
9
J.E.N.I.
Gambar 6.3 Gambar Strip 8x4
Cara kerja dari method yang akan kita buat adalah memisahkan memisahkan setiap poton potongan gan gambar gambar kedala kedalam m satu satu record record pada pada Array ArrayLis List. t. Pemisa Pemisahan han akan akan dilakukan oleh method loadStripImageArray().
public int loadStripImages(String fnm, int column,int row) { String name = getPrefix(fnm); getPrefix(fnm); BufferedImage[] BufferedImage[] strip = loadStripImageArray(fnm loadStripImageArray(fnm, , column, row); if (strip == null) return 0; ArrayList imsList = new ArrayList(); ArrayList(); int loadCount = 0; for (int i=0; i < strip.length; strip.length; i++) { loadCount++; imsList.add(strip[i]); } if (loadCount == 0) System.out.println("Tidak ada image dengan prefix " + name); else imagesMap.put(name, imsList); return loadCount; } public BufferedImage[] loadStripImageArray(String fnm, int column,int row) { if (column <= 0) { System.out.println("column <= 0; return null"); return null; } BufferedImage BufferedImage stripIm; if ((stripIm = loadImage(fnm)) == null) { System.out.println("Return .println("Return null"); return null; }
Pemrograman Game Java
10
J.E.N.I. int imWidth = (int) stripIm.getWidth() stripIm.getWidth() / column; int imHeight =(int) stripIm.getHeight()/row stripIm.getHeight()/row; ; int transparency = stripIm.getColorModel().getTransparency(); BufferedImage[] BufferedImage[] strip = new BufferedImage[column*row]; BufferedImage[column*row]; Graphics2D stripGC;
for (int i=0;i
}
Bagi Bagian an kode kode yang yang di ceta cetak k teba teball adal adalah ah fung fungsi si utam utama a dari dari meth method od pemuatan pemuatan gambar strip. Untuk menentuk menentukan an parameter parameter pemotong pemotongan an gambar gambar pada method drawImage digunakan dua buah variabel yaitu fx dan fy. Kedua buah variabel tersebut menjadi titik awal pemotongan gambar. int fx=(j%column)*imWidth; int fy=i*imHeight;
Variabel fx menentukan titik x yang didapat dengan mendapatkan hasil modulo nomor kolom dengan jumlah kolom di kali besar gambar per potong. Sedangkan variabel fy menentukan titik y dengan cara mengalikan nomor baris dengan tinggi gambar. 6.11 Mengakses Gambar Setelah berhasil memuat gambar, selanjutnya perlu mengakses gambar tersebut. tersebut. Karena Karena menggunak menggunakan an HashMap HashMap untuk menyimpan menyimpan gambar gambar maka Pemrograman Game Java
11
J.E.N.I. untuk mengaksesnya mengaksesnya baik gambar tunggal, gambar ber-nomor ataupun gambar stri strip p meng menggu guna naka kan n pref prefix ix dari dari gam gambar bar ters terseb ebut ut.. Ada Ada tiga tiga versi ersi untu untuk k mengakse mengakses s gambar, gambar, versi versi pertama pertama menerima menerima satu parameter parameter berupa berupa nama nama gambar, versi kedua menerima dua parameter yaitu nama gambar dan posisi gambar dalam ArrayList dan versi ketiga mengembalikan semua gambar yang terdapat dalam ArrayList dalam nama tertentu.
public BufferedImage getImage(String name) { ArrayList imsList = (ArrayList) imagesMap.get(name); imagesMap.get(name); if (imsList == null) { System.out.println("Tidak ada gambar dengan nama " + name); return null; } return (BufferedImage) imsList.get(0); } public BufferedImage getImage(String name, int posn) { ArrayList imsList = (ArrayList) imagesMap.get(name); imagesMap.get(name); if (imsList == null) { System.out.println("Tidak ada gambar dengan nama " + name); return null; } int size = imsList.size(); if (posn < 0) { return (BufferedImage) (BufferedImage) imsList.get(0); imsList.get(0);
// return first
image } else if (posn >= size) { int newPosn = posn % size; // modulo return (BufferedImage) imsList.get(newPosn); } return (BufferedImage) imsList.get(posn); } public ArrayList getImages(String name) { ArrayList imsList = (ArrayList) imagesMap.get(name); imagesMap.get(name); if (imsList == null) { System.out.println("Tidak ada gambar dengan nama " + name); return null; } return imsList; }
Pemrograman Game Java
12
J.E.N.I.
6.12 Memainkan Gambar Bernomor dan Gambar Strip Setelah berhasil memuat dan mengakses gambar masih perlu mengatur bagaimana gambar animasi (Bernomor dan Gambar Strip: selanjutnya disebut gambar animasi) di tampilkan ke layar, akan dibuat sebuah class lagi yang khusus menangani gambar animasi. Class ini akan mengatur urutan gambar keberapa yang dapat di akses melalui getCurrentImage(). Konstruktor class akan menerima parameter berupa nama gambar, periode animasi, panjang anima animasi si secar secara a keselu keseluruh ruhan, an, boolea boolean n pengat pengatur ur pengu pengulan langan gan dan object object ImageManager. ImagesAnimator animator = new ImagesAnimator (imagesName, animPeriod, animPeriod, seqDuration, isRepeating, imsLoader);
Proses Proses update update gambar gambar bertum bertumpu pu pada pada metho method d updat updateTi eTick cks() s() yang yang dipang dipanggil gil pada pada penge pengenda ndalili game game utama utama.. Harus Harus diperh diperhati atikan kan bahwa bahwa dalam dalam pemberian nilai parameter adalah besarnya nilai animPeriod dan seqDuration, kedua parameter ini akan sangat berpengaruh jika animasi yang dijalankan diset diset non-re non-repea peat. t. Ketika Ketika anima animasi si di set no-rep no-repeat eat,, maka maka harus harus mengh menghitu itung ng jumla jumlah h gambar gambar yang yang ada dalam dalam sebuah sebuah Array ArrayLis List. t. Nilai Nilai seqDur seqDuratio ation n harus harus cukup cukup besar besar hingga hingga hasil hasil bagi bagi (show (showPer Period iod)) denga dengan n jumlah jumlah gambar gambar masih masih dibaw dibawah ah nilai nilai animPe animPerio riod. d. Jika Jika showP showPerio eriod d kurang kurang dari dari animPe animPerio riod d maka maka anim animas asii tida tidak k pern pernah ah berh berhen enti ti pada pada saat saat semu semua a urut urutan an gamb gambar ar tela telah h ditampilkan. Untuk mengetahui kondisi selesai tidaknya sebuah urutan animasi perlu mend mendes esig ign n sebu sebuah ah inte interf rfac ace e yang berf berfun ungs gsii
laya layakny knya a
List Listen ener er sepe sepert rtii
Action ActionLis Listen tener er dll. dll. Class Class listen listener er ini memilik memilikii sebuah sebuah metho method d abstra abstract ct yang yang
Pemrograman Game Java
13
J.E.N.I. harus diimplementasikan. Class Listener menerima kejadian yang dikirimkan oleh class ImageAnimator. numbersPlayer =
new ImageAnimator ("numbers", PERIOD, 1, false,
imsLoader); numbersPlayer.addImageSequenceListener(this);
Method Method update updateTic Ticks( ks()) berfun berfungsi gsi menen menentuk tukan an posisi posisi gambar gambar dalam dalam Array ArrayLis Listt sekali sekaligu gus s mengi mengirim rim kejadi kejadian an seles selesain ainya ya sebua sebuah h urutan urutan anima animasi si kepada ImageSequenceListener ImageSequenceListener (hanya jika isReapeating tidak di set false). public void updateTick( ) { if (!ticksIgnored) { // update total waktu animasi, modulo seq duration animTotalTime = (animTotalTime + animPeriod) % (long)(1000 * seqDuration); seqDuration); // menentukan posisi gambar terkini imPosition = (int) (animTotalTime / showPeriod); showPeriod); if ((imPosition == numImages-1) && (!isRepeating)){ // menghentikan update tick pada gambar ini ticksIgnored ticksIgnored = true; if (watcher != null) watcher.sequenceEnded(imName); } }
}
Pengaksesan
gambar
terkini
di
lakukan
melalui
method
getCurrentImage() yang yang mengembalikan mengembalikan dalam gambar ArrayList ArrayList pada posisi yang ditentukan oleh imPosition. public BufferedImage getCurrentImage( ) { if (numImages != 0) return imsLoader.getImage(imName, imPosition); else return null; }
Pemrograman Game Java
14
J.E.N.I. BAB 7 SKALA, ROTASI DAN TRANSLASI
7.1 Pendahuluan Pada sebuah game skala rotasi dan translasi sangat dibutuhkan ketika membuat sebuah game yang menggunakan grafik vektor dan grafik bitmap. Pengg Penggun unaan aanny nya a seper seperti ti pemind pemindaha ahan n sebua sebuah h object object,, mempe memper-b r-besa esarr atau atau memper kecil ukuran peta ataupun merotasi arah dari object seperti pesawat, dll.
7.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Memahami fungsi-fungsi dari Skala,Rotasi dan Translasi
•
Mengimplementasikan Mengimplementasikan Skala pada sebuah Object
•
Menerapkan Rotasi dan Translasi pada Object
7.3 Translasi Translasi adalah bentuk yang paling sederhana dari transformasi, yaitu metode metode pemindah pemindahan an koordinat koordinat asal ke koordinat koordinat baru. Matriks transforma transformasi si untuk translasi dengan vektor translasi adalah :
Maka koordinat baru dari hasil translasi adalah : x’ = x + tx y’ = y + ty Sebaiknya tidak memikirkan rumus diatas karena java telah memberikan kemudahan kepada programer untuk melakukan proses translasi, yaitu dengan Pemrograman Game Java
1
J.E.N.I. menggunakan method yang telah disediakan oleh Graphics2D seperti dibawah ini: g2d.translate(nilai1, g2d.translate(nilai1, nilai2); g2d.fill(shape 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 Rotasi Rotasi adalah adalah bentuk bentuk transforma transformasi si dengan dengan dengan dengan memutar memutar sebuah sebuah 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 digunakan untuk operasi tersebut. Rotasi dengan sudut putar
dengan titik acuan (0,0) adalah:
Maka, koordinat baru hasil rotasi adalah : x’ = x cos cos – y sin y’ = x sin y + y cos
Pemrograman Game Java
2
J.E.N.I. 170 Titik 360o 18
Object
0o
90o Arah Perputaran
Gambar 7.1 Arah Perputaran Object
Pengg Penggun unaan aan sin,co sin,cos s yang yang sangat sangat memb membung ungung ungkan kan,, di java java telah telah menye menyedia diakan kan metho method d rotate rotate dari dari class class Graph Graphics ics2D 2D dengan dengan pendef pendefinis inisian ian sebagai berikut: g2d.rotate(Math. toRadians(1)); g2d.fill(shape g2d.fill( shape); );
Radian Radian dan sudut sudut adalah adalah dua cara cara untuk untuk mengh menghitu itung ng sesuat sesuatu u yang yang sama. Pada sebuah lingkaran terdapat 360 derajat dan juga 2*PI radian dalam sebuah lingkaran. Sebagai contoh: Jika diketahui : Sudut 180o = PI = 3.141592653589793 3.141592653589793 Radian Maka dapat dituliskan : Radian = (Sudut/180) * PI Untuk 90o = (90 / 180) * PI
= 1.5707963267948966 1.5707963267948966 Radian
Untuk 300o = (3 (300 / 180) * PI
= 5. 5.235987755982989 Ra Radian
Supay Supaya a param paramete eterr yang yang dilewa dilewatka tkan n melal melalui ui metho method d rotate rotate(... (...)) tepat tepat sesuai dengan sebuah lingkaran maka kita harus menggunakan nilai Radian,
Pemrograman Game Java
3
J.E.N.I. yang dapat terlihat pada contoh diatas bahwa object akan di rotasi sebanyak 1 derajat atau = 0.017453292519943295 0.017453292519943295 Radian.
Rotasi dengan sudut putar
dengan titik acuan (p,q) adalah :
Dengan demikian, koordinat baru hasil rotasinya adalah: x’ = x cos - y sin + p - p cos + q sin y’ = x sin sin y + y cos cos + q – p sin sin – q cos cos
Untuk rotasi dengan sudut acuan parameternya ada 3 yang dapat dituliskan sebagai berikut: g2d.rotate(Math. toRadians(1),nilai1,nilai2); g2d.fill(shape g2d.fill( shape); );
Parameter Parameter pertama pertama digunakan digunakan untuk untuk menentuka menentukan n sudut, sudut, sedangkan sedangkan parameter parameter yang yang kedua kedua dan ketiga ketiga digunakan digunakan untuk menentuk menentukan an titik pusat perputaran berdasarkan posisix dan posisiy sebelumnya atau (posisix+nilai1) 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 faktor skala terhadap sumbu x dan sumbu y adalah:
Maka, koordinat baru yang dihasilkan adalah: x’ = sx . x Pemrograman Game Java
4
J.E.N.I. y’ = sy . y
Jangan sekali-kali terpancing dengan rumus diatas yang sangat rumit dan dan membi embing ngun ungk gkan an itu itu hany hanya a sebag ebagai ai gamb gambar aran an nyat nyata a dari dari oper operas asii matematisnya yang sebenarnya dilakukan oleh class Graphics2D. Java telah menyediakan methodnya dimana seorang programer dipermudah tanpa harus menghitung perkalian matriksnya. g2d.scale(nilai1, g2d.scale(nilai1, nilai2); g2d.fill(shape g2d.fill( shape); );
Perlu diingat bahwa skala digunakan untuk membuat suatu object di perbesar atau diperkecil. Parameter nilai1 diatas dikalikan dengan lebar object sedangkan nilai2 dikalikan dengan tinggi object.
7.6 Menggunakan Class AffineTransform Transform Transformasi asi sudah sudah dipelajari dipelajari langsung langsung mengguna menggunakan kan method method yang dised disediak iakan an Graphi Graphics2 cs2D. D. Setiap Setiap operas operasii transf transform ormas asii hanya hanya bisa bisa dilaku dilakukan kan sekali sekali untuk sebuah shape. shape. Sayangnya Sayangnya shape shape tidak digunakan digunakan dalam game sebe sebena narn rnya ya.. Untu Untuk k kepe keperl rlua uan n ters terseb ebut ut maka maka akan akan meng menggu guna naka kan n clas class s AffineTrans AffineTransform. form. Class AffineTran AffineTransform sform menyediaka menyediakan n operasi operasi transforma transformasi si matrix seperti yang telah dibahas sebelumnya. Selain itu bisa menggabungkan beber beberapa apa transf transform ormas asii matrix matrix sekali sekaligus gus sebel sebelum um di terapk terapkan an pada pada sebuah sebuah gambar. AffineTransform Menyediakan beberapa transformasi instant seperti rotasi, translasi serta scalasi. Untu Untuk k
kepe keperl rlua uan n
tran transf sfor orma mas si
maka maka akan akan dibu dibuat at sebu sebuah ah clas class s
sederhana sederhana (class ImageEfek). ImageEfek). Class ini menyediak menyediakan an 3 buah method yaitu getR getRot otat ated edIm Imag age( e())
untu untuk k
Pemrograman Game Java
tran transf sfor orma masi si
rota rotasi si,,
getS getSca cale ledI dIma mage ge() ()
untu untuk k 5
J.E.N.I. transform transformasi asi scala scala dan getTransla getTranslatedIm tedImage() age() untuk transform transformasi asi transalasi. transalasi. Masing Masing masing masing method method sebenarny sebenarnya a memiliki memiliki cara kerja yang sama kecuali pemberian AffineTransform sesuai dengan method yang bersangkutan. Method getRo getRotat tatedI edImag mage() e() (dan (dan kedua kedua method method lainy lainya) a) dibaw dibawah ah ini bekerj bekerja a dengan dengan memb membuat uat image image penam penampun pung g yang yang akan akan di gunaka gunakan n sebaga sebagaii tempat tempat hasil hasil transformasi. public BufferedImage getRotatedImage(BufferedImage src, int angle) { if (src == null) { System.out.println("Image kosong"); return null; }
int transparency = src.getColorModel( ).getTransparency( ); BufferedImage BufferedImage dest = gc.createCompatibleImage( gc.createComp atibleImage( src.getWidth( src.getWidth ( ),
src.getHeight( src.getHeigh t( ),
transparency ); Graphics2D g2d = dest.createGraphics( ); AffineTransform AffineTransform origAT = g2d.getTransform( ); AffineTransform AffineTransform rot = new AffineTransform( AffineTransform( ); rot.rotate( Math.toRadians(angle), src.getWidth( )/2, src.getHeight( )/2); g2d.transform(rot); g2d.drawImage(src, g2d.drawImage(src, 0, 0, null); g2d.setTransform(origAT); g2d.dispose( );
return dest;
}
Seca ecara tek teknis anda hany hanya a
perlu rlu
mener enera apkan pkan satu atu
ata atau
lebi lebih h
transf transform ormasi asi kedala kedalam m sebuah sebuah Affine AffineTra Transf nsform orm sebelu sebelum m diguna digunakan kan dalam dalam transformasi gambar. Namun satu hal yang perlu diberi perhatian lebih adalah ketika menggunakan rotasi. Perhatikan ilustrasi berikut :
Pemrograman Game Java
6
J.E.N.I.
Gambar 7.2 Transformasi Object
Ketika Ketika menggun menggunakan akan transform transformasi asi yang langsung langsung digambarka digambarkan n oleh graphics ke layar tanpa disimpan dalam object image, maka jangan khawatir akan akan terjad terjadiny inya a clippi clipping ng gamba gambar. r. Namun Namun masala masalahny hnya a tujuan tujuan sebena sebenarny rnya a adalah membuat sebuah class yang menyediakan fungsi transormasi secara langsung. Artinya perlu menggunakan sebuah image lagi untuk menampung hasi hasill dari dari tran transf sfor orma masi si.. Ketik Ketika a memb membua uatt obje object ct imag image e pali paling ng tidak tidak perl perlu u menentukan panjang dan lebar image tersebut. Penentuan perluasan image penampung ini yang sedikit bermasalah, hal itu karena kita tidak tahu bentuk citra yang terdapat pada object image yang di transformasi. Seperti ilustrasi diatas, diatas, bagian bagian a menunjuk menunjukan an proses proses transforma transformasi si sempurna sempurna karena karena luasan luasan image penampung sesuai dengan image yang di transformasi. Hal tersebut berk berkeb ebal alik ikan an deng dengan an bagi bagian an b, luas luasan an imag image e pena penamp mpun ung g tidak tidak sesu sesuai ai sehingga terjadi clipping. Untu Untuk k meng mengan anti tisi sipa pasi si hal hal ters terseb ebut ut anda anda perl perlu u mema memast stik ikan an besa besar r transparant area dari sebuah gambar yang akan ditransformasi sesuai dengan kebut kebutuha uhan. n. Atau Atau anda anda juga juga bisa bisa meruba merubah h secara secara langsu langsung ng luasan luasan image image
Pemrograman Game Java
7
J.E.N.I. penampung dengan nilai maximum antara panjang dan lebar image yang akan di transformasi. Method Method getRot getRotate atedIm dImage age() () diatas diatas merota merotasi si image image pada pada titik titik tengah tengah gamb gambar ar atau atau dapa dapatt mena menamb mbah ahka kan n bebe bebera rapa pa meth method od lagi lagi sepe sepert rtii rota rotasi si terhadap sumbu tertentu dan penggabungan beberapa transformasi sekaligus.
Pemrograman Game Java
8
J.E.N.I. BAB 8 SPRITE & COLLISION DETECTION
8.1 Pendahuluan Sebuah game pasti tidak lepas dari karakter dan animasi. Bisa saja kara karakt kter erny nya a beru berupa pa seek seekor or buru burung ng gelat gelatik ik yang terb terban ang g kesa kesana na kema kemari ri memburu mangsanya. Bagaimana karakter burung gelatik berpindah tempat atau menangkap mangsanya? modul ini akan membahas pemrograman dasar pembentukan karakter serta bagaimana karakter tersebut berinteraksi terhadap karakter lainya.
8.2 Tujuan Setelah mempelajari modul ini peserta diharapkan dapat: •
Mendefinisikan dan Mengembangkan Sprite
•
Mengenali jenis-jenis pengujian tabrakan
•
Mengimlpementasikan Mengimlpementasikan pengujian tabrakan
8.3 Sprite Sprite adalah hasil enkapsulasi object dalam sebuah game. Sebagai contoh ketika menggunakan object shape atau gambar seperti pesawat, maka perlu dilakukan dilakukan proses proses transforma transformasi si seperti seperti translasi translasi dan rotasi,(tran rotasi,(tranforma formasi si pada pada java bekerja bekerja denga dengan n cara cara mendu mendupli plikas kasii objec objectt asli). asli). Ketika Ketika
proses 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 mengetahui lokasi object terkini. Pemrograman Game Java
1
J.E.N.I. Dengan Dengan metod metode e enkaps enkapsula ulasi, si, maka maka setiap setiap object object sprite sprite memp mempuny unyai ai 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 actor-actor dalam game sehingga masing-masing actor dapat memiliki behavior tersendiri. Seben Sebenarn arnya ya mende mendefin finisi isikan kan sebuah sebuah sprite sprite untuk untuk semua semua tipe tipe game game sanga sangatt sulit sulit karen karena a setiap setiap jenis jenis game game mempun mempunya yaii karakt karakteris eristik tik tersen tersendir diri. i. Sebuah game arcade seperti GalaktikWar membutuhkan object yang dapat bergerak 360°, sedangkan game isometric hanya mendefinisikan 4, 8 atau 16 arah gerak dan game side scrolling seperti MarioBros hanya butuh 3 arah gerak. Selain itu juga pengujian benturan yang membutuhkan akurasi berbeda untuk masing-masing game.
8.4 Mengimplementasikan Class Sprite Sepe Sepert rtii yang ang tela telah h di sing singgu gung ng,, clas class s Spri Sprite te yang ang dibu dibuat at akan akan mendefinisikan atribut-atribut dasar sebuah object dalam game. Class ini tidak akan membuat sebuah class Sprite yang sudah lengkap dengan efek suara, pengkondisian object dll. Sebaliknya hanya membuat class sprite sederhana yang nantinya dapat diturunkan oleh class lainya yang lebih spesifik. 8.5 Konstruktor Sprite Class sprite diinisialisasi dengan posisi x dan y , object ImageManager serta nama gambar. protected ImageManager imsMgr;
// Image pool
protected int locx, locy;
// Lokasi Sprite
Pemrograman Game Java
2
J.E.N.I. protected int dx, dy;
// Langkah sprite (dalam pixel)
public Sprite(int x, int y, ImageManager imsMgr, String name) { locx = x; locy = y; dx=dy=0; this.imsMgr = imsMgr; setImage(name); setImage(nam e);
// set default gambar
}
Variabel dx dan dy berfungsi menentukan nilai langkah sprite. Setiap perpindahan tidak dilakukan dengan mengubah langsung ke variabel x dan y namun dengan menentukan nilai lebar langkah dan selanjutnya penambahan dilakukan setiap kali updateSprite() dipanggil.
8.6 Gambar Sprite Sebel Sebelum umny nya a
telah telah dibuat dibuat sebuah sebuah ImageM ImageMana anager ger yang menan menangan ganii
pemuatan gambar, jadi dalam class Sprite ini tinggal menggunakanya. menggunakanya. private String imageName;
// nama gambar
private BufferedImage BufferedIma ge image;
// Penampung gambar
private int width, height;
// Dimensi gambar
private ImagesAnimator ImagesAnima tor animator;
// untuk memainkan strip dan
numbered private boolean isLooping;
// toogle image berulang
public void setImage(String name) { imageName = name; image = imsMgr.getImage(imageNa imsMgr.getImage(imageName); me); if (image == null) { System.out.println("Tidak ada gambar dengan nama " + imageName); }
Pemrograman Game Java
3
J.E.N.I. else { width = image.getWidth(); image.getWidth(); height = image.getHeight(); } // gambar diasumsikan gambar tunggal animator = null; isLooping = false; }
Selai lain memun emungk gkin inka kan n
menyediakan
akses
mengg enggun unak akan an
ke
gam gambar bar
gambar
tunggal,
berber-no nomo morr
atau atau
sprite
juga
gam gambar bar
stri strip. p.
Pengg Penggun unaan aan gambar gambar strip strip dapat dapat dilaku dilakuka kan n dengan dengan mema memanfa nfaatk atkan an class class ImageAnimator melalui method loopImage(). public void loopImage(int animPeriod, double seqDuration,boolean isRepeating) { if (imsManager.numImages(imageName) > 1) { animator = null;
// untuk garbage collection
animator = new ImageAnimator(imageName, animPeriod, seqDuration,isRepeating, imsManager); isLooping = true; } else System.out.println(imageName .println(imageName + " bukan gambar berurutan"); }
8.7 Bounding Box Meskipun pengujian trabrakan akan lebih di utamakan untuk di turunkan, kelas sprite akan menyediakan sebuah Rectangle dengan besar sesuai dengan besar gambar untuk pengujian tabrakan. public Rectangle getBoundingBox() { return new Rectangle(locx, locy, width, height); }
Pemrograman Game Java
4
J.E.N.I. 8.8 Update Sprite Sprite memiliki atribut dx dan dy yang merupakan besar velocity sprite 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 juga akan mengirimkan pesan ke object ImageAnimator jika sprite tersebut memiliki lebih dari satu gambar. public void updateSprite() { if (isActive()) { locx += dx; locy += dy; if (isLooping) // update posisi gambar pada animator animator.updateTick(); } }
Kecepatan gerak sprite akan sangat dipengaruhi banaknya pemanggilan 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 berbeda akan diperoleh jika kecepatan update berubah.
8.9 Menggambar Sprite Method ini memiliki input berupa object Graphics untuk menampilkan gambar. Jika sprite memiliki memiliki lebih dari satu gambar, gambar, method ini ini akan meminta meminta gambar terkini pada object ImageAnimator. public void drawSprite(Graphics g) { if (isActive()) { if (isLooping) image = animator.getCurrentImage(); g.drawImage(image, g.drawImage(image, locx, locy, null);
Pemrograman Game Java
5
J.E.N.I. } }
8.10 Collision Detection Pada Pada bahasa bahasan n sprite sprite terdap terdapat at method method getBou getBound nd(), (), metho method d terseb tersebut ut meny menyedi ediaka akan n rectan rectangle gle yang yang akan akan diguna digunaka kan n dalam dalam proses proses pendet pendeteks eksian ian tabrak tabrakan an antar antar sprite sprite.. Perhat Perhatika ikan n visual visualisa isasi si bebera beberapa pa cara cara pende pendetek teksia sian n berikut ini:
Gambar 8.1 Mendeteksi Tabrakan
Gambar pertama menunjukan visualisasi yang digunakan dalam class sprite. Cara ini adalah cara paling mudah dan tercepat, namun seperti yang terlihat diatas cara ini kurang bagus secara akurasi. Program akan mendeteksi terjadinya tabrakan ketika bound kedua sprite bersinggungan meskipun secara kasat kasat mata mata sprite sprite terseb tersebut ut sama sama sekali sekali tidak tidak bersin bersinggu ggung ngan. an. Cara Cara ini ideal ideal untuk game yang tidak terlalu memperhatikan akurasi deteksi tabrakan atau game yang menggunakan sprite mendekati kotak. Cara Cara kedu kedua a adal adalah ah meng menggu guna naka kan n apa apa yang yang dise disebu butt redu reduze zed d size size bounding box ( kotak batas yang diperkecil). Cara ini cukup mudah, hanya perlu mengurangi mengurangi beberapa pixel dari ukuran sebenarny sebenarnya a dari image sprite sprite sehingga pendeteksian masuk lebih dalam seperti terlihat pada gambar cara diatas lebih akurat dari pada cara pertama. Pemrograman Game Java
6
J.E.N.I. Cara ketiga bisa dikatakan cara paling akurat dari ketiga cara diatas. Idenya adalah menyediakan beberapa bounding box sekaligus untuk keperluan pendeteksian tabrakan. Karena menggunakan banyak bounding box, maka di munkinka munkinkan n penyesuaia penyesuaian n bounding bounding box dengan dengan bentuk bentuk gambar gambar pada sprite. Dengan Dengan cara ini
bisa mengguna menggunakan kan sebanyak sebanyak mungkin mungkin bounding bounding box agar
lebih akurat dengan catatan semakin banyak bounding box maka akan semakin banyak waktu yang diperlukan untuk mendeteksi tabrakan antar sprite.
Pemrograman Game Java
7
J.E.N.I. BAB 9 PEMROGRAMAN PEMROGRAMAN SOCKET
9.1 Pendahuluan Seiring dengan pesatnya perkembangan networking di dunia ternyata juga juga sangat sangat membe memberi ri dampak dampak positif positif yang yang besar besar terhad terhadap ap indust industri-i ri-ind ndust ustri ri pembuat game seperti yang kita rasakan saat ini dimana banyak game online yang bermunculan di internet diantarannya seperti xian, ragnarok, warcraf dan masih masih banya banyak k lagi. lagi. Bagi Bagi para para pembua pembuat, t, pengem pengemban bang g game game ataupu ataupun n yang yang tertarik tertarik untuk membuat membuat
game, game, tentunya tentunya sangat mengingin menginginkan kan game game 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 dengan menyertakan pemrograman socket agar permasalahan-permasalahan tersebut dapat teratasi.
9.2 Tujuan: Setelah mempelajari modul ini peserta diharapkan dapat: •
Memahami konsep jaringan menggunakan socket.
•
Membuat program client-server sederhana.
•
Memahami dan mampu mengolah data disisi client maupun server
9.3 Socket Sock Socket et adal adalah ah salah salah satu satu cara cara untu untuk k komu komuni nika kasi si anta antarr komp komput uter er,, umum umumny nya a lew lewat netw networ ork k atau atau inte intern rnet et.. Sock Socket et bias biasa a digu diguna naka kan n untu untuk k
Pemrograman Game Java
1
J.E.N.I. pemrograman berbasis client-server yang dapat menggunakan socket TCP/IP atau socket UDP
9.3.1 Socket Client Sock Socket et adal adalah ah sebu sebuah ah peng penghu hubu bung ng anta antara ra dua dua host host,, yang ang dapa dapatt dibangun dengan tujuh dasar operasi yaitu:
Menghubungkan untuk mengendalikan mesin atau perangkat
Mengirim data
Menerima data
Menutup koneksi
Bergantung pada port
Mendengarkan data yang masuk
menerima koneksi dari mesin yang dikendalikan berdasarkan sebuah port
Clas Class s Sock Socket et pada pada Java Java,d ,dig igun unak akan an oleh oleh clie client nt dan dan serv server er yang ang mempuny mempunyai ai method method yang yang menangan menanganii keempat keempat operasi operasi diatas.Tig diatas.Tiga a operasi operasi berikutnya hanya dibutuhkan untuk server yang menunggu client untuk koneksi ke server cukup dengan mengimplementasikan class ServerSocket. Data yang dikirimkan melalui internet di dalam sebuah paket disebut datagra. Setiap datagram berisi header dan payload. header berisi alamat dan port port untu untuk k seti setiap ap pake paket, t, addr addres es dan dan port port untu untuk k tiap tiap pake pakett yang yang masu masuk, k, sedangka sedangkan n payload payload berisi berisi data, sejak datagram datagram mempuny mempunyai ai batasan batasan jarak, jarak, memu memungk ngkink inkan an sebua sebuah h paket paket hilang hilang atau atau corupt corupted ed ketika ketika dikirim dikirimkan kan dan memb membutu utuhka hkan n pegirim pegiriman an lagi, lagi, untung untungny nya a socket socket member memberika ikan n kesem kesempat patan an kepad kepada a progra programe merr untuk untuk melak melakuka ukan n konek koneksi si ke jaring jaringan, an, sebag sebagai ai contoh contoh
Pemrograman Game Java
2
J.E.N.I. stream di dalam byte dapat dituliskan dan dapat dibaca. Socket melindungi progra programe merr dari dari low-lev low-level el yang yang detail detail dari dari sebuah sebuah jaring jaringan, an, sepert sepertii detek deteksi si kesalahan (error detection), ukuran paket, pengiriman kembali sebuah paket, alamat jaringan dan masih banyak lagi. Java.net.Socket adalah JFC yang digunakan untuk melakukan operasi TCP client-side. Untuk mendefinisikan host dapat menggunakan InetAddress atau String sedangkan untuk definisi port menggunakan int mulai dari 0 sampai 65.535. Definisi constructornya dapat dilihat sperti dibawah ini: try {
Socket koneksi = new Socket(“192.168.12.138” Socket(“ 192.168.12.138”, , 80); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Jika host tidak ditemukan atau tidak berfungsi maka konstructor akan melemparkan UnknownHostException tetapi jika socket tidak dapat dibuka maka aka akan akan dile dilem mpark parkan an ke
IOException
ada bebe bebera rap pa hal yang ang
menyebabkan permintaan koneksi gagal misalnya host tujuan mungkin tidak mene menerim rima a kone koneks ksi, i, kone koneks ksii dial dial-u -up p terp terput utus us atau atau perm permas asal alah ahan an rout routin ing g menol menolak ak host host tujuan tujuan(re (rejec jected ted).Se ).Selai lain n metod metode e diatas diatas defini definisi si socket socket dapat dapat dilakukan dengan menggunakan class InetAddress.
9.3.2 Socket Server Socket Server digunakan untuk menangani seluruh request dari jaringan yang yang disebu disebutt dengan dengan socket socket client client.. Beriku Berikutt ini adalah adalah cara cara pendef pendefini inisia sian n konstruktor dari class ServerSocket yang akan digunakan untuk menangani koneksi dari Client. Pemrograman Game Java
3
J.E.N.I. try {
ServerSocket s= new ServerSocket(90); s.accept(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Konstrukto Konstruktorr dari ServerSock ServerSocket et diatas akan membuka membuka atau menerima menerima konek koneksi si melal melalui ui port port 90, kemudi kemudian an metho method d accept accept() () yang yang dipan dipanggi ggill untuk untuk menun menunggu ggu koneks koneksii dari dari client client.. Konstr Konstrukt uktor or akan akan melem melempar parkan kan excep exceptio tion n apabi apabila la port port yang yang didefi didefinis nisika ikan n diatas diatas telah telah dibua dibuaat at sebelu sebelumn mnya ya.. Potong Potongan an kode berikut digunakan untuk memeriksa port yang telah digunakan(terbuka).
for(int i=0;i<1024;i++){ try { ServerSocket s= new ServerSocket(i); }catch (IOException e) { System. System .out.println("Port .println( "Port ini telah digunakan : " +i); } }
Selai Selain n metod metode e diatas diatas class class Server ServerSoc Socket ket juga juga meny menyedi ediaka akan n piliha pilihan n untuk untuk memba membatas tasii jumlah jumlah koneks koneksii dari dari client client mengg menggun unaka akan n dua parame parameter ter 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 (IOException e) { }
Kebanyakan server yang dipakai sekarang menggunakan lebih dari satu IP Address untuk itu class ServerSocket juga menyediakan konstruktor yang digunakan untuk memilih IP mana yang akan digunakan, cotohnya sebagai berikut:
Pemrograman Game Java
4
J.E.N.I. try {
ServerSocket s= new ServerSocket(100,10, InetAddress. getByName("192.168.12.138" )); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Konst Konstruk ruktor tor diatas diatas melew melewatk atkan an tiga tiga parame parameter ter yang yang pertam pertama a adalah adalah nomor port kemudian parameter, kedua adalah banyaknya koneksi yang akan diterima dan yang terakhir yaitu ip addres yang akan menerima permintaan kone koneks ksii
dari dari clie client nt dima dimana na para parame mete terr
keti ketiga ga ini ini
meng menggu guna naka kan n
class lass
InetAddress untuk melewatkan IP Address yang akan digunakan.
3.4 Membuat Server Sederhana Setelah memahami tentang konstruktor dari ServerSocket yang terdapat pada pada bab bab II, II, seka sekara rang ng kita kita akan akan memb membua uatt serv server er sede sederh rhan ana a yang ang akan akan digu diguna naka kan n untu untuk k mena menang ngan anii kone koneks ksii dari dari clie client nt.. Beri Beriku kutt ini ini adal adalah ah kode kode program dari class Server. import java.net.*; import java.io.*; import java.util.*; public class Server implements Runnable { private ServerSocket server; public Server(int port) { try { server = new ServerSocket(port); } catch(IOException catch(IOException e) { System.out.println("Por System.out.println("Port t : "+port+ " telah digunakan"); System.exit(1); } System.out.println("-> Server berhasil dibuat dengan port "+port); }
Pemrograman Game Java
5
J.E.N.I. public void run() { while(true) { try { System.out.println("Menunggu konesi dari client..."); new ProsesClient(server.acc ProsesClient(server.accept()); ept()); } catch(IOException catch(IOException e){} } } public static void main(String args[]) { Server server = new Server(5000); Server(5000); new Thread(server).start(); Thread(server).start(); } }
Konstruktor dari class Server diatas melewatkan parameter berupa nilai integer yang akan dugunakan sebagai nomor port dari server. Jika port yang kita masukan telah digunakan maka program akan melemparkan exception. Kemud emudiian progr rogram am kita kita akan akan menun nunggu ggu
konek oneksi si dari dari clie clien nt
denga engan n
meng menggu guna naka kan n bant bantua uan n dari dari thre thread ad yang yang akan akan kita kita baha bahas s nant nanti. i. Meth Method od server server.ac .accep cept() t() dari dari object object Server ServerSoc Socket ket yang yang kita kita buat buat akan akan menun menunggu ggu 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 keing keingina inan. n. Untuk Untuk itu kita kita harus harus membua membuatt interf interface ace Protoc Protocol ol yang yang akan akan kita kita imple impleme menta ntasik sikan an pada pada class class yang yang mmbut mmbutuhk uhkan an peratu peraturan ran-pe -perat ratura uran n yang yang diinia diinialis lisasi asikan kan pada pada interf interface ace Protoc Protocol ol terseb tersebut. ut. Beriku Berikutt ini adalah adalah listin listing g programnya. public interface Protocol { public static final int public static final int public static final int public static final int }
Pemrograman Game Java
CHAT_USER_BARU = 0; CHAT_HAPUS_USER = 1; CHAT_PESAN_USER = 2; SET_USER = 3;
6
J.E.N.I.
Interface Protocol diatas menetapkan beberapa peraturan yang bertype intege integerr dan nilain nilainya ya tidak tidak dapat dapat diubah diubah ataup ataupun un diove dioverrid rride. e. Ada bebera beberapa pa 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 diki dikirim rimka kan n beru berupa pa nama nama user user(“ (“ni nick ck ???? ???? tela telah h berg bergab abun ung g di room room ini”) ini”),, CHAT_HAPUS_USER digunakan sebagai validasi untuk memberitahu kepada seluruh client yang terkoneksi bahwa user telah putus koneksinya dari server (“ nick ???? keluar dari room”), CHAT_PESAN_USER digunakan sebagai validasi dima dimana na data datany nya a juga juga diki dikiri rimk mkan an kese keselu luru ruh h clie client nt yang ang akti aktiff dan dan akan akan ditampilkan berupa pesan, SET_USER diginakan untuk memberikan nama dari client disisi server (setiap object yang dibuat oleh class server melalui class ProsesClient). Semu Semua a penj penjel elas asan an tent tentan ang g pera peratu tura rann-pe pera ratu tura ran n yang yang dibu dibuat at pada pada inteface Protocol akan diterapkan pada class ProsesClient yang potongan kode programnya adalah sebagai berikut. import java.io.*; import java.net.*; import java.util.*; public class ProsesClient implements Protocol{ Socket client client; ; boolean koneksi koneksi; ; terimadata; ; private TerimaData terimadata private KirimData kirimdata kirimdata; ; public static ArrayList clientList = new ArrayList(); String nama nama; ;
Clas Class s Pros Proses esCli Clien entt diat diatas as meng mengim impl plem emen enta tasi si Prot Protoc ocol ol yang akan akan digunakan sebagai rule dari data yang akan diproses, kemudian ada beberapa variable variable yaitu antara lain
Pemrograman Game Java
client yang
digunakan sebagai referensi dari socket
7
J.E.N.I. yang yang diterim diterima a oleh oleh serve serverr melal melalui ui socket socket.ac .accep cept() t() yeng yeng dilew dilewatk atkan an melalu melaluii konstruktor ProcesClient,
koneksi
bertype boolean dimana akan di set true
apabi apabila la client client berhas berhasilil terkon terkoneks eksi, i,
terimadata
adal adalah ah inne innerr clas class s yang ang
diguna digunakan kan untuk untuk mengh menghand andle le data data yang yang masuk masuk dari dari server server,, berupa inner class yang digunakan untuk mengirim data,
kirimdata
juga
clientList digunakan
untuk menambpung setiap client yang terkoneksi ke server,
nama
digunakan
sebagai nama dari setiap client yang terkoneksi. ProsesClient(Socket ProsesClient(Socket client){ try{ this.client = client; DataInputStream DataInputStream in = new DataInputStream (client.getInputStream()); DataOutputStream out = new DataOutputStream (client.getOutputStream()); terimadata = new TerimaData(in); kirimdata = new KirimData(out); koneksi = true; synchronized (clientList ) { clientList.add(this ); }
}catch (IOException (IOException e){ System.out.println("Tidak .println("Tidak dapat terkoneksi: " +e); } }
Program diatas merupakan konstruktor untama dari class ProsesClient yang melewatkan data berupa object Socket. Didalam konstruktor tersebut juga ada ada Data DataIn Inpu putS tStr trea eam m yang yang akan akan digu diguna naka kan n untu untuk k mene meneri rima ma data data dan dan DataOuputStream untuk mengirimkan data dimana kedua-duanya di lewatkan melalui konstruktor dari inner class TerimaData(in) dan KirimData(out). Apabila terjadi kesalahan maka akan melemparkan exception. Selanjutnya adalah inner class TerimaData yang potongan kodenya seperti dibawah ini. public class TerimaData implements Runnable {
Pemrograman Game Java
8
J.E.N.I. Thread loop loop; ; private DataInputStream in in; ; public TerimaData(DataInputStream in) { this.in = in; loop = new Thread(this ); loop.start(); loop .start(); } public void run() public void { Thread thisThread = Thread. currentThread (); (); while(loop loop==thisThread) ==thisThread) { try { String data = in in.readUTF(); .readUTF(); prosesData(data); } catch(IOException e) { disconnect(); } }
} public void destroy() public void { loop = null ; }
}
Inner class TerimaData diatas melewatkan object DataInputStream dari konstruktornya dan juga dithread untuk membaca data yang dikirimkan oleh client dengan in.readUTF() yang kemudian diolah melalui method prosesData(). Jika terjadi kesalahan kesalahan maka akan memanggil memanggil method method disconnec disconnect(). t(). Method Method prosesData() dibawah ini mempunyai satu parameter bertype String dimana parameter ini adalah data yang ditangkap dari client yang kemudian diproses dengan bantuan dari StringTokenizer yang digunakan untuk memecah data dengan dengan pemisah pemisah “ | “
kemudian kemudian datanya datanya yang yang pertama dikonver dikonversi si menjadi menjadi
Integer dan kemudian diolah berdasarkan peraturan-peraturan yang kita buat pada interface Protocol diatas. public void prosesData(String data){ public void StringTokenizer StringTokenizer st = new StringTokenizer(data, "|" "|"); ); int kode = Integer. parseInt(st.nextToken());
Pemrograman Game Java
9
J.E.N.I. switch(kode) { case SET_USER :{ nama=st.nextToken(); 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; } }
}
Seperti
yang
terlihat
pada
program ram
diatas
terdapat
method
broadc broadcast astToC ToClint lint() () yang yang brfun brfungsi gsi untuk untuk mengir mengirimk imkan an data data keselu keseluruh ruh client client kecuali client yang mengirim data sedangkan broadcast() mengirimkan data keseluruh client termasuk client yang mengirimkan data. public static void static void broadcast(String data) { synchronized (clientList ) { ProsesClient user; for(int i=0; i< clientList .size(); i++) { user = (ProsesClient) clientList.get(i); user.kirimData(data); } } } broadcastToClient(String g data) public void public void broadcastToClient(Strin { (clientList ) synchronized { ProsesClient user; for(int i=0; i< clientList .size(); i++) { user = (ProsesClient) clientList.get(i); if(user!=this ) user.kirimData(data); }
} }
Pemrograman Game Java
10
J.E.N.I. Sekara Sekarang ng kita kita akan akan memba membahas has tentan tentang g pengiri pengirima man n data data dari dari server server dengan inner class KirimData seperti dibawah ini. public class KirimData implements Runnable { Thread loop loop; ; LinkedList tampungData tampungData; ; DataOutputStream out out; ; public KirimData(DataOutputStream out) { this.out = out; tampungData = new LinkedList(); loop = new Thread(this ); loop.start(); loop .start(); } public void public void tambahData(String data) { synchronized (tampungData ) { tampungData.add(data); tampungData .add(data); tampungData.notify(); tampungData .notify(); } } public void run() public void { String data;
Thread thisThread = Thread. currentThread (); (); while(loop loop==thisThread) ==thisThread) { synchronized (tampungData ) { if(tampungData .isEmpty() && loop loop!= !=null) { try { tampungData.wait(); tampungData .wait(); } (InterruptedException e) { } catch(InterruptedException } } while(tampungData tampungData.size()>0) .size()>0) { synchronized (tampungData tampungData) ) { data = (String)tampungData (String) tampungData.removeFirst(); .removeFirst(); } try {
out.writeUTF(data); out .writeUTF(data); } catch(IOException e) { disconnect(); } } } }
Pemrograman Game Java
11
J.E.N.I. public void destroy() public void { loop = null ; (tampungData ) synchronized { tampungData.notify(); tampungData .notify(); } }
}
Inner class KirmData diatas menggunakan thread agar pengiriman data dapat dilakukan setiap saat dimana data yang dikirimkan tidak langsung dikirim denga dengan n DataOu DataOutpu tputSt tStrea ream m tetapi tetapi masih masih di tambah tambahkan kan kedal kedalam am Linked LinkedLis Listt sebagai antrian kemudian dikirimkan dengan out.WriteUTF() dimana apabila data di object tampungData kosong maka program akan menunggu dengan menggunakan method tampungData.wait(), dimana method ini akan diinterupsi apabila terjadi penambahan data melalui method tambahData() karena disana method tampungData.notify() dipanggil. Walaupun pada inner class KirimData menyediakan menyediakan method tambahData() yang melewatkan parameter berupa String tetapi dalam kenyataanya kita tidak langsung mengakses kesana tetapi masih membuat method lagi yaitu public void kirimData(String data) public void { kirimdata.tambahData(data); kirimdata .tambahData(data); }
Kita membuat satu method lagi yaitu disconnect() yang akan digunakan untuk mengirimkan keseluruh client yang aktif yang memberitahukan bahwa koneksi dari client telah terputus. Berikut potongan kode programnya. public synchronized void disconnect(){ if(koneksi koneksi){ ){ synchronized (clientList){ clientList.remove( this ); }
broadcast(CHAT_HAPUS_USER+"|" "|"+ +nama nama); ); koneksi = false; kirimdata.destroy(); kirimdata .destroy();
Pemrograman Game Java
12
J.E.N.I. terimadata.destroy(); terimadata.destroy(); try{ client client.close(); .close(); catch(Exception e) {} client = null ;
}
} System.out.println("Client .println("Client Disconnected" ); }
3.5 Membuat Client Sederhana 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 interface yaitu
class NetworkData, Client dan interface NetworkDataListener.
Program yang akan dibangun dititikberatkan pada pengiriman, penerimaan dan pemrosesan data yang di ilustrasikan dalam aplikasi berupa chatting. Program Program yang akan kita buat juga akan mengimplem mengimplementas entasii interface interface Protocol yang telah dibuat pada pembahasan server diatas. Sekarang mari kita mulai dengan membuat interface NetworkDataListener sebagai berikut. public interface NetworkDataListener { public void public void menerimaData(String data); public void public void networkDisconnected(Str networkDisconnected(String ing data); }
Intrface NetworkDataListener akan diimplementasikan pada class utama yaitu yaitu Client Client diman dimana a fungsi fungsiny nya a untuk untuk meneri menerima ma data data yang yang dikirim dikirimkan kan oleh oleh server. NetworkDataListener akan kita gunakan sebagai parameter dari class NetworkData seperti berikut ini. import java.io.*; import java.net.*; import java.util.*; public class NetworkData implements Protocol{ NetworkDataListener NDL NDL; ; Socket client client; ; boolean koneksi koneksi; ; private TerimaData terimadata terimadata; ; private KirimData kirimdata kirimdata; ; NetworkData(String NetworkData(String host, int port,NetworkDataListener NDL){
Pemrograman Game Java
13
J.E.N.I. try { this.NDL NDL=NDL; =NDL; client= client =new Socket(host,port); DataInputStream DataInputStream in = new DataInputStream( client client.getInputStream()); .getInputStream()); DataOutputStream out = new DataOutputStream( client client.getOutputStream()); .getOutputStream()); terimadata = new TerimaData(in); kirimdata = new KirimData(out); koneksi = true; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
Class NetworkData akan mengimplementasi interface Protocol sebagai atura turan n
yang
konstruk ruktornya nya
dibe diberl rlak akuk ukan an melewatkan
untuk ntuk tig tiga
meto etode
pengir ngirim ima an
parameter
yaitu itu
data, ata,
host,
adap dapun
port
dan
NetworkDataListener, didalam class ini terdapat dua inner class yang isinya tidak jauh berbeda dengan inner class yeng berada di sisi server pada bahasan di atas. Apabila koneksi gagal dilakukan maka akan melemparkan exception. Berikut ini adalah program inner class TerimaData. public class TerimaData implements Runnable{ Thread loop loop; ; private DataInputStream in in; ; public TerimaData(DataInputStream in) { this .in = in; loop = new Thread(this); loop.start(); loop .start(); } public void run() public void { Thread thisThread = Thread. currentThread (); (); while(loop loop==thisThread) ==thisThread) { try { String data = in in.readUTF(); .readUTF(); NDL.menerimaData(data); NDL .menerimaData(data); } catch(IOException e) { disconnect(); } } }
Pemrograman Game Java
14
J.E.N.I. public void destroy() public void { loop = null ; }
}
Seperti
yang
Netw Networ orkD kDat ataL aLis iste tene nerr
terlihat
objec ject
digu diguna nak kan
bernama
keti ketika ka
NDL
data data
yang
dite diteri rima ma
dibuat
dari
mengg enggun unak akan an
in.readUTF() dan kemudian memanggil dan melewatkan data yang dibaca tadi pada method yang ada didalam interface tersebut yaitu NDL.menerimaData(...). Perlu diketahui bahwa semua program yang mengimplementasikan interface NetworkDataListen tener
akan
secara
otomatis
memanggil
method
menerima menerimaData( Data(...) ...) maka disinilah disinilah kesempata kesempatan n kita untuk mempros memproses es data. Untuk inner class KirimData tidak ada perbedaan dengan KirimData yang ada di server. Berikut adalah listing programnnya. public class KirimData implements Runnable{ Thread loop loop; ; LinkedList tampungData tampungData; ; DataOutputStream out out; ; public KirimData(DataOutputStream out){ this .out = out; tampungData = new LinkedList(); loop = new Thread(this); loop.start(); loop .start(); } public void public void tambahData(String data){ synchronized (tampungData tampungData) ) { tampungData.add(data); tampungData .add(data); tampungData.notify(); tampungData .notify(); } } public void public void run() { String data; Thread thisThread = Thread. currentThread (); (); while(loop loop==thisThread) ==thisThread) { synchronized (tampungData tampungData) ) { if(tampungData .isEmpty() && loop loop!= !=null) { try{ tampungData.wait(); tampungData .wait(); }catch(InterruptedException e) { } }
Pemrograman Game Java
15
J.E.N.I. } while(tampungData tampungData.size()>0) .size()>0) { synchronized (tampungData tampungData) ) { data = (String)tampungData (String) tampungData.removeFirst(); .removeFirst(); } try{ out.writeUTF(data); out .writeUTF(data); } catch(IOException e){ disconnect(); } } } } public void public void destroy() { loop = null ; synchronized (tampungData tampungData) ) { tampungData.notify(); tampungData .notify(); } } }
Method disconnect juga sama dengan yang ada di server, potongan kodenya adalah sebagai berikut. public synchronized void disconnect(){ if(koneksi koneksi) ) { NDL.networkDisconnected( NDL .networkDisconnected( "disconnected.." );
koneksi = false; kirimdata.destroy(); kirimdata.destroy(); terimadata .destroy(); try {
client.close(); client .close(); } catch(Exception e) {} client = null; } System.out.println("Client .println("Client Disconnecte Disconnected" d"); ); } public void kirimData(String data){ public void kirimdata.tambahData(data); kirimdata .tambahData(data); }
Meth Method od
disc discon onne nect ct
Disconnected(...)
dima imana
Pemrograman Game Java
diat diatas as
juga juga
seluruh
akan akan clas lass
meman emangg ggil il yang
NDL. NDL.ne netw twor ork k
mengimp implementasi 16
J.E.N.I. Netw etwork orkData DataLi Lis sten tener
akan akan
mema emanggil ggil
sec secara ara
otom tomatis atis
method thod
networkDisconnected(...). Seka Sekara rang ng mem membuat buat satu atu class lass lagi lagi yaitu aitu clas class s Clie Client nt yang ang akan akan digunakan sebagai GUI dan sekaligus akhir dari program chating yang akan kita kita bang bangun un.. Prog Progra ram m ini ini meng menggu guna naka kan n dua dua pane panell yaitu aitu pane panell perta pertama ma 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 diga digant ntik ikan an deng dengan an pane panell kedu kedua a seba sebaga gaii tamp tampila ilan n GUIny GUInya. a. Prog Progra ram m ini ini mengimplementasi NetworkDataListener, Protocol dan ActionListener. Layout dari contai ntaine nerr dise disett null ull oleh leh seb sebab itu itu semu emua letak etak dari ari com compone ponen n menggunakan bentuk koordinat dengan menggunakan method reshape(posisi x, posisi y, panjang, tinggi) . Berikut ini adalah listing program dari class Client. public class Client extends JFrame implements NetworkDataListener,Protocol, ActionListener { public static void static void main(String[] main(String[] args) { new Client(); } private String host host; ; private String nama nama; ; private int port port; ; NetworkDataListener NDL NDL= =this ; NetworkData ND ND; ;
JPanel p1 p1= =new JPanel(); JLabel l1 l1= =new JLabel("Nama JLabel("Nama :"); :"); JLabel l2 l2= =new JLabel("Host JLabel("Host :"); :"); JLabel l3 l3= =new JLabel("Port JLabel("Port :"); :"); JTextField NAMA NAMA= =new JTextField("anonymouse" JTextField("anonymouse"); ); JTextField HOST HOST= =new JTextField("127.0.0.1" JTextField("127.0.0.1"); ); JTextField PORT PORT= =new JTextField("5000" JTextField("5000"); ); JButton connect connect= =new JButton("Connect" JButton( "Connect"); );
JPanel p2 p2= =new JPanel(); JButton send send= =new JButton("SEND" JButton( "SEND"); ); JTextArea pesan pesan= =new JTextArea(15,2); JTextArea isi isi= =new JTextArea(2,2); Container c;
Pemrograman Game Java
17
J.E.N.I. Client(){ c=getContentPane(); c.setLayout(null); p1.setLayout( p1 .setLayout(null ); p1.add( p1 .add(l1 l1).reshape(0, ).reshape(0, 0, 100, 25); p1.add( p1 .add(l2 l2).reshape(0, ).reshape(0, 40, 100, 25); p1.add( p1 .add(l3 l3).reshape(0, ).reshape(0, 80, 100, 25); p1.add( p1 .add(NAMA NAMA).reshape( ).reshape(50, 50, 0, 100, 25); p1.add( p1 .add(HOST HOST).reshape(50, ).reshape(50, 40, 100, 25); p1.add( p1 .add(PORT PORT).reshape(50, ).reshape(50, 80, 100, 25); p1.add( p1 .add(connect connect).reshape(30, ).reshape(30, 120, 100, 25);
p2.setLayout(null ); p2.setLayout( isi.setEditable( isi .setEditable(false); p2.add( p2 .add(new JScrollPane( isi isi)).reshape(0, )).reshape(0, 0, 470, 200); p2.add( p2 .add(new JScrollPane( pesan pesan)).reshape( )).reshape(0, 0, 220, 350, 55); p2.add( p2 .add(send send).reshape(370, ).reshape(370, 220, 100, 25); c.add(p1 .add(p1).reshape(1 ).reshape(150, 50, 50, 200, 200);
connect.addActionListener( this ); connect.addActionListener( send.addActionListener( send .addActionListener(this); setDefaultCloseOperation(this.EXIT_ON_CLOSE ); setSize(500,500); setVisible(true ); setResizable(false); }
Jika tombol connect ditekan maka instance dari NetworkData yaitu ND akan akan dibuat dibuat dimana dimana akan akan menan menangan ganii pesan pesan yang yang diterim diterima a ataupu ataupun n yang yang dikirimkan. Selain itu juga mengirimkan data keserver untuk memberi nama pada pada object object Proses ProsesCli Client ent yang yang menan menanga gani ni data data yang yang masuk masuk atau atau keluar keluar denga ngan
meng enggun gunakan akan
ND.ki D.kiri rim mData Data
(SET (SET_U _USE SER+ R+”| ”|”+ ”+n nama) ama),,
jug juga
mengirimkan ND.kirimData (CHAT_USER_BARU+”|”+ nama), dimana jika data ini diterima oleh server maka akan langsung mengirimkan ke seluruh client yang aktif bahwa user telah bergabung ke room. public void public void actionPerformed(ActionEvent e) { if(e.getSource() == connect connect){ ){ this.host host= =HOST HOST.getText(); .getText(); this.port port=Integer. =Integer. parseInt(PORT PORT.getText()); .getText()); this.nama nama= =NAMA NAMA.getText(); .getText();
ND=new NetworkData( host ND= host, ,port port, ,NDL NDL); ); ND.kirimData( ND .kirimData(SET_USER +"|" "|"+ +nama nama); );
Pemrograman Game Java
18
J.E.N.I. ND.kirimData(CHAT_USER_BARU +"|" ND.kirimData( "|"+ +nama nama); ); c.remove(p1 .remove( p1); ); c.add(p2 .add(p2).reshape(10, ).reshape(10, 10, 500, 500); setTitle(nama setTitle(nama); ); this.validate(); } if(e.getSource()== send send){ ){ ND.kirimData( ND .kirimData(CHAT_PESAN_USER +"|" "|"+ +nama nama+ +" : pesan.getText()); pesan .getText()); } }
Ketika Ketika tombol tombol send send diteka ditekan n maka maka progra program m akan akan mengir mengirimk imkan an data data melal lalui
method
ND.kiri irimData(CHAT_PESAN_USER+”|”+nama”
:
“+pesan.getText()); dimana ketika data sampai diserver maka akan di periksa menggunakan Protocol yang telah ditetapkan dan kemudian mengirimkan data ke seluruh client. Method
menerimaData(...)
yang
dioverride
dari
interface
NetworkDataListener akan digunakan untuk memeriksa data yang diterima oleh client, dimana data-data tersebut akan diproses sesuai dengan Protocol yang telah ditetapkan ditetapkan,, pengolaha pengolahan n datanya datanya juga menggunak menggunakan an StringToke StringTokennize nnizer r dengan tanda pemisah adalah “ | “ sama seperti yang dilakukan pada sisi server. Apabila ternyata pesannya berupa CHAT_USER_BARU maka object TextArea(isi) akan ditambahkan isi.append(“nick : “+nick+” telah bergabung di channel channel ini\n”); ini\n”); jika ternyata ternyata pesanny pesannya a berupa berupa CHAR_HAPU CHAR_HAPUS_USE S_USER R maka yang akan ditambahkan kedalam object TextArea(isi) isi.append(“nick : “+nick+” tela telah h
keluar luar
dari
chann hannel el
CHAT CHAT_P _PES ESAN AN_U _USE SER R
maka maka
ini! ini!\n \n”) ”);; obje object ct
teta tetap pi
apabi pabila la
Text TextAr Area ea(i (isi si))
pesan esanny nya a akan akan
ber berupa upa
dita ditamb mbah ahka kan n
isi.appen isi.append(st.n d(st.nextT extToken oken()+”\n” ()+”\n”). ). Apabila Apabila terjadi terjadi disconnec disconnectt disisi disisi client client maka class lass Netw Networ orkD kDat ata a yang ang ada ada disi disisi si clie client nt
akan akan meng mengir irim imka kan n pes pesan
“disconnect”.
Pemrograman Game Java
19