BAB 2 LANDASAN TEORI
2.1.
Sejarah singkat perang merebut Stabat
(TWH, 2007) Setelah terbentuknya kesatuan-kesatuan lasykar dan TKR (Tentara keamanan Rakyat) maka kebutuhan senjata makin mendesak. Sasaran yang dilakukan adalah melakukan penyerobotan gudang senjata Angkatan Udara Jepang di Marindal tanggal 25 November 1945. Pengawal gudang diikat kemudian isi gudang baik senjata serta peti-peti peluru dan bahan makanan maupun tekstil diangkut sampai jauh malam. Kawasan paling barat yaitu lokngha (Aceh) merupakan pertahanan jepang yang paling utama. Di sanalah bertumpu berbagai jenis senjata berat untuk
menghadapi sekutu.
Begitu jepang kalah, kemerdekaan di proklamirkan, tidak kurang 5000 rakyat dan lasykar ditambah satu Kompi Angkatan Pemuda Indonesia (API) di bawah pimpinan Syaman Gaharu tanggal 1 Desember 1945, selama beberapa hari mengepung dan mengurung pasukan jepang. Kemudian terjadi pertempuran dari pukul 9.00 pagi hingga siang. Residen Teuku Nyak Arif, wakil resien T.M.Ali Panglima Polim, ketua Pemuda Republik Indonesia A.Hasjmy mengadakan pembicaraan dengan jepang untuk menghentikan pertempuran. Kemudian diadakan perundingan di antara point yang dituntut adalah pangkalan Lhoknga harus diserahkan kepada pejuang. Seluruh tentara jepang dipindahkan ke blang bintang. Setelah itu, Sejarah perang di stabat melawan belanda padah tahun 1947 ini tidak banyak diketahui oleh banyak orang. Untuk itu dibuatlah sarana untuk menyampaikan cerita sejarah ini ke dalam bentuk game. Pada saat itu binjai dan stabat telah direbut belanda. Pasukan Indonesia berada di tanjung pura. Hari itu awal agustus
Universitas Sumatera Utara
8
Belanda melancarkan agresinya yang pertama. Letnan Amir Yahya yang berada di tanjung pura di panggil komandannya untuk merebut kembali stabat. Sesuai dengan rencana, pasukan Lettu Lidan Syam yang ditugaskan untuk merebut stabat bergerak melalui bukit melintang dengan melalui jembatan kereta api. Pasukan yang berkekuatan 350 orang itu dengan tenang melangkah menuju titik yang telah ditentukan. Dari sana pasukan RI menggempur kedudukan belanda, sekaligus merebut kota stabat. Pasukan bergerak tepat pukul 18.00 dan sampai di ujung jembatan stabat pukul 20.00 Wib. Dalam pertempuran itu, posisi Lettu Lidan Syam dan Letnan Amir Yahya paling depan. Mereka selalu berdekatan paling jauh jarak mereka hanya 6 meter. Pasukan Lidan Syam telah naik ke jembatan, bahkan 2/3 jembatan dikuasai. Pertempuran itu baru berjalan setengah jam. Kelihatan ada tanda-tanda belanda mulai meninggalkan kubu pertahanannya. Tapi apa boleh buat,”mujur saja tak dapat diraih, malang tak dapat ditolak”. Sebuah peluru mortir jatuh di tempat Lettu Lidan Syam dan Letnan Amir Yahya. Lidan Syam yang baru pertama kali terlibat dalam pertempuran seru mengalami luka berat terkena pecahan peluru. Sedangkan Letnan Amir Yahya juga mengalami luka di paha bagian belakang. Ketika peluru mortir meledak antara mereka terdengar suara teriakan Lettu Lidan Syam. Menyadari kedua orang pimpinan pasukan yang memimpin pasukan itu terkena ledakan, anak buah dari pasukan tersebut berusaha menarik keduanya dari ajang pertempuran untuk diberi pertolongan. Perlahan-lahan Letnan Amir Yahya dapat ditarik ke tempat yang lebih aman dan segera diberi perawatan sementara. Sedangkan, Lettu Lidan Syam yang bobot badannya terlalu berat, kira-kira 90-100 kg sangat sulit untuk ditarik ke lokasi yang lebih aman. Karena mengalami luka parah dan sangat banyak mengeluarkan darah, menyebabkan Lidan Syam gugur sebagai kusuma bangsa. Saat itu yang berusaha menggendong Letnan Amir Yahya dan membawanya ke luar dari area pertempuran adalah Letnan Bustanil Arifin (mantan Menteri Koperasi Ka.Bulog), yang pada malam itu rupanya juga turut bertempur merebut stabat. Mereka yang diterluka dibawa ke Rumah Sakit Langsa (Aceh Timur) yang lokasinya jauh dari pertempuran dan disana terdapat tenaga medis yang ahli dalam bidangnya. Langsa merupakan basis bagi para pejuang dalam mempertahankan kemerdekaan.
Universitas Sumatera Utara
9
2.2
Teori 2D dan 3D
sebuah pemahaman tentang gerak dan penggerak keduanya sangat penting dalam memahami games. Kebanyakan objek didalam game bergerak. Apa yang membuatnya menjadi dinamis adalah gerakan itu sendiri. Jika itu adalah 2D character seperti Angry Birds atau 3D karakter yang lengkap seperti Tomb Raider, suasana game dan gerakan yang terus-menerus. Untuk memahami pengertian dari gerak, khususnya yang berkaitan dengan permainan komputer, pengetahuan dasar dalam vektor matematika diperlukan. Vektor digunakan secara luas dalam pengembangan game bukan hanya untuk menjelaskan kecepatan, akselerasi, posisi, dan arah tetapi juga dalam model 3D untuk menentukan texturing UV, sifat pencahayaan, dan efek khusus lainnya (Peng, 2014). 2.2.1
Prinsip Vektor
(Peng,2014) Dalam 2D , vektor memiliki x dan y koordinat. Tapi dalam 3D, ada x, y, dan z koordinat. Dalam sistem matematika mutlak, sebuah vektor tidak hanya sebuah titik pada latar, tetapi juga sekumpulan perintah koordinasi yang dinamis. Ada sebuah legenda yang akan di tampilkan untuk memahami vektor. Sebuah peta harta karun legendaris dibuat, dan kapal kargo berhenti dititik (4,8) yang disebut start. Sebagai contoh, para pelaut mengambil tiga langkah ke timur dan tujuh langkah ke selatan. Seperti ditunjukan dalam Gambar 2.1, para pelaut bergerak tiga langkah ke timur dan digambarkan vektor (3,0), yang berarti berpindah 3 dalam arah x positif. Kemudian para pelaut mengambil tujuh langkah ke selatan bisa digambarkan vektor (0,-7). Yang berarti berpindah 7 ke arah y negatif dan 0 ke arah y. Untuk menentukan lokasi terakhir, vektor x dan y ditambahkan ke titik awal x dan y. sebagai contoh, pada gambar 2.1, kapal kargo dititik (4,8) dan pelaut berpindah positif tiga x positif, yang akan menempatkan mereka di titik (7,8). Kemudian mereka berpindah dikurangi tujuh y-axis, yang akan menempatkan mereka di (7,1). Sebenarnya, mereka juga dapat tiba di titik yang sama dengan mengambil jalan pintas, dengan kata lain, mereka dapat berjalan langsung dalam garis lurus antara titik awal dan harta karun itu. Dalam kasus ini, dua vektor (3,0) dan (0,-7) harus digabungkan bersama-sama dan hasilnya adalah (3,-7). Dengan menggunakan vektor baru ini dan berangkat dari lokasi awal, mereka akan sampai pada lokasi yang sama di titik (7,1).
Universitas Sumatera Utara
10
Gambar 2.1 Peta imajinatif menggambarkan penggunaan vektor (Peng,2014) Untuk kembali ke kapal kargo dari harta karun itu, para pelaut dapat berjalan di sepanjang jalan yang sama yang digambarkan di atas, tetapi dalam ke arah sebaliknya. Ini dapat diselesaikan dengan membalik vektor sehingga semua nilai koordinat harus dikalikan dengan -1. Dalam hal ini, untuk dapat kembali ke kapal mereka harus pergi melalui vektor (-3,7). Ini adalah cara terbaik bagi orang untuk mengetahui jarak lurus antara kapal dan harta karun itu. Panjang vektor, ditulis v, didefenisikan besarnya dan ditulus |v|, dan itu bisa ditemukan menggunakan teorema Pythagoras, seperti yang ditunjukan pada persamaan 1. |v| = √(v∙x^2+v∙y^2 )
(1)
Setiap game object atau prefab di Unity memiliki banyak vektor yang terkait dengan itu. Transformasi setiap komponen game object atau prefab memiliki tiga sifat penting: rotasi, posisi, dan skala. Tampilan dari environment game klasik dengan model karakter sebagai objek yang ditunjukkan pada Gamtbar 2.2. Pada umumnya, dalam 3D, sumbu x menyatakan samping, y menyatakan atas, dan z menyatakan depan. Setiap game object atau prefab memiliki bentuknya sendiri. Sumbu ditunjukan di jendela Scene dengan tiga jenis garis panah merah, yang ditunjukkan pada Gambar 2.2, warna merah, hijau, dan biru. Sumbu y adalah hijau, sumbu x adalah merah, dan sumbu Z adalah biru.
Universitas Sumatera Utara
11
Environment di Unity memiliki sumbunya sendiri, dan orientasi yang dapat disesuaikan oleh pengguna dalam mengubah sudut pandang sekitar untuk mengamati objek yang berbeda. Di Unity, orientasi kamera yang menentukan orientasi utama. Semua game object memiliki orientasi mereka sendiri digambarkan dengan sumbu x, y, z yang diperlihatkan pada Jendela Scene ketika game object itu terpasang. Dengan demikian, dengan membaringkan game object, sumbu y dari game object ini maka dia menjadi horizontal.
Gambar 2.2 Koordinat di Edit Scene pada Unity (Peng,2014) Di Unity, Vector2 dan Vector3 adalah kelas yang umumnya digunakan. Posisi, rotasi, dan nilai skala game object disimpan sebagai Vector3. Informasi vektor 2D disimpan sebagai Vektor2. Vektor dari game object untuk sumbu x, y, dan z dapat dikontrol dengan kode pemrograman Vector3.left, Vector3.up, dan Vector3.forward masing-masing. Pengguna dapat menggerakkan game object kesegala arah tanpa kode dan orientasi.
Universitas Sumatera Utara
12
2.2.2
Defenisi Ruang 2D dan 3D
(Peng,2014) Teori-teori vektor pada ruand 2D atau 3D diterapkan dengan cara yang sama. Perbedaan antara sistem koordinat 2D dan sistem koordinat 3D adalah nilai parameternya yang berlainan. Dalam game engine 3D, game 2D yang dikembangkan dengan sumbu x dan sumbu z. Dalam game 2D, umumnya diposisikan pada latar yang sama, yang mana diinisialisasikan nilai dari y menjadi 0. Setiap pergerakan pada game object tersebut hanya bisa bertindak pada latar itu saja. Hal ini dapat diasimilasikan dengan memindahkan objek sekitar daerah atas planar. Kebanyakan game 2D, kamera ditempatkan langsung di atas scene dan perspektif dihapus untuk memberikan pandangan adegan yang benar-benar 2D. apakah itu game 2D atau 3D kamera adalah komponen yang penting karena menampilkan semua tindakan dari game object pada player di arena permainan. Sebagai hasilnya melalui lensa mata kita dapat merasakan suasana permainan itu. Memahami bagaimana kamera bergerak dan bagaimana cara untuk menyesuaikannya dibutuhkan pengetahuan dasar. Bi-dimensional (ruang dua dimensi) adalah model geometrik dari proyeksi planar fisik alam semesta dimana kita hidup. Dua dimensi biasanya disebut panjang dan lebar. Keduanya terletak pada latar yang sama. Untuk menganalisis kasus 2D, seperti yang ditunjukkan pada gambar 2.3, bahwa dari contoh flatland klasik, dimana seseorang hidup dialam semester 2D dan hanya mengetahui dua dimensi (ditampilkan sebagai grid bir), atau bidang datar, katakanlah arah x dan y. orang seperti itu tidak pernah bisa membayangkan arti tinggi dalam arah z, sehingga dia tidak dapat melihat ke atas atau ke bawah, dan melihat orang lain sebagai bentuk 2D pada permukaan datar ia tinggal. Ruang Tiga Dimensi adalah model model geometrik tiga parameter dari fisik alam semesta (tanpa mempertimbangkan waktu) dimana semua materi yang dikenal ada. Tiga dimensi ini bisa dilabel sebagai kombinasi dari tiga yang dipilih dari istilah panjang, lebar, tinggi, kedalaman, dan keluasan, dengan kata lain, biasanya diberi label x, y, dan z. tiga arah apapun dapat dipilih, asalkan itu semua tidak terletak pada latar 3yang sama. Dalam matematika dan fisika, urutan angka n dapat dimengerti sebagai lokasi ruang n-dimensi. Ketika n=3, himpunan semua lokasi tersebut disebut ruang 3-dimensi Euclidean. Hal ini
Universitas Sumatera Utara
13
biasanya diwakili oleh simbol. Ruang ini hanya salah satu contoh dari berbagai ruang dalam tiga dimensi yang disebut 3-manifold.
Gambar 2.3 Memahami ruang 2D. disalin dari insinyur Xavier Borg (2007) 2.2.3
Translasi, Rotasi, dan Skala
(Peng, 2014) Setiap game object apakah itu dalam bentuk 2D atau 3D dapat dilakukan dengan tiga transformasi : translasi, rotasi, dan skala. Translasi berhubungan dengan gerakan dan posisi game object dan ditentukan oleh vektor 2D bahwa orang pada bagian sebelumnya telah berpindah pada peta. Fitur penting dari translasi adalah setiap kali nilainilai x, y, dan z di ubah. Nilai-nilainya dapat diubah sekaligus dengan vektor atau satu per satu. Untuk memindahkan game object ke arah x sebanyak 8, Unity C# :
Gameobject.transform.position.x =+8 ;
Untuk memindahkan game object sebanyak 5 pada x, 9 pada y, dan 14 pada z, dalam Unity C#, itu bisa ditulis seperti ini : Gameobject.transform.position.x +=5; Gameobject.transform.position.y +=9; Gameobject.transform.position.z +=14; Atau
Universitas Sumatera Utara
14
Gameobject.transform.position = new Vector3 (5,9,14);
Unity menaruh rotasi sebagai Quaternion internal. Untuk memutar objek, gunakan Transform.rotate. Gunakan Transform.eulerAngles untuk mengatur rotasi sudut euler. Sebuah game object dapat diputar sumbu x, y, atau z atau dunia pada sumbu x, y, dan z. rotasi gabungan juga sangat mendukung. Sebuah objek dapat diputar semaunya yang didefenisikan oleh nilai-nilai vektor. Pada akhirnya skala dapat mengubah ukuran objek seperti yang ditunjukkan pada Gambar 2.4 Sebuah game object dapat diskalakan sepanjang sumbu x, y, dan z. Ini kemampuan yang sangat penting yang dapat mengubah skala game object dengan mengatur nilai skala secara individual, begini :
Gambar 2.4 Menskalakan Objek (Peng, 2014) Harus diketahui bahwa nilai-nilai untuk skala selalu dikalikan terhadap ukuran dasar dari game object. Oleh karena itu, tidak dapat membuat skala nol. Jika desainer ingin membalik sebuah objek, nilai skala negatif dapat digunakan. Misalnya, mengatur skala
Universitas Sumatera Utara
15
sumbu y menjadi -1 akan mengubah game object terbalik. Ini adalah kemampuan yang diperlukan untuk memahami bagaimana game object akan bergerak dalam game. Para desainer harus meluangkan waktu untuk menyesuaikan diri dengan ruang 2D dan 3D. Untungnya, Unity menyediakan matematika yang dapat dikerjakan dengan mudah dan memberitahukan berbagai fungsi yang mudah digunakan. 2.3
Prinsip Desain atau Aturan pada Game First Person Shooter
(Peng, 2014) Seluruh Tema dari projek game ini adalah mekanisme yang berhubungan dengan aksi yang sedang berlangsung pada game dari operasi animasi internal dan pemrograman ke interaksi antara environment dan player. Namun, dalam penelitian game, mekanisme game tersebut digunakan untuk mengacu kepada hubungan yang dikembangkan yang menfasilitasi dan menentukan tantangan antara game dan player. Itu adalah sistem yang rumit yang mengandung serangkain alasan yang masuk akal, aksi, tujuan, dan umpan balik para player. Memahami mekanisme game sangat berguna untuk membuat aksi-aksi dan unsur-unsur lain yang dapat diimplementasikan dan menghasilkan ide yang tak terbatas untuk game dengan menggabungkan aksi, aturan dan tujuan. Siklus ini diilustrasikan pada Gambar 2.5.
Gambar 2.5. Siklus mekanisme game (Peng, 2014)
Universitas Sumatera Utara
16
(Peng, 2014) Para player disajikan dengan sebuah tantangan. Untuk mencapai tantangan mereka mendapatkan alat yang dapat digunakan untuk melakukan aksi dan aturan-aturan yang membatasi ruang lingkup aksi ini. Alat-alat yang digunakan mengandung objek yang berisi masukkan atau input seperti sensor dan keyboard, serta alat-alat virtual didalam game seperti senjata, kotak-alat, dan kunci. Peraturan tentang bagaimana player dapat bermain didunia game. Didalam game kartu, umumnya aturan ditulis dalam buku instruksi dan ditangani oleh player. Dalam video game, player dibimbing secara sadar akan aturan dalam game dan pemrogram kode game tersebut harus dapat memastikan bahwa player bisa mengikutinya. Pemrogram juga memberikan informasi kepada player tergantung dari aksi ataupun tindakan yang dilakukan untuk membantu mereka belajar bagaimana cara memainkan game ini dengan lebih baik dan menyelesaikan
tantangan.
Bagian
dari
mekanisme
umpan
balik
juga
bisa
menginformasikan player ketika mereka menang atau gagal. 2.4
Teori Finite State Machine
(Bevilacqua, 2013) Finite State Machine (FSM) adalah model yang digunakan untuk menggambarkan dan mengatur aliran eksekusi yang biasanya digunakan untuk program komputer dan urutan logika sirkuit. Hal ini cocok diterapkan terhadap AI pada game, memproduksi hasil yang bagus tanpa kode yang kompleks. (Warden, 2012) Untuk pemrograman AI, penulis memiliki pilihan deterministic atau non-deterministic. Kebanyakan video game memiliki deterministic. Berarti anda tahu bagaimana musuh akan bereaksi berdasarkan masukan yang berbeda. Jika mereka akan menyerang. Jika anda bersembunyi dan menunggu, mereka akan menyerang anda. FSM pendeknya adalah model komputasi yang berbasis pada mesin hipotesis yang terbuat dari satu atau banyak state. FSM biasanya digunakan untuk mengatur dan menggambarkan aliran eksekusi yang
berguna
diterapkan
pada
game.
“Otak”
dari
musuh,
misalnya
bisa
diimplementasikan menggunakan FSM setiap state merupakan suatu tindakan, seperti attack atau evade. FSM dapat digambarkan dengan grafik, dimana node adalah state dan ujung-ujungnya adalah transisi. Setiap sisi memiliki label yang menginformasikan ketika transisi terjadi, seperti player is near pada gambar 2.5, yang menunjukkan bahwa mesin akan beralih dari wander ke attack jika player is near.
Universitas Sumatera Utara
17
2.4.1 Perencanaan State dan Transisi (Bevilacqua, 2013) Penerapan FSM dimulai dengan states dan transisi yang dibutuhkan. Bayangkan FSM pada Gambar 2.6, menggambarkan otak dari semut yang membawa daun ke rumah. Titik awal adalah state find leaf, yang mana akan aktif sampai semut menemukan daunnya. Ketika itu terjadi, kondisi state di transisikan ke go home, yang mana akan aktif sampai semut sampai di sarang. Ketika semut sampai sarang, state yang aktif menjadi find leaf lagi, jadi semut mengulangi perjalanannya. Jika state yang aktif adalah find leaf dan kursor mouse mendekati semut, transisinya menjadi state run away. Ketika state aktif, semut akan lari dari kursor mouse. Ketika kursor tidak lagi menjadi ancaman, transisi state kembali ke find leaf. Karena ada transisi yang menghubungkan antara find leaf dan run away, semut akan selalu melarikan diri dari kursor mouse ketika itu mendekati semut selama semut mencari daun. Itu tidak akan terjadi jika state yang aktif adalah go home (cek gambar 2.7). Dalam kasus ini semut akan pulang kerumah tanpa rasa takut, hanya transisi ke find leaf ketika semut sampai rumah. 2.4.2
Menerapkan Finite State Machine
(Bevilacqua, 2013) FSM dapat diimplementasikan dan dikemas dalam satu kelas, bernama FSM misalnya. Idenya adalah untuk menjalankan setiap state sebagai fungsi atau metode, menggunakan properti yang disebut activeState didalam kelas untuk menentukan state mana yang aktif. Karena setiap state adalah fungsi, selama fungsi state tertentu aktif
mempresentasikan keadaan state tersebut akan dipanggil setiap
membaharui game. Metode Update () pada FSM harus dipanggil setiap game frame, sehingga dapat memanggil fungsi yang ditunjukkan oleh properti activeState. Panggilan yang akan memperbaharui tindakan dari state yang sedang aktif. Metode setState () akan mentransisikan FSM ke state yang baru dengan mengarahkan properti activeState untuk fungsi state baru. Fungsi state tidak harus menjadi anggota FSM, bisa saja menjadi kelas lain, yang mana membuat kelas FSM lebih umum dan dapat digunakan kembali.
Universitas Sumatera Utara
18
Gambar 2.6 Menggambarkan Otak dari semut (Bevilacqua, 2013)
Gambar 2.7 FSM menggambarkan otak dari semut. Perhatikan kurangnya transisi antara run away dan go home (Bevilacqua, 2013)
Universitas Sumatera Utara
19
public class FSM { private var activeState : Function; // menunjukkan fungsi state yang aktif public function FSM () {}
public function setState(state :Function) :void { activeState = state ; }
public function update () :void { if ( activeState != null )
{
activeState();
}
} }
Menggunakan kelas FSM yang telah dijelaskan sebelumnya, saatnya untuk menerapkan “brain” karakternya. Pada penjelasan sebelumnya semut digunakan dan dikendalikan dengan FSM. Pada Gambar 2.8 adalah gambaran dari state dan transisi, fokus pada kodenya. Semut direpresentasikan dengan class Ant, yang memiliki properti bernama otak dan metode untuk tiap state. Properti brain adalah turunan dari kelas FSM :
Universitas Sumatera Utara
20
Gambar 2.8 FSM dari otak semut dengan berfokus pada kode (Bevilacqua, 2013) public class Ant { public var position
:Vector3D;
public var velocity
:Vector3D;
public var brain
:FSM ;
public function Ant (posX : Number, posY :Number) { position
= new Vector3D (posX, posY);
velocity
= new Vector3D (-1,-1);
brain
= new FSM () ;
//beritahu brain untuk memulai mencari daun (leaf). brain.setState (findLeaf); }
/** state findLeaf membuat semut menuju daun. */
public function findLeaf () :void {
Universitas Sumatera Utara
21
}
/** state goHome membuat semut menuju rumah. */
public function goHome () :void { }
public function update() :void { // memperbaharui FSM yang mengendalikan “brain”. Ini akan memanggil fungsi state yang sedang aktif : findLeaf (), goHome(), atau runaway().
brain.update();
//menerapkan vektor kecepatan untuk posisi, membuat semut berjalan. moveBasedOnVelocity (); }
(….) }
Kelas Ant juga memiliki kecepatan dan properti posisi, keduanya digunakan untuk menghitung pergerakan dengan menggunakan integrasi Euler. Metode update ini dipanggil di setiap kerangka game, sehingga akan memperbaharui FSM. Dibawah ini penerapan tiap state, dimulai dengan findLeaf (), state bertanggung jawab untuk memandu semut ke posisi daun :
Universitas Sumatera Utara
22
public function findLeaf() :void { // menggerakkan semut ke daun velocity = new Vector3D(Game.instance.leaf.x - position.x, Game.instance.leaf.y position.y);
if (distance(Game.instance.leaf, this) <= 10) { // semut sangat dekat dengan daun.inilah waktunya. // pulang. brain.setState(goHome); }
if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // kursos mouse mengancam kita. Ayo lari ! // ini akan membuat brain mulai memanggil runAway() // sekarang. brain.setState(runAway); } }
State goHome () digunakan untuk membuat semut pulang kerumah : public function goHome() :void { // menggerakan semut menuju rumah. velocity = new Vector3D(Game.instance.home.x - position.x, Game.instance.home.y - position.y);
if (distance(Game.instance.home, this) <= 10) { // semut sampai dirumah. Cari daun lagi. brain.setState(findLeaf);} }
Universitas Sumatera Utara
23
Akhirnya, state runAway () digunakan untuk membuat semut melarikan diri dari kursor mouse : public function runAway() :void { // menggerakkan semut untuk menjauh dari kursor mouse velocity = new Vector3D(position.x - Game.mouse.x, position.y - Game.mouse.y);
// apakah kursor mouse masih dekat sini? if (distance(Game.mouse, this) > MOUSE_THREAT_RADIUS) { // tidak, kursor mouse telah pergi. Ayo cari daun lagi. brain.setState(findLeaf); } }
Hasilnya, semut akan dikendalikan oleh “brain” dari Finite State Machine. Bayangkan jika semut juga ingin lari dari kursor mouse ketika akan pulang. FSM dapat diperbaharui seperti pada gambar 2.9. Tampaknya adalah modifikasi yang sepele, penambahan transisi baru, tetapi ini menimbulkan masalah. Jika state run away dan kursor mouse tidak lagi mendekat, state apa yang seharusnya semut transisikan ke go home atau find leaf. Solusi dari masalah itu adalah dengan menggunakan Stack-based FSM. Tidak seperti FSM yang ada, Stack-based FSM menggunakan tumpukan untuk mengontrol state-state. Bagian atas tumpukan berisi state yang aktif, transisi ditangani dengan mendorong atau state muncul ke atas dari tumpukan. State bisa muncul ke atas dengan sendirinya dari tumpukan itu dan mendorong state yang lain, yang berarti transisi penuh (seperti FSM yang sederhana). State bisa muncul ke atas dengan sendirinya dari tumpukan yang berarti state saat ini telah selesai dan state selanjutnya di dalam tumpukan akan segera aktif. Pada akhirnya, itu akan mendorong state yang baru, yang artinya state aktif akan berubah untuk sementara waktu, tapi ketika state itu muncul lagi dari tumpukan, maka state aktif yang sebelumnya akan mengambil alih lagi.
Universitas Sumatera Utara
24
Gambar 2.9 FSM semut diperbaharui dengan transisi baru (Bevilacqua, 2013) Stack-based FSM dapat diimplementasikan dengan menggunakan pendekatan yang sama seperti sebelumnya, tapi kali ini menggunakan sebuah array dari fungsi pointer untuk mengontrol tumpukan. Properti activeState tidak lagi diperlukan, karena tumpukan yang paling atas telah menjadi state aktif. public class StackFSM { private var stack :Array;
public function StackFSM() { this.stack = new Array(); } public function update() :void { var currentStateFunction :Function = getCurrentState(); if (currentStateFunction != null) { currentStateFunction(); } }
Universitas Sumatera Utara
25
public function popState() :Function { return stack.pop(); } public function pushState(state :Function) :void { if (getCurrentState() != state) { stack.push(state); } } public function getCurrentState() :Function { return stack.length > 0 ? stack[stack.length - 1] : null; } }
Metode setState () telah diganti dengan dua metode baru : pushState () dan popState (). pushState () menambahkan dua state baru ke atas tumpukan, sementara popState () menghapus state yang di atas tumpukan. Kedua metode ini secara otomatis mentransisikan mesinnya ke state yang baru, karena state yang di atas tumpukan telah berganti.Ketika menggunakan Stack-based FSM, yang menjadi catatan penting adalah bahwa setiap state bertanggung jawab muncul dari tumpukan. Biasanya state menghapus dirinya sendiri dari tumpukan ketika sudah tidak diperlukan lagi, seperti jika attack () aktif tapi targetnya baru saja mati. Menggunakan contoh semut, hanya beberapa perubahan yang diperlukan untuk menyesuaikan kode untuk digunakan pada Stack-based fsm. Masalah tidak tahu kemana state akan transisi sekarang sudah dapat diselesaikan berkat sifat dari Stack-based FSM. Hasilnya adalah seekor semut dapat melarikan diri dari kursor mouse, transisi kembali ke keadaan state aktif sebelum ancaman.
Universitas Sumatera Utara
26
public class Ant { (...) public var brain :StackFSM;
public function Ant(posX :Number, posY :Number) { (...) brain = new StackFSM();
// beritahukan brain untuk mencari daun. brain.pushState(findLeaf);
(...) }
/** * state "findLeaf". * membuat semut mendekati daun. */ public function findLeaf() :void { //gerakkan semut mendekati daun. velocity = new Vector3D(Game.instance.leaf.x - position.x, Game.instance.leaf.y - position.y);
if (distance(Game.instance.leaf, this) <= 10) { // semut sudah sangat dekat dengan daun.ini waktunya! // pulang. brain.popState(); // memindahkan "findLeaf" dari tumpukan. brain.pushState(goHome); // mendorong state "goHome" , membuatnya menjadi state aktif. }
Universitas Sumatera Utara
27
if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // kursor mouse mengancam kita. Ayo lari! // state "runAway" didorong keatas "findLeaf", yang artinya // state "findLeaf" akan aktif kembali ketika state"runAway" berakhir. brain.pushState(runAway); } }
/** * state "goHome". *membuat semua menuju ke rumah. */ public function goHome() :void { // gerakkan semut menuju rumah velocity
=
new
Vector3D(Game.instance.home.x
-
position.x,
Game.instance.home.y - position.y);
if (distance(Game.instance.home, this) <= 10) { // semut sampai dirumah. Cari daun lagi. brain.popState(); // pindahkan state “goHome” dari tumpukan. brain.pushState(findLeaf); // dorong state "findLeaf", buat menjadi state aktif }
if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // kursor mouse mengancam kita. Ayo lari! // state "runAway" terdorong diatas "goHome", yang artinya // state"goHome" yang akan aktif lagi ketika state "runAway" berakhir. brain.pushState(runAway); }
Universitas Sumatera Utara
28
}
/** * state "runAway". * membuat semut lari dari kursor mouse */
public function runAway() :void { // gerakkan semut menjauhi kursor mouse velocity
=
new
Vector3D(position.x
-
Game.mouse.x,
position.y
-
Game.mouse.y);
// apakah kursor mouse masih disini? if (distance(Game.mouse, this) > MOUSE_THREAT_RADIUS) { // tidak kursor mouse telah pergi. Ayo kembali ke sebelumnya. // state aktif. brain.popState(); } } (...) }
2.5
Pengertian NPC
Sebuah NPC dikenal sebagai karakter yang bukan orang atau karakter yang bukan dimainkan, dalam game adalah setiap karakter yang tidak dimainkan oleh player atau pemain. Dalam video game, ini biasanya berarti karakter yang dikendalikan oleh komputer melalui kecerdasan buatan. Jika player character (PC) dalam cerita protagonist, npc dapat dianggap sebagai “pemain pendukung” atau “ekstra” dari narasi Role playing.
Universitas Sumatera Utara
29
Karakter npc mengisi dunia fiksi dari game dan dapat mengisi peran apapun yang tidak di tempati oleh player character. Karakter npc mungkin sekutu, para pengamat atau pesaing untuk player character. Npc juga bisa pedagang yang berdagang mata uang untuk hal-hal seperti peralatan atau perlengkapan Npc sehingga bervariasi dalam tingkat detail (Ellison, 2008).
2.6
Penelitian Terdahulu
Beberapa penelitian yang berkaitan dengan pembuatan game First Person Shooter menggunakan Unity adalah : 1. Xia, Peng (2014) membahas tentang membuat game First Person Shooter menggunakan Unity. 2. Jailani, A.Q. (2010) meneliti tentang membuat strategi gerak hindar Non-Player Character (NPC) pada game First Person Shooter (FPS) menggunakan Finite State Machine (FSM). 3. Mizanuddin (2011) membuat game First Person Shooter Operasi Lun Inau menggunakan Unity. 4. Meisadri et al (2013) meneliti pembangunan game First Person Shooter 3D Alien Hunter menggunakan algoritma A* star sebagai pathfinding dan fuzzy logic.
Universitas Sumatera Utara