इन-गेम इवेंट को प्रबंधित करने का सबसे अच्छा तरीका?


13

मैं एक ऐसे खेल पर काम कर रहा हूँ, जहाँ कुछ इन-गेम स्पर्धाएँ एक बार में ही होनी चाहिए। एक अच्छा उदाहरण एक ट्यूटोरियल होगा। आप खेल शुरू करते हैं, और खेल के कई बिंदुओं पर एक घटना घटती है:

  • आप अपने पहले दुश्मन का सामना करते हैं, खेल रुक जाता है और आपको इस पर स्पष्टीकरण मिलता है कि इसे कैसे मारना है।
  • आपने पहले दुश्मन को मार डाला, आपको "अच्छा काम" संदेश प्राप्त होता है।
  • आप एक नया आइटम प्राप्त करते हैं, आइटम आँकड़े पॉपअप के साथ एक मेनू।
  • आदि आदि।

मैं जिस खेल पर काम कर रहा हूं, वह एक पहेली गेम है, जहां खेल में नियम बहुत समान हैं, इसलिए इन सभी घटनाओं को अलग-अलग स्तरों में हार्डकोड करना अक्षम है।

क्या मुझे किसी तरह एक्सएमएल जैसे किसी बाहरी स्रोत में इन घटनाओं को परिभाषित करना चाहिए? फिर एक दुभाषिया लिखें जो XML को पढ़ता है और स्तर के लिए घटनाओं की आवश्यकताओं को सेट करता है? मुझे यकीन नहीं है कि मैं एक घटना को कैसे परिभाषित कर सकता हूं, जब आपको उदाहरण के लिए दो दुश्मनों को मारना चाहिए।

बस स्पष्ट होने के लिए, मैं ऐसा करने के लिए सबसे अच्छी प्रोग्रामिंग भाषा या स्क्रिप्टिंग भाषा की तलाश नहीं कर रहा हूं, लेकिन इसे संभालने के लिए सबसे अच्छा तरीका है।

धन्यवाद!


संपादित करें: एक दूसरा उदाहरण चूंकि मेरे सवाल को समझना बहुत कठिन था:

मुझे जो समस्या हो रही है वह खेल में कुछ अतिरिक्त क्रियाओं को एक प्रक्रिया में रखना है जो हमेशा बहुत अधिक होती है। एक आरपीजी लड़ाई की तरह, हर किसी की बारी है, एक कौशल आदि चुनता है - यह हमेशा एक ही है। लेकिन क्या होगा अगर कोई ऐसा मामला हो, जहां मैं बीच-बीच में कहीं कटक का प्रदर्शन करूं। कटकीन के साथ एक बदल गई लड़ाई कक्षा में पास होने के लिए पूरी खेल संरचना को मोडिफाई करना बहुत ही अक्षम लगता है। मैं सोच रहा हूं कि यह आमतौर पर कैसे किया जाता है।


8
चीजों को अधिक करने की कोशिश मत करो, उदाहरण के लिए ट्यूटोरियल बहुत विशिष्ट हैं और विभिन्न ट्रिगर / घटनाओं के साथ आते हैं। हार्डकोडिंग / स्क्रिप्टिंग में कुछ भी गलत नहीं है।
माईक सेमर 19

1
@ माईक यदि आप इसे एक उत्तर आईडी +1 में डालते हैं .. सरल और हल किया हुआ, किसी भी दिन की तुलना में बेहतर है।
जेम्स

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

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

तुम क्या चाहते हो? आप क्रियाओं को रोकना चाहते हैं और अतिरिक्त करना चाहते हैं, फिर क्रियाओं को रोकें?
user712092

जवाबों:


7

यह बहुत कुछ इस बात पर निर्भर करता है कि आपके खेल में वस्तुओं के बीच वास्तव में घटनाओं का संचार कैसे होता है। उदाहरण के लिए, यदि आप एक केंद्रीय संदेश प्रणाली का उपयोग कर रहे हैं तो आपके पास एक ट्यूटोरियल मॉड्यूल हो सकता है जो कुछ संदेशों को सुनता है और जब भी कुछ संदेशों को सुनता है तो वह ट्यूटोरियल पॉपअप बनाता है। तब आप यह निर्धारित कर सकते हैं कि किस संदेश को सुनने के लिए, साथ ही पॉपअप को दिखाने के लिए, XML फ़ाइल में या ट्यूटोरियल मॉड्यूल द्वारा पार्स की गई कोई चीज़। एक अलग ट्यूटोरियल ऑब्जेक्ट होने से जो गेम स्टेट पर नज़र रखता है और जब वह गेम में सामान नोटिस करता है तो ट्यूटोरियल पॉपअप प्रदर्शित करता है, आप अपने गेम के बारे में कुछ और बदलने की आवश्यकता के बिना ट्यूटोरियल ऑब्जेक्ट को बदल सकते हैं। (क्या यह ऑब्जर्वर पैटर्न है? मैं सभी डिज़ाइन पैटर्न से परिचित नहीं हूँ।)

