C ++ 'da sonlu durum makinesi


16

Bu yüzden, oyun durumu yönetimi için FSM'leri kullanma, FSM'nin ne olduğu gibi şeyler ve bir tane oluşturmak için bir yığın veya durum kümesi kullanma hakkında çok şey okudum . Bunların hepsini yaşadım. Ama bu amaç için bir FSM'nin gerçek ve iyi tasarlanmış bir uygulamasını yazmakta sıkıştım . Özellikle, devletler arasında geçiş problemi nasıl net bir şekilde çözülür, (bir devletin diğer eyaletlerden veri kullanabilmesi vb.). C ++ 'da bir uygulama tasarlama ve yazma konusunda herhangi bir ipucu var mı, yoksa daha iyisi kod örnekleri mi?


bu tartışmaya dayanarak düzenlenmiş etiketleri meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

Yanıtlar:


12

Thor Alexander tarafından düzenlenen "Devasa Çok Oyunculu Oyun Geliştirme" bölümünden bir FSM yazdım. İçeride "İnanılır Karakterler için Paralel Durum Makineleri" etiketli bir bölüm var. Bu python ile yazılmıştır, ancak kavramlar kolayca C ++ 'ya çevrilebilir. Bu, oyun durumları değil, karakter durumlarıyla ilgili olsa da, bunu kontrol etmenizi şiddetle tavsiye ederim.

Oluşturduğum şey burada: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager uygulama ayrıntıları için StateManager'ın altına bakın, ancak temel olarak yapabileceğiniz farklı 'temel durumlarınız' var kullanın. Daha sonra oradan karakter olarak geçtiğiniz belirli durumlara sahipsiniz, bu yüzden her durum bir sınıftır. Daha sonra bir durumdan diğerine geçiş yapıp yapamayacağınızı kontrol edersiniz ve daha sonra `` enter '' da geçişinizi yaparsınız, bir duruma geçtikten sonra olaylara koymak gibi şeyleri de kolayca yapabilirsiniz. Bunun şu ana kadar oyun için gerçekten işe yaradığını gördüm.

Uyguladığım şey, kitabın bir paralel durum makinesi olarak adlandırdığı şeydir, bu da çoklu fsm'nin birlikte çalışmasıdır, bu durumda diğer tüm durumları (yani: CreatureState_Dead) engelleyen bir duruma geçebilirsiniz. Sana gerçekten yardımcı olacağını düşünmediğim için çok daha fazla ayrıntıya girmeyeceğim, ama eğer istersen detaylandırabilirim.


1
DK_


8

Oyun AI Programlama Örneği (http://www.ai-junkie.com/books/toc_pgaibe.html) oldukça basit ve sadece temelleri ele alan örnek bir uygulamaya sahiptir. Geçişler tek bir yöntem çağrısında işlenir (önce Enter (), sonra Execute () her güncelleme, Exit () geçiş yaparken)> Bunun yanında neye ihtiyacınız olduğunu bilmiyorum. Sadece bir kez yürütmek ve sırayla bir sonraki duruma geçmek için tasarlanmış kendi durumları olarak daha karmaşık geçişler uygulardım.

Bir bıçak alacağım ve yapay zeka için FSM'lere baktığınızı varsayacağım, eğer öyleyse davranış ağaçlarına bir göz atmanızı tavsiye ederim. AIGameDev'in bazı harika makaleleri var.


1
Bu örnek de onun sitesinde mevcuttur: ai-junkie.com/architecture/state_driven/tut_state1.html
zolomon

5

C ++ şablon sihri ve potansiyel uzun derleme süreleri sizin için bir sorun değilse ve Boost ile zaten çalışmak için yüklü :

Boost şimdi geçiş tablosunu durum yapılarından ayrı olarak ayarlamanıza izin veren verimli ( hız ve boyutta ) bir meta-durum-makine kütüphanesine sahip : hangi eyaletten ne zaman başka bir duruma cadıya gidileceğini açıklayan bir tablonuz var . Devlet makinesinde neler olup bittiğini anlamak için okumalısınız.

Diğer avantajı, yüksek performanslı yazılımlı gömülü yazılımlarda bile birkaç işletme tarafından test edilmiş olmasıdır (ayrıntılar için ek posta listesine bakın). Uygulama zaten orada olduğundan, Just Works'ün (tm) genel durum makinesi uygulamasına ihtiyacınız varsa iyi bir seçim olabilir.

Ayrıca dikey durumları (paralel durumlar) ve diğer kullanışlı UML tabanlı özellikleri de destekler.

Ayrıca, geçiş tablosunu ifade etmenin birkaç yolu vardır, bunlardan biri deneysel ancak ifade tarafında ilginçtir (mevcut derleyici performansı ile sınırlı olmasına rağmen - çok kötü!)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.