ฉันจะนำต้นไม้โต้ตอบไปใช้ในเกมของฉันได้อย่างไร


51

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


2
BOUNTY ใช้สำหรับแนวคิดที่ดีเกี่ยวกับวิธีการจัดการการแปลวลีทริกเกอร์และข้อความ NPC เพื่อให้ NPC สามารถเข้าใจและพูดภาษาต่าง ๆ ได้ขึ้นอยู่กับผู้เล่นที่เริ่มการสนทนา ถึงแม้จะมีวิธีการสร้างแบบบล็อกในgamedev.stackexchange.com/questions/31/ ......มันก็ไม่ควรที่จะมีเหตุผลในคลังข้อความ แต่การแยกพวกมันทำให้เข้าใจรหัสได้ยากขึ้น
Hendrik Brummermann

คำตอบ:


17

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

คุณควรแยกสคริปต์และกล่องโต้ตอบออกจากกันโดยเฉพาะอย่างยิ่งถ้าคุณใส่ RPG ที่มีการสนทนาเป็นตัวชี้วัด จากนั้นคุณสามารถใช้ไลบรารีเช่น simpleXML เพื่ออ่านไฟล์ XML

มีคำถามที่คล้ายกันเกี่ยวกับ SO ด้วยตัวอย่าง: https://stackoverflow.com/questions/372915/game-logic-in-xml-files


+1 สำหรับ XML ดีกว่าการฝังโค้ดเองทำให้สามารถทำการเปลี่ยนแปลงได้โดยไม่ต้องคอมไพล์โค้ดอีกครั้งและเป็นรูปแบบมาตรฐานที่ผู้อ่านที่ทรงพลังบางคนสามารถอ่านได้
AttackHobo

34
XML เป็นเพียงรูปแบบ (และ IMO ซึ่งเป็นรูปแบบที่ไม่ดี) สิ่งที่คำตอบนี้บอกจริงๆคือ "สร้างภาษาโดเมนขนาดเล็กที่มีตรรกะและโฟลว์ขั้นพื้นฐาน แต่ส่วนใหญ่จะประกอบด้วยบทสนทนาของคุณและแยกวิเคราะห์" โดยทั่วไปฉันเห็นด้วยกับคำตอบนี้
Ipsquiggle

5
XML นั้นเป็นเพียงคอนเทนเนอร์เท่านั้นคุณสามารถใช้ (Lua หรือภาษาสคริปต์อื่น ๆ ได้)
LearnCocos2D

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

1
-1 สำหรับ XML ฉันเห็นด้วยกับ @Ipsquiggle และ @BigSandwich
o0 '

20

ฉันจะดูการฝังภาษาสคริปต์เช่น lua หรือ ruby ​​และการโต้ตอบโต้ตอบการเข้ารหัสในนั้น

ดังนั้นสคริปต์โต้ตอบอาจมีลักษณะดังนี้:

switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
    case 1:
        showDialog "And stay gone!"
    case 2:
        if playerHasObject "dog"
            showDialog "Thank you!"
        else
            showDialog "Liar!"

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


1
ฉันชอบที่นี่เพื่อ XML ตรงที่คุณสามารถเพิ่มตรรกะ แต่ฉันจะบอกว่าข้อความนั้นควรอยู่ใน XML มากกว่าในโค้ด (ง่ายต่อการแก้ไขแปลเป็นภาษาอื่น ๆ ฯลฯ )
Iain

หากคุณต้องการการแปลเป็นภาษาท้องถิ่น / แก้ไขได้ง่ายขึ้นคุณสามารถตัดข้อความในฟังก์ชั่นที่เขียนข้อความที่ล้อมรอบไปยังไฟล์แยกเช่นฟังก์ชั่น / แมโคร (QString) / แมโครใน Qt pepper.troll.no/s60prereleases/doc/linguist-hellotr.html
Nailer

อะไรที่ทำให้คุณไม่สามารถใช้คุณสมบัติหรือแท็กพิเศษใน xml เพื่อจำลองตรรกะที่นี่
lathomas64

16

ในเกมสเตนดาห์ลเราใช้เครื่องจักรสถานะ จำกัด เพื่อใช้งาน NPC

แผนภาพต่อไปนี้แสดงให้เห็นเป็นตัวอย่างเล็ก ๆ น้อย ๆ จากวิธีการเขียนเควสกวดวิชา

FSM ที่มีสถานะ IDLE, ATTENDING และ QUEST_OFFERED

