วิธีที่ดีที่สุดในการจัดการกิจกรรมในเกม?


13

ฉันทำงานในเกมที่มีกิจกรรมในเกมบางอย่างที่ต้องเกิดขึ้นเป็นครั้งคราว ตัวอย่างที่ดีน่าจะเป็นการสอน คุณเริ่มเกมและมีหลายเหตุการณ์ในเกมที่เกิดขึ้น:

  • คุณพบศัตรูคนแรกเกมหยุดและคุณได้รับคำอธิบายเกี่ยวกับวิธีฆ่ามัน
  • คุณฆ่าศัตรูคนแรกคุณได้รับข้อความ "ดีมาก"
  • คุณได้รับไอเท็มใหม่เมนูพร้อมป๊อปอัพไอเท็มสถิติ
  • ฯลฯ

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

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

เพียงเพื่อความชัดเจนฉันไม่ได้มองหาภาษาการเขียนโปรแกรมที่ดีที่สุดหรือภาษาสคริปต์ในการทำสิ่งนี้ แต่ยังมีวิธีการที่ดีที่สุดในการจัดการสิ่งนี้

ขอบคุณ!


แก้ไข: ตัวอย่างที่สองเนื่องจากคำถามของฉันค่อนข้างเข้าใจยาก:

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


8
อย่าพยายามที่จะทำให้สิ่งต่าง ๆ มากเกินไปตัวอย่างเช่นแบบฝึกหัดที่เฉพาะเจาะจงมากและมาพร้อมกับทริกเกอร์ / เหตุการณ์ต่าง ๆ มากมาย ไม่มีอะไรผิดปกติกับการเข้ารหัส / สคริปต์
Maik Semder

1
@Maik ถ้าคุณใส่เข้าไปในคำตอบ Id +1 มัน .. ง่ายและแก้ไขได้ดีกว่าสวยทุกวัน
James

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

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

คุณต้องการอะไร? คุณต้องการหยุดการกระทำชั่วคราวและทำสิ่งเพิ่มเติมจากนั้นเลิกหยุดการกระทำชั่วคราวหรือไม่
user712092

คำตอบ:


7

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

โดยรวมถึงแม้ว่ามันจะขึ้นอยู่กับความซับซ้อนของการกวดวิชาของคุณถ้ามันน่ากังวลเกี่ยวกับเรื่องนี้ การเขียนโค้ดเหตุการณ์ในโค้ดและ / หรือระดับของคุณอย่างยากลำบากดูเหมือนจะไม่เป็นเรื่องใหญ่สำหรับฉันเพียงแค่ป๊อปอัปบทแนะนำจำนวนหนึ่ง ฉันอยากรู้ว่าสิ่งที่คุณมีอยู่ในใจที่ทำให้คุณคิดว่ามันจะไม่มีประสิทธิภาพเนื่องจากสิ่งที่คุณควรจะทำทุกทริกเกอร์เป็นเพียงการส่งข้อความไปยังโมดูลการกวดวิชาเช่น TutorialModule.show ("1st_kill");


ฉันคิดว่าเนื่องจากมันเป็นเกมไขปริศนาตรรกะของเขาอยู่ในสถานที่เดียวสำหรับหลายระดับและเช่นนั้นการตรวจสอบสำหรับเราควรทำแบบฝึกหัดสำหรับสิ่งนี้เป็นสิ่งที่กินเวลานาน สุจริตถ้ามันเป็นเกมตัวต่อฉันไม่คิดว่ามันจะเป็นเกมที่ฮิตมากแม้ว่ามันจะไม่ใช่รหัสที่สวยที่สุดและในตอนท้ายของรหัสวันที่ทำงานในเกมที่มีเรืออยู่เสมอ - เสมอ - ดีกว่าโค้ดสวย ๆ 100% ที่ไม่เคยเห็นแสงแห่งวัน)
James

ไม่เคยนึกถึงบางสิ่งเช่นลวดลายผู้สังเกตการณ์ฟังดูเหมือนเป็นคำตอบที่ดี ฉันจะลองดูสิขอบคุณ :)
omgnoseat

7

นี่คือข้อ จำกัด การออกแบบที่ฉันเข้าใจพวกเขา:

  1. รหัสการเล่นเกมหลักไม่สนใจความต้องการระดับและไม่ควรใช้ควบคู่กับรหัสที่เกี่ยวข้องกับพวกเขา

  2. ในขณะเดียวกันมันเป็นรหัสการเล่นเกมหลักที่รู้ว่าเหตุการณ์ใดที่ตรงตามข้อกำหนดเหล่านั้นเกิดขึ้น (รับไอเท็มฆ่าศัตรู ฯลฯ )

  3. ระดับที่ต่างกันมีข้อกำหนดที่แตกต่างกันและสิ่งเหล่านั้นจำเป็นต้องอธิบายที่ไหนสักแห่ง

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