कुल मिलाकर हालांकि यह आपके ट्यूटोरियल की जटिलता पर निर्भर करता है अगर यह इस बारे में चिंता करने योग्य है। आपके कोड और / या स्तरों की घटनाओं को हार्ड-कोडिंग करना मेरे लिए केवल मुट्ठी भर ट्यूटोरियल पॉपअप के लिए एक बड़ी बात नहीं है। मैं उत्सुक हूं कि आपके मन में वास्तव में ऐसा क्या है जो आपको लगता है कि यह अक्षम होगा, क्योंकि आप सभी को हर ट्रिगर करना चाहिए बस ट्यूटोरियल मॉड्यूल को एक संदेश भेज रहा है, TutorialModule.show ("1st_kill") जैसा कुछ;


मुझे लगता है कि इसकी पहेली के खेल के बाद से उनका तर्क कई स्तरों के लिए एक स्थान पर है और इस तरह, चेक बनाने के लिए हमें एक ट्यूटोरियल करना चाहिए जो कुछ ऐसा हो जो सभी पर रहता है। ईमानदारी से अगर यह एक पहेली खेल है, तो मुझे नहीं लगता कि यह इसके लिए एक बड़ी हिट लेने जा रहा है, भले ही यह सबसे सुंदर कोड नहीं है, और दिन के अंत में जो एक गेम में काम करता है जो जहाज हमेशा -always- होता है सुंदर कोड की तुलना में 100% बेहतर है जो कभी भी दिन का प्रकाश नहीं देखता है;)
जेम्स

पर्यवेक्षक पैटर्न की तरह कुछ के बारे में कभी नहीं सोचा, एक अच्छा समाधान की तरह लगता है। मैं इसे एक कोशिश देता हूँ, धन्यवाद :)
omgnoseat

7

यहाँ डिजाइन की बाध्यता है क्योंकि मैं उन्हें समझता हूँ:

  1. कोर गेमप्ले कोड स्तर की आवश्यकताओं के बारे में परवाह नहीं करता है और उन्हें उस कोड के साथ जोड़ा नहीं जाना चाहिए जो उनके साथ काम करता है।

  2. उसी समय, यह कोर गेमप्ले कोड है जो जानता है कि जब विशिष्ट इवेंट उन आवश्यकताओं को पूरा करते हैं (आइटम प्राप्त करना, दुश्मन को मारना, आदि)।

  3. विभिन्न स्तरों की आवश्यकताओं के अलग-अलग सेट हैं और जिन्हें कहीं न कहीं वर्णित किया जाना आवश्यक है।

उन लोगों को देखते हुए, मैं संभवतः ऐसा कुछ करूंगा: सबसे पहले, एक वर्ग बनाएं जो एक गेम स्तर का प्रतिनिधित्व करता है। यह उन विशिष्ट आवश्यकताओं के सेट को ध्वस्त कर देगा जो एक स्तर पर है। इसमें ऐसे तरीके हैं जो गेम इवेंट होने पर कॉल किए जा सकते हैं।

कोर गेमप्ले कोड को वर्तमान स्तर की वस्तु का संदर्भ दें। जब गेमप्ले घटनाएं घटित हो, यह उस पर तरीकों को फोन करके स्तर बता देंगे: enemyKilled, itemPickedUp, आदि

आंतरिक रूप से, Levelकुछ चीजों की जरूरत है:

  • यह ट्रैक करने के लिए कि कौन सी घटनाएँ पहले से ही हैं। इस तरह यह दूसरों से मारे गए पहले दुश्मन को अलग कर सकता है, और पहली बार जानता है कि आपने किसी दिए गए आइटम को उठाया है।
  • LevelRequirementवस्तुओं की एक सूची जो उस स्तर के लिए आपके द्वारा आवश्यक लक्ष्यों के विशिष्ट सेट का वर्णन करती है।

जब आप एक स्तर दर्ज करते हैं, तो आप Levelसही LevelRequirementएस के साथ बनाएंगे , गेमप्ले कोड सेट करेंगे और उस स्तर को देंगे।

जब भी कोई गेम ईवेंट होता है, तो गेमप्ले उसे पास कर देता है Level। यह बदले में कुल आंकड़ों की गणना करता है (मारे गए दुश्मनों की कुल संख्या, उस प्रकार के दुश्मनों को मार डाला, आदि) यह तब अपनी आवश्यकता की वस्तुओं के माध्यम से चलता है, प्रत्येक को एग्रेगेटगेट डेटा देता है। एक आवश्यकता यह देखने के लिए परीक्षण करती है कि क्या यह पूरा हुआ है, और यदि ऐसा है तो जो कुछ भी व्यवहार उचित है वह उचित है (ट्यूटोरियल पाठ इत्यादि दिखाते हुए)

