Mesin keadaan terbatas dalam C ++

16

Jadi, saya sudah membaca banyak tentang menggunakan FSM untuk melakukan manajemen keadaan gim, hal-hal seperti apa itu FSM, dan menggunakan tumpukan atau kumpulan negara untuk membangun satu. Saya sudah melalui semua itu. Tapi saya terjebak menulis implementasi FSM yang sebenarnya dan dirancang dengan baik untuk tujuan itu. Secara khusus, bagaimana seseorang dengan bersih menyelesaikan masalah transisi antar negara, (bagaimana) suatu negara dapat menggunakan data dari negara lain, dan seterusnya. Adakah yang punya tips tentang merancang dan menulis implementasi dalam C ++, atau lebih baik lagi, contoh kode?

Electro
sumber
tag yang diedit berdasarkan diskusi ini dalam meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Jawaban:

12

Saya menulis FSM berdasarkan dari bab dalam "Massively Multiplayer Game Development" Diedit oleh Thor Alexander. Di dalamnya ada bab yang diberi label "Mesin Paralel-Negara untuk Karakter yang Dapat Dipercaya". Ini ditulis dengan python, tetapi konsep-konsepnya mudah diterjemahkan ke dalam C ++. Saya sangat merekomendasikan memeriksa ini, meskipun ini tentang status karakter, bukan status permainan.

Apa yang saya buat ada di sini: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager mencari di bawah StateManager untuk detail implementasi, tetapi pada dasarnya Anda memiliki 'status dasar' yang berbeda yang dapat Anda gunakan menggunakan. Kemudian dari sana Anda memiliki status spesifik yang Anda transisikan menjadi karakter, sehingga setiap negara adalah kelas. Anda kemudian memeriksa apakah dapat beralih dari satu negara ke negara lain dan kemudian pada 'masuk' Anda beralih, Anda juga dapat dengan mudah melakukan hal-hal seperti memasukkan peristiwa setelah pindah ke negara. Saya menemukan ini bekerja sangat baik untuk permainan sejauh ini.

Apa yang telah saya terapkan adalah apa yang disebut buku sebagai mesin paralel, yang merupakan fungsi penting dari beberapa fsm yang bekerja bersama, dalam hal ini Anda dapat bertransisi menjadi satu keadaan, yang memblokir semua keadaan lainnya (yaitu: CreatureState_Dead). Saya tidak akan membahas lebih jauh karena saya pikir itu tidak akan membantu Anda, tetapi jika Anda mau, saya bisa menjelaskannya.

Kyle C
sumber
1
Sepertinya kode dipindahkan ke: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_
URL tetap: StateManager.cpp StateManager.h
Higor E.
8

Programming Game AI By Example (http://www.ai-junkie.com/books/toc_pgaibe.html) memiliki contoh implementasi yang cukup mudah dan hanya menangani dasar-dasarnya. Transisi ditangani dalam satu pemanggilan metode tunggal (Enter pertama (), lalu Jalankan () setiap pembaruan, Keluar () saat transisi)> Saya tidak tahu apa yang Anda perlukan selain itu. Saya akan menerapkan transisi yang lebih rumit sebagai kondisi mereka sendiri yang hanya dirancang untuk dieksekusi satu kali dan pindah ke status berikutnya secara berurutan.

Saya akan mengambil bacokan dan menganggap Anda sedang mencari FSM untuk AI, jika begitu saya sarankan Anda melihat pohon perilaku. AIGameDev memiliki beberapa artikel hebat di dalamnya.

michael.bartnett
sumber
1
Contoh itu juga tersedia di situsnya: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon
5

Jika C ++ template magic dan potensi waktu kompilasi yang lama tidak menjadi masalah bagi Anda dan Anda sudah menginstal Boost untuk bekerja dengan :

Boost sekarang memiliki perpustakaan meta-state-machine yang efisien ( dalam kecepatan dan ukuran ) yang memiliki keuntungan membiarkan Anda mengatur tabel transisi secara terpisah dari struktur state : Anda memiliki tabel yang menggambarkan kapan harus pergi dari negara mana ke negara lain . Anda hanya perlu membacanya untuk memahami apa yang terjadi di mesin negara.

Keuntungan lainnya adalah bahwa ia telah diuji oleh beberapa perusahaan bahkan dalam perangkat lunak yang disematkan dengan perangkat lunak berkinerja tinggi (lihat milis pendorong untuk detailnya). Karena implementasinya sudah ada, itu mungkin merupakan pilihan yang baik jika Anda memerlukan implementasi mesin negara generik yang Just Works (tm).

Ini juga mendukung status ortogonal (status paralel) dan fitur berbasis UML berguna lainnya.

Ini juga menyediakan beberapa cara untuk mengekspresikan tabel transisi, yang eksperimental tetapi menarik di sisi ekspresifitas (walaupun dibatasi oleh kinerja kompiler saat ini - terlalu buruk!)

Klaim
sumber