อ้างอิงรหัสการเล่นเกมหลักกับวัตถุระดับปัจจุบัน เมื่อมีเหตุการณ์เกิดขึ้นการเล่นเกมก็จะบอกระดับโดยการเรียกวิธีการที่มัน: enemyKilled, itemPickedUpฯลฯ

ภายในLevelต้องการบางสิ่ง:

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

เมื่อคุณเข้าสู่ด่านหนึ่งคุณจะสร้าง a Levelด้วยรหัสที่ถูกต้องLevelRequirementตั้งค่ารหัสเกมและให้ระดับนั้น

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

LevelRequirement โดยทั่วไปต้องการสองสิ่ง:

  1. คำอธิบายของการทดสอบเพื่อบอกว่าเป็นไปตามข้อกำหนดหรือไม่ นี่เป็นเพียงฟังก์ชั่นหากภาษาของคุณทำให้ง่ายมิฉะนั้นคุณสามารถสร้างแบบจำลองในข้อมูล (เช่นมีRequirementTypeenum กับสิ่งที่ชอบFIRST_KILLแล้วใหญ่switchบนที่รู้วิธีการตรวจสอบแต่ละชนิด)
  2. การกระทำที่จะดำเนินการเมื่อตรงตามข้อกำหนด

ยังมีคำถามว่าชุดข้อกำหนดเหล่านั้นถูกอธิบายไว้อย่างไร คุณสามารถทำอะไรเช่น XML หรือรูปแบบไฟล์ข้อความอื่น มีประโยชน์ถ้า:

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

หากไม่มีสิ่งเหล่านี้ฉันก็อาจสร้างมันโดยตรงในรหัส ง่ายกว่าดีกว่าเสมอ


3 คะแนนแรกเป็นคำอธิบายที่ใกล้เคียงกับวิธีที่ฉันใช้ตอนนี้น่าประทับใจมาก! ใช่สิ่งที่ฉันกำลังดิ้นรนกับที่สุดคือสถานที่ที่จะอธิบายความต้องการและวิธีการแปลเกม (เพราะมันอาจจะเป็นสิ่งภายนอก) ขอบคุณสำหรับคำอธิบายในเชิงลึก :)
omgnoseat

5

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

สิ่งที่คุณต้องการคือการรับรู้เหตุการณ์ที่เกิดขึ้น (1) จากนั้นทำการกระทำบางอย่างที่เหตุการณ์เหล่านี้ต้องการ (พิมพ์ข้อความตรวจสอบ keypress ... ) (2) คุณต้องการทำให้เหตุการณ์เหล่านี้เกิดขึ้นเพียงครั้งเดียว (3)

โดยทั่วไปคุณต้องการตรวจสอบเงื่อนไขแล้วกำหนดพฤติกรรมบางอย่าง

วิธีจดจำเหตุการณ์ (1)

  • คุณต้องการรับรู้เหตุการณ์เช่น "ศัตรูคนแรกที่พบ", "รับไอเท็มใหม่"
  • หากส่วนทั่วไปเกิดขึ้น " พบศัตรู ", " รับไอเท็ม " คุณตรวจสอบชิ้นส่วนเฉพาะ " ก่อน ... ", " รับไอเท็มใหม่ "

เหตุการณ์ที่ทำคืออะไร

ในมุมมองที่กว้างขึ้นแต่ละเหตุการณ์นั้นทำจาก:

  • เงื่อนไขเบื้องต้นคุณตรวจสอบพวกเขา
  • การกระทำที่จะกระทำเมื่อมีเงื่อนไขเบื้องต้น (พูดว่า "" คุณสังหารศัตรูคนแรก! "พูด" "ทำคอมโบโดยกดปุ่ม A และ B" พูดว่า "กด" Enter "เพื่อดำเนินการต่อ" ต้องใช้คีย์ "Enter")

วิธีเก็บเหตุการณ์เหล่านี้

ในโครงสร้างข้อมูลบางส่วน:

  • มีรายการเงื่อนไขเบื้องต้น (สตริงหรือรหัสหากคุณกำลังเขียนในภาษาระดับสูงบางอย่าง)
  • มีรายการการกระทำ (อาจเป็นสตริง Quake เอ็นจินใช้สตริงสำหรับเหตุการณ์)

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

จากนั้นคุณต้องแยกวิเคราะห์สตริง / สิ่งเหล่านี้ หรือคุณสามารถใช้ภาษาสคริปต์บางอย่างเช่น Python หรือ LUA หรือภาษาเช่น LISP พวกเขาทั้งหมดสามารถแยกวิเคราะห์และดำเนินการเพื่อคุณ :)

วิธีใช้เหตุการณ์เหล่านี้ในเกมวน (2)

