मैं अपने गेम में डायलॉग ट्री कैसे लागू कर सकता हूं?


51

मेरे खेल में संवाद पेड़ प्रणाली को लागू करने का सबसे अच्छा तरीका क्या है? मैं एक एनपीसी चाहता हूं कि खिलाड़ी को प्रतिक्रियाओं के अलग-अलग सेट दिए जाएं, कुछ जो केवल तब दिखाई दे सकते हैं जब खिलाड़ी के पास कोई आइटम या पिछली घटना हुई हो।


2
BOUNTY विशेष रूप से ट्रिगर वाक्यांशों और NPC पाठ के अनुवाद को संभालने के अच्छे विचारों के लिए है। ताकि एनपीसी बातचीत शुरू करने वाले खिलाड़ी के आधार पर विभिन्न भाषाओं को समझ और बोल सके। यहां तक ​​कि gamedev.stackexchange.com/questions/31/… में बिल्डिंग ब्लॉक के दृष्टिकोण के साथ पाठ रिपॉजिटरी के अंदर तर्क होना एक अच्छा विचार नहीं है। लेकिन उन्हें विभाजित करने से कोड को समझना बहुत मुश्किल हो जाता है।
हेंड्रिक ब्रम्मनमैन

जवाबों:


17

एक्सएमएल का उपयोग करते हुए डायलॉग ट्रीज़ किया जाना चाहिए। यदि आप कुछ अधिक जटिल करने की आवश्यकता है, तो आप स्क्रिप्ट की फ़ाइल के संदर्भ में नेस्टेड पेड़ों में प्रतिक्रियाओं और प्रतिक्रिया के लिए शर्तों को संग्रहीत करते हैं।

आपको स्क्रिप्ट और संवाद को अलग रखना चाहिए, खासकर यदि आप एक आरपीजी डाल रहे हैं जिसमें एक मीट्रिक टन वार्तालाप है। फिर आप XML फ़ाइल को पढ़ने के लिए simpleXML जैसी लाइब्रेरी का उपयोग कर सकते हैं।

उदाहरण के साथ SO पर एक समान प्रश्न है: https://stackoverflow.com/questions/372915/game-logic-in-xml-files


XML के लिए +1। कोड में ही एम्बेड करने से बेहतर है, कोड को फिर से जमा किए बिना परिवर्तनों की अनुमति देता है, और एक मानक प्रारूप है जिसे कुछ शक्तिशाली संपादकों द्वारा पढ़ा जा सकता है।
अटैकिंगहोबो

34
XML सिर्फ एक प्रारूप है (और, IMO, एक बुरा)। वास्तव में यह उत्तर क्या कहता है, "एक छोटी डोमेन भाषा बनाएं जिसमें मूल तर्क और प्रवाह शामिल हैं, लेकिन मुख्य रूप से आपके संवाद शामिल हैं, और इसे पार्स करते हैं।" उस सामान्य तरीके से, मैं इस जवाब से सहमत हूं।
Ipsquiggle

5
वास्तव में, एक्सएमएल सिर्फ कंटेनर है, आप बस (और निश्चित रूप से अधिक मानवीय-पठनीय और मानव-संपादन योग्य) लुआ या अन्य स्क्रिप्टिंग भाषाओं का उपयोग करके इसे लागू कर सकते हैं।
LearnCocos2D

4
एक्सएमएल पार्स करने के लिए महंगा है और स्मृति का एक बहुत कुछ लेता है। भंडारण प्रारूप के रूप में इसका उपयोग करना ठीक है, लेकिन मैं उपयोगिता लिखूंगा जो संवाद पेड़ को बाइनरी प्रारूप में परिवर्तित करता है जो रनटाइम पर उपयोग किया जाता है। यदि आपका पीसी पर है और अपने मेमोरी उपयोग के बारे में परवाह नहीं है तो यह ठीक हो सकता है, लेकिन किसी अन्य प्लेटफॉर्म पर मेमोरी कॉस्ट आपको परेशान कर देगा।
बिगसैन्डविच

