Prinsip Desain atau Aturan pada Game First Person Shooter Teori Finite State Machine

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 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 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 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 public class FSM { private var activeState : Function; menunjukkan fungsi state yang aktif public function FSM {} public function setStatestate :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 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 } 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 public function findLeaf :void { menggerakkan semut ke daun velocity = new Vector3DGame.instance.leaf.x - position.x, Game.instance.leaf.y - position.y; if distanceGame.instance.leaf, this = 10 { semut sangat dekat dengan daun.inilah waktunya. pulang. brain.setStategoHome; } if distanceGame.mouse, this = MOUSE_THREAT_RADIUS { kursos mouse mengancam kita. Ayo lari ini akan membuat brain mulai memanggil runAway sekarang. brain.setStaterunAway; } } State goHome digunakan untuk membuat semut pulang kerumah : public function goHome :void { menggerakan semut menuju rumah. velocity = new Vector3DGame.instance.home.x - position.x, Game.instance.home.y - position.y; if distanceGame.instance.home, this = 10 { semut sampai dirumah. Cari daun lagi. brain.setStatefindLeaf;} } Universitas Sumatera Utara 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 Vector3Dposition.x - Game.mouse.x, position.y - Game.mouse.y; apakah kursor mouse masih dekat sini? if distanceGame.mouse, this MOUSE_THREAT_RADIUS { tidak, kursor mouse telah pergi. Ayo cari daun lagi. brain.setStatefindLeaf; } } 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 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 public function popState :Function { return stack.pop; } public function pushStatestate :Function :void { if getCurrentState = state { stack.pushstate; } } 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 public class Ant { ... public var brain :StackFSM; public function AntposX :Number, posY :Number { ... brain = new StackFSM; beritahukan brain untuk mencari daun. brain.pushStatefindLeaf; ... } state findLeaf. membuat semut mendekati daun. public function findLeaf :void { gerakkan semut mendekati daun. velocity = new Vector3DGame.instance.leaf.x - position.x, Game.instance.leaf.y - position.y; if distanceGame.instance.leaf, this = 10 { semut sudah sangat dekat dengan daun.ini waktunya pulang. brain.popState; memindahkan findLeaf dari tumpukan. brain.pushStategoHome; mendorong state goHome , membuatnya menjadi state aktif. } Universitas Sumatera Utara if distanceGame.mouse, this = MOUSE_THREAT_RADIUS { kursor mouse mengancam kita. Ayo lari state runAway didorong keatas findLeaf, yang artinya state findLeaf akan aktif kembali ketika staterunAway berakhir. brain.pushStaterunAway; } } state goHome. membuat semua menuju ke rumah. public function goHome :void { gerakkan semut menuju rumah velocity = new Vector3DGame.instance.home.x - position.x, Game.instance.home.y - position.y; if distanceGame.instance.home, this = 10 { semut sampai dirumah. Cari daun lagi. brain.popState; pindahkan state “goHome” dari tumpukan. brain.pushStatefindLeaf; dorong state findLeaf, buat menjadi state aktif } if distanceGame.mouse, this = MOUSE_THREAT_RADIUS { kursor mouse mengancam kita. Ayo lari state runAway terdorong diatas goHome, yang artinya stategoHome yang akan aktif lagi ketika state runAway berakhir. brain.pushStaterunAway; } Universitas Sumatera Utara } state runAway. membuat semut lari dari kursor mouse public function runAway :void { gerakkan semut menjauhi kursor mouse velocity = new Vector3Dposition.x - Game.mouse.x, position.y - Game.mouse.y; apakah kursor mouse masih disini? if distanceGame.mouse, this MOUSE_THREAT_RADIUS { tidak kursor mouse telah pergi. Ayo kembali ke sebelumnya. state aktif. brain.popState; } } ... }

2.5 Pengertian NPC