การเขียนโปรแกรมกิจกรรมเรื่องราวของเกม


28

ฉันได้พัฒนาโปรแกรมเกมใน c / c ++ และ DirectX

ฉันมีเอนจินแบบเรียงต่อกันสำหรับแผนที่ผู้เล่นแบบเคลื่อนไหว / สไปรต์ NPC พูดคุยกับ npc เมนูและการเปลี่ยนระดับ แต่ไม่มีเกมมันแค่รู้สึกว่างเปล่า

ฉันได้ดูรอบ ๆ และได้ยินคำตอบ buzzword แต่ฉันต้องการทราบวิธีการใช้เรื่องราวในเกมของฉัน

บางคนได้กล่าวว่าไฟล์บันทึกที่มีธงกำกับดูแลทุกการกระทำ / สถานะที่เป็นไปได้ที่มีอยู่ในเกม แต่ฟังดูน่าหัวเราะ

มันค่อนข้างทะเยอทะยานเล็กน้อย แต่ฉันตั้งเป้าที่จะเล่นเกมอย่าง Pokemon / Final Fantasy ที่เก่ากว่า

มีใครรู้หรือไม่ว่าเกมเหล่านี้ทำงานอย่างไรหรือใช้ทฤษฎีอย่างไร

ฉันกำลังมองหาอยู่พักหนึ่งและจะซาบซึ้งกับทุกคนที่เข้ามา

คำตอบ:


19

เรื่องราวของเกมของคุณน่าจะอยู่ในรูปแบบของออโตเมติก จำกัด (หรือ FSA แบบขยาย) เมื่อเหตุการณ์บางอย่างเกิดขึ้นคุณควรย้ายไปที่สถานะใหม่ วิธีนี้คุณจะต้องเก็บสถานะปัจจุบันเท่านั้นและข้อมูลอะไรก็ตามที่จำเป็นต้องรู้เพื่อย้ายตำแหน่งต่อไปใน FSA (พร้อมด้วยรายละเอียดผู้เล่นเช่นตำแหน่งสุขภาพ ฯลฯ )

ตัวอย่างเช่นถ้าเราให้ความสำคัญกับเกมโปเกม่อนมากเกินไปป้ายยิมนั้นเป็นสาขาหลักของ FSA คุณเริ่มต้นในสถานะ 0 โดยที่คุณไม่มีตราสัญลักษณ์และเมื่อคุณเอาชนะหัวหน้าโรงยิมคุณต้องย้ายผ่านรัฐไปยังสถานะ 1 ถึงสถานะ 2 ฯลฯ เพื่อให้เอนทิตีเกมของคุณอัปเดตเป็นสถานะปัจจุบันคุณจะต้องได้รับเท่านั้น พวกเขาเพื่อดูสถานะปัจจุบัน ตัวอย่างเช่น NPC ที่อยู่นอกโรงยิมที่ 3 จะตรวจสอบว่าคุณอยู่ในสถานะใดดูว่าคุณอยู่ในสถานะที่สอดคล้องกับการมี 3 ตราและตอบสนองตามนั้น (อาจมี "ทำได้ดีมาก!")

คุณไม่จำเป็นต้องเก็บสถานะของทุกสิ่งในโลก เพียงแค่สถานะของเรื่องราว เอนทิตีเองรู้วิธีการตอบสนองขึ้นอยู่กับสถานะปัจจุบัน


วิธีการที่น่าสนใจและฉันชอบมันจะต้องลองดู แต่คุณจะติดตามเควสด้านที่ไม่ได้ขึ้นอยู่กับความก้าวหน้าของเรื่องราวได้อย่างไร

มันขึ้นอยู่กับความซับซ้อนของเรื่องราวของคุณ อาจเป็นเรื่องง่ายที่สุดที่จะมี FSA หลายรายการ (หนึ่งรายการสำหรับแต่ละ substory) หรือคุณอาจต้องมีการแยกย่อยที่ซับซ้อน คุณต้องนั่งลงและวาดเรื่องราวของคุณเป็นแผนงาน เมื่อคุณเข้าใจว่าทุกอย่างเกี่ยวพันกันอย่างไรให้คิดว่าคุณสามารถเก็บสถานะปัจจุบันได้อย่างไร (หรือระบุว่าสามารถเก็บได้มากกว่าหนึ่งรายการในเวลาเดียวกัน) บางสิ่งจะต้องจัดเก็บแยกต่างหากเช่นตำแหน่งของ NPC (หากคุณต้องการให้บันทึก) และความสมบูรณ์ของอักขระบางตัวเพราะสิ่งเหล่านี้ไม่ได้ขึ้นอยู่กับเรื่องราว