1
एक्सएमएल के लिए -1। मैं @Ipsquiggle और @BigSandwich
'से

20

मैं एक स्क्रिप्टिंग भाषा जैसे कि लुआ या रूबी और कोडिंग डायलॉग इंटरैक्शन को एम्बेड करूंगा।

इस प्रकार एक संवाद स्क्रिप्ट की तरह लग सकता है:

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 में ही होना चाहिए। (अन्य भाषाओं आदि के लिए संपादित करना, स्थानीय बनाना आसान)।
इयान

यदि आपको स्थानीयकरण / आसान संपादन की आवश्यकता है, तो आप पाठ को एक फ़ंक्शन में लपेट सकते हैं जो संलग्न पाठ को tr (QString) फ़ंक्शन / Qt जैसी मैक्रो में एक अलग फ़ाइल में लिखता है। pepper.troll.no/s60prereleases/doc/linguist-hellotr.html
नैलर

यहाँ तर्क का अनुकरण करने के लिए xml में विशेषताएँ या अतिरिक्त टैग का उपयोग करने से आपको रोकने के लिए क्या है?
lathomas64

16

खेल स्टेंडल में हम एनपीसी को लागू करने के लिए एक परिमित राज्य मशीन का उपयोग करते हैं।

निम्नलिखित आरेख ट्यूटोरियल को लिखने के तरीके से एक छोटा सा उदाहरण दिखाता है ।

IDM, ATTENDING और QUEST_OFFERED राज्यों के साथ FSM

शुरुआत में, एनपीसी एक आईडीएलई राज्य में है और घूम रहा हो सकता है। एक खिलाड़ी "हाय" कहकर बातचीत शुरू कर सकता है और एनपीसी स्टेट एटीटैंडिंग पर जाएगा। इस राज्य में यह उसकी "नौकरी" के बारे में सवालों के जवाब देता है और कुछ खेल "सहायता" प्रदान करता है। खिलाड़ी एक खोज के लिए पूछ सकता है और NPC राज्य QUEST_OFFERED पर जाकर इस खिलाड़ी के स्वीकार ("हाँ") या गिरावट ("नहीं") को स्वीकार करेगा।

हमने ऐसी स्थितियों का एक सेट परिभाषित किया है जो संक्रमणों से जुड़ी हो सकती हैं। उदाहरण के लिए एक खोज को पूरा करना केवल तभी संभव हो सकता है जब एक PlayerHasItemWithHimCondition पूरा हो।

एक संक्रमण निष्पादित होने के बाद NPC कुछ पाठ और / या किसी कार्रवाई को निष्पादित कर सकती है। शर्तों के समान हमने EquipItemAction जैसे कार्यों के पुन: प्रयोज्य सेट को परिभाषित किया है जिसका उपयोग किसी खिलाड़ी को एक खोज इनाम देने के लिए किया जाता है।

एकाधिक शर्तों को AndCondition , OrCondition और NotCondition का उपयोग करके जोड़ा जा सकता है । आमतौर पर खोज पूर्ण होने पर कई कार्य किए जाते हैं, इसलिए एक बहुआयामी वर्ग भी है।

जबकि स्टेंडल में वास्तविक कार्यान्वयन अन्य (मानव) भाषाओं में आसानी से अनुवाद योग्य नहीं होने के कारण होता है, मुझे लगता है कि सामान्य अवधारणा अच्छी है।


5

आप ओपन सोर्स आरपीजी इंजन Adonthell के Dlgedit टूल पर एक नज़र डाल सकते हैं । यह बहुत उन्नत है और इसमें आपकी ज़रूरत की हर चीज़ शामिल होनी चाहिए (स्रोतों सहित;)


5

मुझे लगता है कि अनुवाद में जोड़ने के लिए, आप अभी भी एक्सएमएल का उपयोग तर्क के लिए कर सकते हैं जैसा कि ऊपर कहा गया है । जब आप उस प्रकार की जटिलता में आ रहे हैं तो आपको अपना संवाद टूल लिखना चाहिए। आपके संवाद पाठ को एक डेटाबेस की कुंजी के रूप में संग्रहीत किया जाएगा जिसे आप उस भाषा के आधार पर स्वैप कर सकते हैं जिसे आप दिखाना चाहते हैं।