คุณจะต้องการโครงสร้างข้อมูลทั้งสองนี้:

  • คิวของเหตุการณ์ (เหตุการณ์ที่กำหนดไว้ให้เรียกใช้จะอยู่ที่นี่)
  • คิวของการกระทำ (การกระทำที่กำหนดไว้เหตุการณ์หมายถึงการกระทำที่จะทำ)

ขั้นตอนวิธีการ:

  • ถ้าคุณรู้จักบางเหตุการณ์ของปัจจัยพื้นฐานจะได้พบกับคุณทำให้เขาเข้าไปในคิวงาน
  • (3) จากนั้นคุณควรตรวจสอบให้แน่ใจว่าเหตุการณ์นี้เกิดขึ้นเพียงครั้งเดียวหากคุณต้องการ :) (ตัวอย่างเช่นอาเรย์บูลีน has_this_event_happened ["ศัตรูตัวแรกเจอ"])
  • (หากคิวการกระทำว่างเปล่าจากนั้น) หากมีเหตุการณ์ในคิวเหตุการณ์คุณใส่การกระทำของเขาลงในคิวการดำเนินการและลบเขาออกจากคิวเหตุการณ์
  • หากมีการดำเนินการในคิวการดำเนินการคุณเริ่มทำสิ่งที่ต้องการโดยมัน
  • หากการกระทำดังกล่าวเสร็จสิ้นคุณลบมันออกจากคิวการดำเนินการ

วิธีทำสิ่งเหล่านี้เอง (2)

คุณสร้างรายการของวัตถุซึ่งมีฟังก์ชั่น "อัพเดท" บางครั้งพวกเขาจะเรียกเอนทิตี (ใน Quake engine) หรือนักแสดง (ใน Unreal engine)

  1. คุณเริ่มวัตถุเหล่านี้เมื่อพวกเขาถูกขอให้เริ่มในคิวการดำเนินการ
  2. วัตถุเหล่านี้สามารถใช้สำหรับสิ่งอื่น ๆ เช่นตัวจับเวลาอื่น ๆ ใน Quake หน่วยงานเหล่านี้จะใช้สำหรับตรรกะเกมทั้งหมดผมขอแนะนำให้คุณอ่านวัสดุบางอย่างเกี่ยวกับมัน

การกระทำ "พูดอะไรบางอย่าง"

  1. คุณพิมพ์บางอย่างบนหน้าจอ
  2. คุณต้องการให้ข้อความนี้ปรากฏขึ้นสองสามวินาที
  3. ใน "อัปเดต":
    • ทำให้ตัวแปร remove_me_after และลดลงตามเวลาที่ผ่านไป
    • เมื่อตัวแปรคือ 0 คุณลบการกระทำนี้ออกจากคิวการกระทำ
    • คุณลบวัตถุนี้ (หรือกำหนดเวลาให้ลบ ... )

การทำงาน "ต้องมีคีย์"

  1. มันขึ้นอยู่กับว่าคุณต้องการสร้างมัน แต่ฉันคิดว่าคุณส่งข้อความ
  2. ใน "อัปเดต" ":
    • คุณเพียงแค่ตรวจสอบเหตุการณ์ปุ่มกดที่ต้องการ
    • คุณอาจต้องการแถวลำดับ / คิวเพื่อพักเหตุการณ์ปุ่มกด
    • จากนั้นคุณสามารถลบออกจากคิวการดำเนินการและลบวัตถุ

วิธีการเรียนรู้อะไร


-1 ขวาหรือเขาเพียงแค่เรียกฟังก์ชั่นอย่างจริงจัง OP เพียงแค่ต้องการที่กล่องข้อความเมื่อเงื่อนไขบางอย่างจะพบ
Maik Semder

นั่นเป็นบทความที่ดีมาก แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันมีเวลายากที่จะอธิบายสิ่งที่ฉันต้องการ ฉันได้เพิ่มคำอธิบายที่สอง: ปัญหาที่ฉันมีคือการเพิ่มการกระทำบางอย่างในเกมในขั้นตอนที่ค่อนข้างเหมือนกันเสมอ เช่นเดียวกับการต่อสู้สวมบทบาท RPG ทุกคนมีเทิร์นเลือกทักษะและอื่น ๆ - มันเหมือนเดิมเสมอ แต่จะเกิดอะไรขึ้นถ้ามีกรณีที่ฉันจะแสดงฉากตัดในที่ระหว่างนั้น การปรับโครงสร้างของเกมทั้งหมดให้ผ่านไปในคลาสการต่อสู้ที่เปลี่ยนแปลงไปด้วยความน่ารักที่มีอยู่นั้นดูไม่มีประสิทธิภาพ ฉันสงสัยว่าจะทำเช่นนี้ได้อย่างไร
omgnoseat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.