FSA นี้ที่คุณพูดถึงฉันจะหาคำอธิบายเกี่ยวกับเรื่องนี้ได้ง่ายกว่าที่ใดและไม่มีทฤษฎีอื่นที่เชื่อมโยงกัน
Skeith

คุณสามารถเรียนรู้เกี่ยวกับเครื่องจักรของรัฐได้ทุกที่ แต่ 99.9% ของเวลาที่มันจะไม่พูดถึงเกม หนังสือเบื้องต้นเกี่ยวกับการคำนวณจะสอนคุณเกี่ยวกับพวกเขา แต่คุณไม่ต้องการรายละเอียดมากนัก คุณเพียงแค่ต้องเข้าใจแนวคิดของการอยู่ในรัฐและย้ายไปมาระหว่างพวกเขาเมื่อเหตุการณ์บางอย่างเกิดขึ้น @ pwny การตอบสนองเป็นเพียงการพูดในสิ่งที่แตกต่างกัน การอ่านเกี่ยวกับ FSAs จะเป็นวิธีที่ยอดเยี่ยมในการเรียนรู้แนวคิดของกลไกของรัฐ เพียง Google สำหรับการแนะนำให้รู้จักกับเครื่องจักรของรัฐ!
Joseph Mansfield

7

คุณสามารถใช้ชุดสถานะที่เป็นไปได้ที่เกมของคุณใช้อยู่ NPC ของคุณและโลกของคุณจะรับรู้สถานะเหล่านั้นและตอบสนอง / แสดงผลตามนั้น คุณอาจต้องการกำหนดชุดของทริกเกอร์ที่จะเปิดใช้งานโดยการกระทำ / เหตุการณ์บางอย่าง

ตัวอย่างเช่นการตีฝ่ายตรงข้ามบางอย่างจะเปิดใช้งานทริกเกอร์ A ซึ่งจะเพิ่ม state S ให้กับโลกของคุณและในสถานะ S ตัวละครของคุณจะถูกไฟฟ้าดูดเมื่อมันเดินออกจากที่ซ่อนของฝ่ายตรงข้าม หรือฝนตกข้างนอก หรือคุณหาขนมหายาก คุณได้รับคะแนน

ด้วยการเพิ่มเติมสองอย่างง่ายๆในเกมของคุณคุณสามารถทำให้มันเป็น "ชีวิต" ได้อีกมาก

ตรวจสอบให้แน่ใจว่าคุณสร้างพื้นหลังที่หลากหลายสำหรับโลกของคุณตัวละครและเรื่องราวและตรวจสอบให้แน่ใจว่าเกมนั้นสอดคล้องกับพื้นหลังนั้น วางแผนเรื่องราวของคุณก่อน

ลองGamedev ด้วย


เป็นไปได้ แต่ฉันแน่ใจว่าผู้เชี่ยวชาญมีดีขึ้นเป็นสิ่งที่คุณ sujest entails booleans และ ints หลายแสน (ฉันได้ลอง) ฉันไม่เห็นว่ามันเป็นวิธีการที่สมจริงในเกมขนาดใหญ่ ขอบคุณสำหรับลิงค์

ไม่จำเป็นต้องจินตนาการถึง 5 รัฐ superposable อิสระ คุณจะได้รับ 32 สาขาที่เป็นไปได้ 5 บูลีน ฉันคิดว่ามันสมเหตุสมผล นอกจากนี้ยังมีการใช้ระบบทริกเกอร์ในเกมระดับมืออาชีพโดยเฉพาะอย่างยิ่งเนื่องจากคุณสามารถใช้พฤติกรรมสคริปต์โดยใช้ชุดทริกเกอร์
pwny

2

ดังที่ได้กล่าวถึง sftrabbit นี่เป็นแอปพลิเคชั่นที่สมบูรณ์แบบสำหรับเครื่องสถานะ

โดยพื้นฐานแล้วคุณจะมีโครงสร้างแบบต้นไม้ leaf / node แต่ละใบมีข้อมูลเกี่ยวกับสถานะปัจจุบันและกฎสำหรับการดำเนินการไปยังสถานะถัดไป แต่ละโหนดอาจมีหลายทางออกขึ้นอยู่กับความซับซ้อนที่คุณต้องการให้พล็อต / การเล่นของคุณไหล