उदाहरण के लिए आप हो सकते हैं:

<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>

तब आपके पास खोज पाठ रेंडरर "स्थानीयकृत .ixMyCar" को उचित रूप से अनुवादित पाठ के साथ बदलना होगा।

आपका टूल यह प्रदर्शित करेगा कि खिलाड़ी संपादन योग्य कच्चे XML के साथ चयन योग्य भाषा में क्या देखेगा।

इसी तरह आप उदाहरण के लिए कुछ ऐसा इस्तेमाल कर सकते हैं जिसे आपने संदर्भित किया है :

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

यदि आपकी चाबियां वर्णनात्मक हैं, तो पूरा पाठ नहीं होना एक मुद्दा नहीं होना चाहिए।

ऐसा कुछ उपयोगी हो सकता है:

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

4

डेटा LUA स्क्रिप्ट या XML फ़ाइलों के साथ अपने वर्णों को चलाते हैं। जब आप एनपीसी के साथ बातचीत करते हैं, तो उस फ़ाइल को पकड़ो जो उससे जुड़ी हुई है, उसे पढ़ें, ट्रिगर किए गए किसी भी गेम चर के लिए समायोजित करें, और मान्य प्रतिक्रिया को उत्पाद करें।

इस तरह से करने से सबसे बड़ा लाभ यह है कि आप आसानी से अंदर जा सकते हैं और संवाद में हेरफेर कर सकते हैं, नए पात्रों को जोड़ सकते हैं, आदि। आप प्रत्येक और हर मामले को संभालने में विशेष तर्क के साथ अपने कोड आधार को मूक करने से भी बचते हैं।


1
यह लुआ है, न कि लुआ। :)
RCIX

2
मैंने इसे सिर्फ तुम्हारे लिए किया, यार। ;)
डेविड मैकग्रा

4

यदि आप एक्सएमएल का उपयोग करते हैं, तो सुनिश्चित करें कि आप एक्सएमएल फ़ाइल को संपादित करने के लिए एक छोटा सा उपकरण बनाते हैं। तुम पागल हो जाओगे अन्यथा।


यदि पहले से ही इसे संपादित करने के लिए कोई उपकरण नहीं है, तो पहली जगह में इसका उपयोग करना व्यर्थ है: अपना स्वयं का प्रारूप भी बनाएं!
ओ ० '।

3

यदि आपके पास संवाद पेड़ों का एक बहुत गहरा सेट है, तो चैटमैपर का उपयोग करें । उनके पास एक पूरी तरह से चित्रित मुफ्त संस्करण है और उपकरण आपको अपने संवाद पेड़ों को एक्सएमएल में निर्यात करने की अनुमति देता है। मैं इसका उपयोग कर रहा हूं और यह जटिल संवाद पेड़ों की कल्पना और व्यवस्थित करने का एक शानदार तरीका है।


1

यदि आपके संवाद किसी जटिलता के हैं, तो संवाद कार्यान्वयन के लिए सबसे महत्वपूर्ण बात जो आपके लिए आवश्यक है, वह है आपकी बातचीत की जटिलता को समझने का एक तरीका। मैं यह कल्पना करने के लिए किसी तरह का एक नोड संपादक की सलाह देता हूं, हालांकि मेरे पास सिफारिश करने के लिए कोई अच्छा खुला सिस्टम नहीं है।


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!!!")

खेल में आप आईडी ढूंढते हैं और आईडी और स्थिति का मिलान करने का प्रयास करते हैं।

आपको परिस्थितियों और कार्यों को मॉडल करने की आवश्यकता है। ऑब्जेक्ट्स, फंक्शन पॉइंटर्स, XML द्वारा ...

अच्छा संवाद संपादक भी काम आएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.