Finite State Machine

Finite State Machine adalah konsep dari perubahan state menggunakan trigger tertentu. Sebagai contoh dalam game, karakter yang melompat akan melalui state seperti ini (btw, saya menuliskan state dengan kurung kotak[] dan trigger dengan kurung biasa () ):

[Diam] -> (tekan tombol lompat) -> [Melompat]

Jika ternyata karakter bisa menembak saat melompat berarti alurnya menjadi seperti ini:

[Diam] -> (tekan tombol lompat) -> [Melompat] -> (tekan tombol tembak) -> [Menembak]

Penjelasan tentang state pattern yang lengkap ada di buku http://gameprogrammingpatterns.com/state.html. Di buku tersebut dijelaskan daripada membuat state pada satu kode yang memiliki banyak flag dan if, lebih baik state dipisah menjadi per kelas.

Desain dari FSM menggunakan kelas

Alasan setiap state dipisah menjadi kelas dikarenakan pada satu state maka kelas akan memiliki perilaku yang berbeda. Seperti contoh di atas, saat melompat karakter tidak menampilkan gambar diam. Input yang diberikan pada kondisi tersebut juga akan berbeda.

Desain FSM dengan kelas dapat diilustrasikan sebagai berikut:

gambaran state machine

Controller merupakan kelas yang menghubungkan antara tampilan (gambar, animasi, suara, dsb). Dengan menggunakan FSM, controller dipecah lagi menjadi modul-modul state terpisah. Sebagai contoh StateJump, StateIdle, dan seterusnya. Kelas FiniteStateMachine  bertugas mengembalikan state yang sedang digunakan, melaksanakan perintah saat masuk (in), dan keluar (out) dari state. Seluruh perubahan state dan pemberian trigger dikendalikan sendiri oleh masing-masing state yang mengimplementasikan interface IState.

Setiap state disimpan dalam sebuah kelas CharacterStates dalam bentuk statik. Hal ini memungkinan state untuk dipanggil secara flyweight. (Walaupun begitu, state juga bisa melakukan return kelas state yang baru untuk menghindari satu state dipakai bersamaan).

Masing-masing state tersebut diberi akses langsung ke controller untuk mengatur gambar yang ditampilkan, serta input yang diinginkan.

Jika diperhatikan, kelas-kelas state hanyalah sebuah sub controller sekaligus model dari kelas controller. Dengan desain seperti ini, setiap state dapat dikerjakan secara terpisah.

Link github project StateMachine dapat dilihat di sini: https://github.com/igrir/StateMachine

Leave a Reply

Your email address will not be published. Required fields are marked *