อนาล็อกที่ดีและหลวมมากสำหรับสิ่งนี้คือ หนังสือเล่ม Choose Your Adventure Adventure แต่ละหน้ามีข้อความอธิบายส่วนหนึ่งของเรื่องราวและการตัดสินใจที่ผู้เล่นสามารถทำได้ การตัดสินใจแต่ละครั้งนำไปสู่หน้าอื่น บางหน้าอาจลิงค์กลับไปยังหน้าที่เคยเยี่ยมชม ฯลฯ

เกมผจญภัยแบบข้อความเก่า ๆ เช่นZorkและLeather Goddesses of Phobosและเกม Sierra * Quest ที่น่าอับอาย ( SpaceQuest นำแสดงโดย Roger Wilco ภารโรงอวกาศเป็นหนึ่งในรายการโปรดของฉัน ) ใช้รุ่นที่ง่ายมากของระบบประเภทนี้ ห้องพักแต่ละห้องในแผนที่เป็นรัฐโดยมีทางออกที่เชื่อมโยงกับรัฐหรือห้องอื่น ๆ การรับไอเท็มตั้งค่าแฟล็กในอ็อบเจ็กต์สถานะโกลบอล แต่ละห้องจะตรวจสอบธงเหล่านั้นเพื่อพิจารณาว่ามีตัวละครหรือรายการใดบ้างในแต่ละห้อง

ดังนั้นรัฐของคุณอาจถูกนำมาใช้เป็นคลาสหรือ struct โดยแต่ละคุณสมบัติมี:

รายการสินทรัพย์ - รายการของตัวชี้ไปยังกราฟิกพื้นหลังและสิ่งอื่นที่คุณต้องการแสดงห้อง / รัฐ / ระดับ

เงื่อนไขการเข้า - ความสำเร็จที่ต้องมีเพื่อเข้าสู่ระดับ

ออก - ลิงก์ไปยังทางออก "ถัดไป" ที่เป็นไปได้ เหนือ, ใต้, ตะวันออกและตะวันตกเป็นตัวอย่างของสิ่งนี้ แต่คุณอาจรวมถึงประตู 1, เทเลพอร์ต, ฯลฯ เมื่อพยายามออกจากห้องหรือการกำหนดทางออก / ประตูคือ "เปิด" เกมของคุณสามารถตรวจสอบสถานะต่อไปได้ เพื่อดูว่าเป็นไปตามเงื่อนไขของรายการหรือไม่และเปลี่ยนวิธีการแสดงทางออกบนหน้าจอหรือไม่อนุญาตให้ผู้เล่นเคลื่อนที่ไปในทิศทางนั้น

หากคุณต้องการได้รับแฟนซีคุณสามารถรวมรุ่นของรัฐที่แตกต่างกันด้วยเงื่อนไขการเข้าที่แตกต่างกันซึ่งจะเปลี่ยนวิธีที่ห้องแสดงต่อผู้เล่นหรือการกระทำที่มีอยู่ในห้องนั้น

หน้าจอเริ่มต้นของคุณความตาย / เกมบนหน้าจอ ฯลฯ อาจเป็นสถานะภายในระบบเช่นเดียวกับวิธีที่คุณอาจนำทางระหว่างหน้าจอเมนู ความจริงแล้วถ้าคุณมีระบบเมนูแบบนี้คุณสามารถใช้มันเพื่อสิ่งนี้ได้ แทนที่จะเป็นลูกศรขึ้น / ลงและ "ป้อน" เพื่อนำทางเมนูคุณจะมองหาเหตุการณ์เฉพาะภายในพื้นที่เล่นเกมเช่นการก้าวขึ้นไปบนแผ่นเทเลพอร์ตเคลื่อนย้ายออกจากด้านขวาของหน้าจอ ฯลฯ

จากมุมมองของผู้ดูแลระบบพิจารณาว่าคุณจะได้รับประโยชน์จากการสร้างเครื่องมือการดูแลระบบที่จะช่วยให้คุณสร้างเครื่องสถานะได้หรือไม่ เพิ่มห้องพักลงในแผนที่สร้างลิงก์ระหว่างพวกเขากำหนดเนื้อหาเช่นภาพพื้นหลังและอื่น ๆ นี่อาจเป็นเรื่องที่เกินความจำเป็นสำหรับความพยายามครั้งแรกของคุณ มันง่ายเกินไปที่จะถูกดูดซับในการสร้างเครื่องมือผู้ดูแลระบบและไม่เคยจบเกมจริงๆ จำไว้ว่า - คุณไม่ได้เขียนมิดเดิลแวร์ แต่เป็นเกม