ที่จุดเริ่มต้น NPC อยู่ในสถานะว่างและอาจเดินไปรอบ ๆ ผู้เล่นสามารถเริ่มการสนทนาโดยพูดว่า "สวัสดี" และ NPC จะเข้าสู่การเข้าร่วม ในสถานะนี้จะตอบคำถามเกี่ยวกับ "งาน" ของเขาและเสนอเกม "ช่วย" บางเกม ผู้เล่นอาจร้องขอภารกิจและ NPC จะเข้าสู่สถานะ QUEST_OFFERED ที่รอให้ผู้เล่นยอมรับ ("ใช่") หรือปฏิเสธ ("ไม่")

เราได้กำหนดชุดของเงื่อนไขที่สามารถแนบกับช่วงการเปลี่ยนภาพ ยกตัวอย่างเช่นการทำเควสต์อาจทำได้ก็ต่อเมื่อมีPlayerHasItemWithHimConditionเท่านั้น

หลังจากดำเนินการเปลี่ยนภาพ NPC อาจพูดข้อความและ / หรือดำเนินการกระทำ คล้ายกับเงื่อนไขที่เราได้กำหนดชุดการกระทำที่นำกลับมาใช้ใหม่ได้เช่นEquipItemActionซึ่งใช้เพื่อมอบรางวัลภารกิจให้กับผู้เล่น

เงื่อนไขหลาย ๆ สามารถนำมารวมกันโดยใช้AndCondition , OrConditionและNotCondition โดยปกติจะมีการดำเนินการจำนวนมากที่ต้องทำเมื่อทำภารกิจเสร็จสิ้นดังนั้นจึงมีคลาสMultipleActionsเช่นกัน

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


5

คุณสามารถใช้เวลาดูที่Dlgeditเครื่องมือของเครื่องยนต์ RPG มาเปิดAdonthell มันทันสมัยมากและควรมีทุกสิ่งที่คุณต้องการ (รวมถึงแหล่งที่มา)


5

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

ตัวอย่างเช่นคุณอาจมี:

<dialogue id="101" condition="!npc.carsFixed">
  <message>Localize.FixMyCar</message>
  <choices>
    <choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.Sure">
      <command>hero.carFixingSkills += 1</command>
      <command>npc.carFixed = true</command>
      <command>hero.playSmokeAnimation()</command>
      <command>nextDialogue = 104</command>
    </choice>
    <choice condition="hero.carFixingSkill <= 5" id="Localize.CantFix">
      <command>nextDialogue = 105</command>
    </choice>
    <choice id="Localize.FixYourself">
      <command>npc.likesHero -= 1</command>
    </choice>
  </choices>
</dialogue>

จากนั้นคุณจะต้องมีเครื่องมือแสดงข้อความเควสแทน "Localize.FixMyCar" ด้วยข้อความที่แปลอย่างเหมาะสม

เครื่องมือของคุณจะแสดงสิ่งที่โปรแกรมเล่นจะเห็นในภาษาที่เลือกได้พร้อมกับ XML ดิบที่แก้ไขได้

ในทำนองเดียวกันคุณสามารถใช้สิ่งนี้จากตัวอย่างที่คุณอ้างอิง :

npc.add(ConversationStates.ATTENDING,
        ConversationPhrases.QUEST_MESSAGES, 
        null,
        ConversationStates.QUEST_OFFERED, 
        Localization[ "BringMeABeer" ],
        null);

หากคีย์ของคุณมีความหมายเพียงพอที่จะไม่มีข้อความที่สมบูรณ์ควรเป็นปัญหา

สิ่งนี้จะเป็นประโยชน์เช่นกัน:

Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];

4

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

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


1
มันคือลัวะไม่ใช่ลัวะ :)
RCIX

2
ฉันทำเพื่อคุณผู้ชายเท่านั้น ;)
David McGraw

4

หากคุณใช้ XML ตรวจสอบให้แน่ใจว่าคุณได้สร้างเครื่องมือขนาดเล็กเพื่อแก้ไขไฟล์ XML คุณจะบ้าไปแล้วอย่างอื่น


หากไม่มีเครื่องมือในการแก้ไขมันก็ไม่มีประโยชน์ที่จะใช้มันในตอนแรก: สร้างรูปแบบของคุณเองเช่นกัน!
o0 '

3

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


1

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


1

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


0

หุ่นยนต์ง่าย ๆ อาจทำได้:

(dialogueline_id, condition) -> (next_id, response)

อาจมีลักษณะเช่นนี้:

(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")

ในเกมคุณจะพบ id และพยายามจับคู่ id และเงื่อนไข

คุณต้องสร้างแบบจำลองเงื่อนไขและการกระทำ ตามวัตถุตัวชี้ฟังก์ชัน XML ...

โปรแกรมแก้ไขบทสนทนาที่ดีก็มีประโยชน์เช่นกัน

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