เครื่องสถานะ จำกัด ใน C ++


16

ดังนั้นฉันได้อ่านมากเกี่ยวกับการใช้ FSM เพื่อจัดการสถานะเกมสิ่งต่าง ๆ เช่น FSM คืออะไรและใช้สแต็กหรือชุดของรัฐเพื่อสร้างสิ่งหนึ่ง ฉันผ่านทุกสิ่งไปแล้ว แต่ฉันติดอยู่กับการเขียนการใช้งาน FSM ตามความเป็นจริงที่ออกแบบมาอย่างดีเพื่อจุดประสงค์นั้น โดยเฉพาะอย่างยิ่งหนึ่งจะแก้ไขปัญหาของการเปลี่ยนระหว่างรัฐได้อย่างหมดจด (อย่างไร) รัฐควรจะสามารถใช้ข้อมูลจากรัฐอื่น ๆ และอื่น ๆ ได้อย่างไร ใครบ้างมีเคล็ดลับในการออกแบบและเขียนการใช้งานใน C ++ หรือดีกว่าตัวอย่างรหัส?


แท็กที่แก้ไขตามการสนทนานี้ใน meta: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

คำตอบ:


12

ฉันเขียน FSM โดยอ้างอิงจากบทใน "การพัฒนาเกมผู้เล่นหลายคนจำนวนมาก" แก้ไขโดย Thor Alexander ข้างในเป็นบทที่ชื่อว่า "เครื่องจักรรัฐ - ขนานสำหรับตัวละครที่น่าเชื่อ" สิ่งนี้เขียนด้วยไพ ธ อน แต่แนวคิดนั้นแปลได้อย่างง่ายดายใน C ++ ฉันขอแนะนำให้ตรวจสอบสิ่งนี้แม้ว่านี่จะเกี่ยวกับสถานะของตัวละครไม่ใช่สถานะของเกม

สิ่งที่ฉันสร้างอยู่ที่นี่: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager ดูรายละเอียดการใช้ StateManager แต่โดยพื้นฐานแล้วคุณมี 'สถานะพื้นฐาน' ที่แตกต่างกันซึ่งคุณสามารถทำได้ ใช้. จากนั้นคุณจะมีสถานะเฉพาะที่คุณเปลี่ยนไปเป็นตัวละครดังนั้นทุกรัฐจึงเป็นคลาส จากนั้นคุณตรวจสอบว่าสามารถเปลี่ยนจากสถานะหนึ่งไปอีกรัฐหนึ่งได้หรือไม่จากนั้นเมื่อ 'ป้อน' คุณทำการสลับคุณยังสามารถทำสิ่งต่าง ๆ เช่นใส่เหตุการณ์หลังจากย้ายไปยังสถานะได้อย่างง่ายดาย ฉันพบว่ามันใช้งานได้ดีสำหรับเกมจนถึงตอนนี้

สิ่งที่ฉันนำมาใช้คือสิ่งที่หนังสือเรียกว่าเครื่องสถานะคู่ขนานซึ่งเป็นสิ่งสำคัญที่เอฟเอ็มจำนวนมากทำงานร่วมกันในกรณีนี้คุณสามารถเปลี่ยนเป็นรัฐหนึ่งซึ่งบล็อกสถานะอื่นทั้งหมด (เช่น: CreatureState_Dead) ฉันจะไม่ไปลงรายละเอียดมากเกินไปเพราะฉันไม่คิดว่ามันจะช่วยคุณได้จริงๆ แต่ถ้าคุณต้องการให้ฉันทำอย่างละเอียด


1
ดูเหมือนว่ารหัสถูกย้ายไปที่: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_


8

การเขียนโปรแกรมเกม AI โดยตัวอย่าง (http://www.ai-junkie.com/books/toc_pgaibe.html) มีตัวอย่างการใช้งานที่ค่อนข้างตรงไปตรงมาและเพิ่งจัดการพื้นฐาน การเปลี่ยนแปลงได้รับการจัดการในการเรียกใช้เมธอดเดียว (Enter ครั้งแรก () จากนั้นดำเนินการ () ทุกการอัปเดต Exit () เมื่อทำการเปลี่ยนแปลง)> ฉันไม่ทราบว่าคุณต้องการอะไรนอกเหนือจากนั้น ฉันจะใช้ช่วงการเปลี่ยนภาพที่ซับซ้อนมากขึ้นเป็นสถานะของตัวเองที่เพิ่งออกแบบมาเพื่อรันครั้งเดียวและย้ายไปยังสถานะถัดไปตามลำดับ

ฉันจะแทงและคิดว่าคุณกำลังมองหา FSM สำหรับ AI ถ้าเป็นเช่นนั้นฉันขอแนะนำให้คุณดูที่ต้นไม้พฤติกรรม AIGameDevมีบทความที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้


1
ตัวอย่างนั้นมีอยู่ในเว็บไซต์ของเขาเช่นกัน: ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon

5

หากเทมเพลต C ++ และเวลาในการรวบรวมนานอาจไม่เป็นปัญหาสำหรับคุณและคุณได้ติดตั้ง Boost เพื่อทำงานกับ :

Boost ตอนนี้มีไลบรารี meta-state-machine ( ความเร็วและขนาด ) ที่มีประสิทธิภาพซึ่งมีข้อได้เปรียบในการให้คุณตั้งค่าตารางการเปลี่ยนแปลงแยกต่างหากจากโครงสร้าง state : คุณมีตารางที่อธิบายว่าเมื่อใดที่จะไปจากสถานะ wich เพื่อแม่มดอื่น ๆ . คุณเพียงแค่ต้องอ่านเพื่อทำความเข้าใจสิ่งที่เกิดขึ้นในเครื่องสถานะ

ข้อดีอีกอย่างคือมันได้รับการทดสอบโดยองค์กรหลายแห่งแม้ในซอฟต์แวร์ฝังตัวที่มีซอฟต์แวร์ประสิทธิภาพสูง เนื่องจากการใช้งานมีอยู่แล้วอาจเป็นทางเลือกที่ดีถ้าคุณต้องการการใช้งานเครื่องรัฐทั่วไปที่ Just Works (tm)

นอกจากนี้ยังสนับสนุนสถานะมุมฉาก (สถานะขนาน) และคุณสมบัติอื่น ๆ ที่มีประโยชน์บนพื้นฐานของ UML

นอกจากนี้ยังมีหลายวิธีในการแสดงตารางการเปลี่ยนแปลงหนึ่งกำลังทดลอง แต่น่าสนใจในด้านการแสดงออก (แม้ว่า จำกัด โดยประสิทธิภาพคอมไพเลอร์ในปัจจุบัน - เลวเกินไป!)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.