หวังว่านี่จะช่วยได้


fot ตัวอย่างนี้จินตนาการถึงเมือง ฉันมีไฟล์ที่เก็บเลย์เอาต์กระเบื้องรวมถึงกราฟิกและขนาดรายการของ npc และสิ่งทั่วไปเช่นนั้น โดยการเพิ่มไฟล์จะมีการเพิ่มเมืองแคมใหม่ลงในเกมเพื่อให้ผู้อื่นมีส่วนร่วมหรือเป็นแผน แต่ไฟล์นั้นค่อนข้างเต็มและซับซ้อน ถ้าฉันเข้าใจคุณฉันจะวางเหตุการณ์ที่สามารถเกิดขึ้นในเมืองดังกล่าวในไฟล์นี้ด้วยธงเพื่อติดตามความคืบหน้า?
Skeith

@Skeith ใช่ฟังดูเหมือนเป็นวิธีที่สมเหตุสมผล
3Dave

0

ผมเคยใช้เครื่องเกมนี้เรียกว่าหมิ่น เล่นกับสิ่งนั้นและดูว่ามันจัดการกับเหตุการณ์ได้อย่างไรฉันชอบมันมาก มันเป็นโอเพ่นซอร์สด้วยดังนั้นคุณจะเห็นได้ว่าพวกมันใช้งานได้อย่างไรที่นี่นี่นี่คือคำอธิบายสั้น ๆ

แต่ละแผนที่มีเลเยอร์ที่หลากหลาย เลเยอร์กราฟิกซึ่งอาจมีหลาย ชั้นอุดตัน แล้วก็มีเลเยอร์โซน เลเยอร์โซนคือสิ่งที่สำคัญที่นี่ *

แต่ละแผ่นมีหมายเลขเพื่อระบุโซนที่มันเป็นส่วนหนึ่งของ แต่ละโซนสามารถเปิดใช้งานได้สองวิธีพื้นฐาน อาจจะเปิดใช้งานโซนเมื่อผู้เล่นเข้ามาหรือมีสิ่งที่เรียกว่าการเปิดใช้งานที่อยู่ติดกัน การเปิดใช้งานที่อยู่ติดกันหมายความว่าเมื่อผู้เล่นยืนอยู่ติดกับไทล์ของโซนใดโซนหนึ่งและกดคีย์ที่ระบุเป็นคีย์การเปิดใช้งานโซนนั้นจะเปิดใช้งาน

จะเกิดอะไรขึ้นเมื่อเปิดใช้งานโซนคือเรียกใช้ฟังก์ชันจากสคริปต์ ดังนั้นคุณต้องฝังภาษาสคริปต์บางอย่าง VERGE มีภาษาของตัวเองที่เรียกว่า VergeC และยังช่วยให้ lua ตัวฉันเองชอบใช้หลาม

เมื่อคุณได้รับอุปสรรค์นี้คุณมีพลังมหาศาลในการเขียนสคริปต์เหตุการณ์ คุณมีภาษาการเขียนโปรแกรมเต็มรูปแบบที่คุณสามารถจัดเก็บและดำเนินการกับข้อมูลเช่นสถิติผู้เล่น, ธงเรื่องราว, ฯลฯ ...

* นอกจากนี้ยังมีเลเยอร์เอนทิตี เอนทิตีทำหน้าที่เหมือนโซนเปิดใช้งานที่อยู่ติดกับมือถือ


ฟังดูเหมือนระบบที่ใช้ในซีรีย์เกม rpg แต่ถ้าหากไทล์นั้นมี 5 เหตุการณ์ที่แตกต่างกันไปตามเรื่องราวของคุณ
Skeith

@Skeith มันไม่สามารถ ไทล์แต่ละอันมีหนึ่งโซนที่เกี่ยวข้องเท่านั้น และแต่ละโซนมีเพียงหนึ่งฟังก์ชันสคริปต์ที่เรียกใช้ แต่นั่นไม่ใช่ปัญหา จำไว้ว่าคุณมีภาษาการเขียนโปรแกรมที่สมบูรณ์ที่นี่ ข้อมูลเกี่ยวกับเรื่องราวที่คุณเก็บไว้ในตัวแปร (หรือหลายรายการ) ดังนั้นการตัดสินใจว่าจะทำอย่างไรเป็นเรื่องง่าย ๆ ในการทดสอบตัวแปรนั้นในสคริปต์และดำเนินการตามความเหมาะสมโดยพิจารณาจากคุณค่าของมัน
Benjamin Lindley

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