LevelRequirement मूल रूप से दो चीजों की जरूरत है:

  1. आवश्यकता पूरी हो गई है या नहीं, यह बताने के लिए परीक्षण का विवरण । यह केवल एक फ़ंक्शन हो सकता है यदि आपकी भाषा यह आसान बनाती है, अन्यथा आप इसे डेटा में मॉडल कर सकते हैं। (यानी मेरे पास RequirementTypeसामान के साथ एक एनुम है FIRST_KILLऔर फिर switchउस पर एक बड़ा पता है कि प्रत्येक प्रकार की जांच कैसे करें।)
  2. आवश्यकता पूरी होने पर प्रदर्शन करने की क्रिया।

वहाँ अभी भी सवाल है जहाँ आवश्यकताओं के उन सेटों का वर्णन किया गया है। आप XML या किसी अन्य पाठ फ़ाइल स्वरूप जैसा कुछ कर सकते हैं। यह उपयोगी है अगर:

  1. गैर-प्रोग्रामर संलेखन स्तर होंगे।
  2. आप recompiling और / या पुनरारंभ किए बिना आवश्यकताओं को बदलने में सक्षम होना चाहते हैं।

यदि उनमें से कोई भी मामला नहीं है, तो मैं शायद उन्हें सीधे कोड में बनाऊंगा। सरलता हमेशा बेहतर होती है।


पहले 3 अंक मेरे द्वारा उपयोग की जा रही विधि का बहुत ही करीबी विवरण हैं, प्रभावशाली! हाँ, मैं जिस चीज़ से सबसे ज्यादा जूझ रहा हूँ, वह है जहाँ आवश्यकता का वर्णन करना, और इसे खेल में कैसे अनुवाद किया जाए (क्योंकि यह संभवतः सबसे अधिक बाहरी होने वाला है)। गहराई से स्पष्टीकरण के लिए धन्यवाद :)
omgnoseat

5

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

आप जो चाहते हैं, वह यह है कि घटित हुई घटनाओं को पहचानें (1) और फिर कुछ क्रियाएँ करें जो इन घटनाओं (प्रिंट संदेश, कीपर के लिए जाँच ...) (2) द्वारा मांगी जाती हैं। आप भी इन घटनाओं को केवल एक बार करना चाहते हैं (3)।

मूल रूप से आप शर्तों के लिए जाँच करना चाहते हैं और फिर कुछ व्यवहार शेड्यूल करें।

घटनाओं को कैसे पहचानें (1)

  • आप इन घटनाओं को पहचानना चाहते हैं जैसे "पहले दुश्मन का सामना करना पड़ा", "नया आइटम प्राप्त हुआ"
  • यदि सामान्य भाग होता है, तो " शत्रु का सामना करना पड़ता है ", " आइटम प्राप्त " आप "विशिष्ट भाग के लिए जाँच करें" पहले ... "," नया आइटम प्राप्त "

किस घटनाओं से बने हैं

अधिक सामान्य दृश्य में, ऐसी प्रत्येक घटना निम्न से बनती है:

  • पूर्व शर्त , आप उनकी जाँच करें
  • एक्शन जो पूर्ति होने पर किए जाएंगे ("" आपने पहले दुश्मन को मार दिया है! "," ए और बी बटन दबाकर कॉम्बोस बनाएं "," जारी रखने के लिए "दर्ज करें", "की" कुंजी-कुंजी "दर्ज करें" दबाएं। "

इन घटनाओं को कैसे स्टोर करें

कुछ डेटा संरचना में:

  • पूर्व शर्त की सूची (तार या कोड यदि आप इसे कुछ उच्च-स्तरीय भाषा में लिख रहे हैं)
  • कार्यों की सूची है (वे तार हो सकते हैं, क्वेक इंजन घटनाओं के लिए तार का उपयोग करता है)

आप इसे रिलेशनल डेटाबेस में भी स्टोर कर सकते हैं, ऐसा लगता है कि यह आवश्यक नहीं है, यदि आप इस गेम को बड़ा बनाना चाहते हैं तो आपको एक बनाने की आवश्यकता हो सकती है।

फिर आपको इन स्ट्रिंग्स / चीजों को पार्स करना होगा। या आप कुछ स्क्रिप्टिंग भाषा जैसे पायथन या LUA या LISP जैसी भाषा का उपयोग कर सकते हैं, ये सभी आपके लिए इसे पार्स और निष्पादित कर सकते हैं। :)

गेम लूप में इन घटनाओं का उपयोग कैसे करें (2)

आपको इन दो डेटा संरचनाओं की आवश्यकता होगी:

  • घटनाओं की कतार (जिन घटनाओं को चलाया जाना निर्धारित है)
  • क्रियाओं की कतार (अनुसूचित क्रियाएँ, घटनाएँ जो कार्य किए जाते हैं)

कलन विधि:

  • आप में से कुछ को पहचान तो घटना की पूर्व शर्त पूरी होती हैं तुम उसे में डाल दिया घटना कतार
  • (३) फिर आपको यह सुनिश्चित करना चाहिए कि यह घटना केवल एक बार हुई है जब आप चाहते हैं :) (उदाहरण के लिए बूलियन सरणी के साथ has_this_event_happened ["पहला दुश्मन का सामना करना पड़ा"])
  • (यदि कार्रवाई कतार खाली है, तो) यदि घटना कतार में घटना है, तो आप अपने कार्यों को कार्रवाई कतार में डालते हैं और उसे घटना स्थल से हटा दें
  • अगर वहाँ है कार्रवाई में कार्रवाई कतार आप क्या यह द्वारा की मांग की है शुरू
  • यदि ऐसी कार्रवाई की जाती है तो आप इसे कार्रवाई कतार से हटा देते हैं

इन क्रियाओं को स्वयं कैसे करें (2)

आप ऑब्जेक्ट की सूची बनाते हैं, जिसमें फ़ंक्शन "अपडेट" होता है। उन्हें कभी-कभी संस्थाएं (क्वेक इंजन में) या अभिनेता (अवास्तविक इंजन में) कहा जाता है।

  1. जब आप कार्रवाई कतार में शुरू करने की मांग करते हैं तो आप इन वस्तुओं को शुरू करते हैं।
  2. इन वस्तुओं का उपयोग अन्य चीजों के लिए किया जा सकता है जैसे कि कुछ अन्य टाइमर। क्वेक में इन संस्थाओं का उपयोग पूरे खेल तर्क के लिए किया जाता है, मैं आपको इसके बारे में कुछ सामग्री पढ़ने की सलाह देता हूं ।

एक्शन "कुछ तो बोलो"

  1. आप स्क्रीन पर कुछ प्रिंट करें
  2. आप चाहते हैं कि यह संदेश कुछ सेकंड के लिए दिखाई दे
  3. "अपडेट" में:
    • चर निकालें_मे_ओवर करें और समय बीतने पर इसे कम करें
    • जब चर 0 होता है तो आप इस क्रिया को क्रिया कतार से हटा देते हैं
    • आप इस ऑब्जेक्ट को भी हटा देते हैं (या इसे निकालने के लिए शेड्यूल करते हैं ...)

कार्रवाई "कुंजी की आवश्यकता है"

  1. यह निर्भर करता है कि आप इसे कैसे बनाना चाहते हैं, लेकिन मुझे लगता है कि आप एक संदेश बनाते हैं
  2. "अपडेट" में:
    • आप बस इच्छित कीपर ईवेंट के लिए जाँच करें
    • कीप इवेंट्स को आयोजित करने के लिए आपको संभवतः कुछ सरणी / कतार की आवश्यकता होगी
    • तब आप इसे क्रिया कतार से हटा सकते हैं और ऑब्जेक्ट निकाल सकते हैं

क्या तरीके सीखने के लिए


-1 सही, या वह सिर्फ एक फ़ंक्शन को गंभीरता से कहता है, ओपी को केवल एक संदेश बॉक्स चाहिए जब एक निश्चित शर्त पूरी हो जाए
Maik Semder

यह एक बहुत अच्छा लेखन है, लेकिन वास्तव में मैं क्या देख रहा था नहीं। मेरे पास एक कठिन समय था कि मैं जो चाहता हूं समझाऊं। मैंने एक दूसरा स्पष्टीकरण जोड़ा: मुझे जो समस्या हो रही है वह इस खेल में कुछ अतिरिक्त क्रियाओं को एक प्रक्रिया में रखना है जो हमेशा बहुत अधिक होती है। एक आरपीजी लड़ाई की तरह, हर किसी की बारी है, एक कौशल आदि चुनता है - यह हमेशा एक ही है। लेकिन क्या होगा अगर कोई ऐसा मामला हो जहां मैं बीच-बीच में कहीं कट-सीन प्रदर्शित करूं। पूरे खेल के ढांचे को कटने के साथ बदल दिया लड़ाई वर्ग में पारित करने के लिए Modyfing बहुत अक्षम लगता है। मैं सोच रहा हूँ कि यह आमतौर पर कैसे किया जाता है?
omgnoseat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.