कुछ बिंदु पर एक इंजन जरूरी है और खेल के बारे में सामान जानना चाहिए। मैं यहाँ एक स्पर्शरेखा पर जाऊँगा।
एक आरटीएस में संसाधन लें। एक गेम हो सकता है Credits
और Crystal
दूसरा Metal
औरPotatoes
आपको ओओ कॉन्सेप्ट का सही इस्तेमाल करना चाहिए और अधिकतम के लिए जाना चाहिए। कोड-पुन: उपयोग। यह स्पष्ट है कि यहां एक अवधारणा Resource
मौजूद है।
इसलिए हम तय करते हैं कि संसाधन निम्नलिखित हैं:
- मुख्य लूप में एक हुक खुद को बढ़ाने / घटाने के लिए
- वर्तमान राशि प्राप्त करने का एक तरीका (रिटर्न
int
)
- मनमाने ढंग से घटाना / जोड़ने का एक तरीका (संसाधनों को स्थानांतरित करने वाले खिलाड़ी, खरीद ...)
ध्यान दें कि इस धारणा को Resource
एक खेल में मारता है या अंक का प्रतिनिधित्व कर सकता है! यह बहुत शक्तिशाली नहीं है।
अब एक गेम के बारे में सोचते हैं। हम पेनी में काम करने और आउटपुट में दशमलव बिंदु जोड़कर मुद्रा की तरह कर सकते हैं। हम जो नहीं कर सकते हैं वह "तात्कालिक" संसाधन हैं। जैसे "पावर ग्रिड पीढ़ी"
कहते हैं कि आप InstantResource
समान विधियों के साथ एक वर्ग जोड़ते हैं । अब आप संसाधनों के साथ अपने इंजन को प्रदूषित कर रहे हैं (शुरू कर रहे हैं)।
समस्या
फिर से आरटीएस का उदाहरण लें। मान लीजिए कि जो खिलाड़ी किसी Crystal
और खिलाड़ी को कुछ दान करता है । आप कुछ ऐसा करना चाहते हैं:
if(transfer.target == engine.getPlayerId()) {
engine.hud.addIncoming("You got "+transfer.quantity+" of "+
engine.resourceDictionary.getNameOf(transfer.resourceId)+
" from "+engine.getPlayer(transfer.source).name);
}
engine.getPlayer(transfer.target).getResourceById(transfer.resourceId).add(transfer.quantity)
engine.getPlayer(transfer.source).getResourceById(transfer.resourceId).add(-transfer.quantity)
हालाँकि यह वास्तव में काफी गड़बड़ है। यह सामान्य उद्देश्य है, लेकिन गड़बड़ है। पहले से ही हालांकि यह एक resourceDictionary
अर्थ लगाता है कि अब आपके संसाधनों के नाम होने हैं! और यह प्रति खिलाड़ी है, इसलिए आपके पास टीम संसाधन नहीं हो सकते।
यह "बहुत अधिक" अमूर्तता है (एक शानदार उदाहरण मैं नहीं मानता) इसके बजाय आपको एक बिंदु मारना चाहिए जहां आप स्वीकार करते हैं कि आपके खेल में खिलाड़ी और क्रिस्टल हैं, तो आप बस (उदाहरण के लिए) कर सकते हैं
engine.getPlayer(transfer.target).crystal().receiveDonation(transfer)
engine.getPlayer(transfer.source).crystal().sendDonation(transfer)
एक वर्ग के साथ Player
और एक वर्ग CurrentPlayer
जहां CurrentPlayer
की crystal
वस्तु स्वचालित रूप से / स्थानांतरण के लिए HUD पर सामान दिखा देंगे दान के भेज दिया।
यह क्रिस्टल के साथ इंजन को प्रदूषित करता है, क्रिस्टल का दान, वर्तमान खिलाड़ियों के लिए HUD पर संदेश और वह सब। यह पढ़ना / लिखना / बनाए रखना अधिक तेज़ और आसान है (जो अधिक महत्वपूर्ण है, क्योंकि यह काफी तेज़ नहीं है)
अंतिम टिप्पणी
संसाधन का मामला शानदार नहीं है। मुझे उम्मीद है कि आप अभी भी बिंदु देख सकते हैं। अगर मैंने कुछ भी प्रदर्शित किया है कि "संसाधन इंजन में नहीं हैं" तो क्या एक विशिष्ट खेल की आवश्यकता है और क्या संसाधनों के सभी धारणाओं पर लागू होता है, बहुत अलग चीजें हैं। आपको आमतौर पर 3 (या 4) "परतें" मिलेंगी
- "कोर" - यह इंजन की पाठ्यपुस्तक की परिभाषा है, यह ईवेंट हुक के साथ एक दृश्य ग्राफ है, यह शेड्स और नेटवर्क पैकेट और खिलाड़ियों की एक अमूर्त धारणा से संबंधित है
- "गेमकोर" - यह खेल के प्रकार के लिए बहुत सामान्य है, लेकिन सभी खेलों के लिए नहीं - उदाहरण के लिए आरटीएस में संसाधन या एफपीएस में गोला बारूद। खेल का तर्क यहीं से रिसना शुरू होता है। यह वह जगह है जहाँ संसाधनों की हमारी पूर्व धारणा होगी। हमने इन चीजों को जोड़ा है जो अधिकांश आरटीएस संसाधनों के लिए समझ में आता है।
- "GameLogic" वास्तविक खेल के लिए बहुत विशिष्ट है। आप जैसे नामों के साथ चर मिल जाएगा
creature
या ship
या squad
। का उपयोग करते हुए विरासत आप वर्गों है कि सभी 3 परतें अवधि मिलेगा (उदाहरण के लिए Crystal
एक है Resource
जो एक है GameLoopEventListener
कहते हैं)
- "एसेट्स" ये किसी भी अन्य खेल के लिए बेकार हैं। उदाहरण के लिए एआई लिपियों को आधा जीवन 2 में लें, वे एक ही इंजन के साथ आरटीएस में उपयोग नहीं होने जा रहे हैं।
पुराने इंजन से नया गेम बनाना
यह बहुत आम है। चरण 1 परतों 3 और 4 (और 2 को चीरना है अगर खेल एक अलग प्रकार है) मान लीजिए कि हम एक पुराने आरटीएस से आरटीएस बना रहे हैं। हमारे पास अभी भी संसाधन हैं, न कि क्रिस्टल और सामान - इसलिए परतों 2 और 1 में आधार वर्ग अभी भी समझ में आता है, 3 और 4 में संदर्भित सभी क्रिस्टल को त्याग दिया जा सकता है। तो हम करते हैं। हालाँकि हम इसे एक संदर्भ के रूप में जाँच सकते हैं कि हम क्या करना चाहते हैं।
परत 1 में प्रदूषण
ऐसा हो सकता है। अमूर्तता और प्रदर्शन दुश्मन हैं। उदाहरण के लिए UE4 रचना के बहुत सारे अनुकूलित मामलों को प्रदान करता है (इसलिए यदि आप X और Y चाहते हैं तो किसी ने ऐसा कोड लिखा है जो X और Y को एक साथ वास्तव में तेज करता है - यह जानता है कि यह दोनों कर रहा है) और परिणामस्वरूप बहुत बड़ी है। यह बुरा नहीं है, लेकिन यह समय लेने वाला है। लेयर 1 चीजों को तय करेगा कि "आप डेटा को शेडर्स में कैसे पास करते हैं" और आप चीजों को कैसे चेतन करते हैं। अपनी परियोजना के लिए इसे सबसे अच्छा तरीका है हमेशा अच्छा है। भविष्य के लिए बस कोशिश करें और योजना बनाएं, कोड का पुन: उपयोग करना आपका मित्र है, जहां यह समझ में आता है।
परतों को वर्गीकृत करना
जल्द ही (मैं वादा करता हूं) परतों से बहुत डरता नहीं हूं। इंजन निश्चित फ़ंक्शन पाइपलाइनों के पुराने दिनों से एक पुरातन शब्द है जहां इंजनों ने उसी तरह से ग्राफिक रूप से काम किया (और परिणामस्वरूप सामान्य रूप से बहुत कुछ था) प्रोग्राम योग्य पाइपलाइन ने इसे अपने सिर पर बदल दिया और इस तरह "परत 1" प्रदूषित हो गई। डेवलपर्स जो भी प्रभाव हासिल करना चाहते थे। एआई इंजनों की विशिष्ट विशेषता थी (दृष्टिकोणों के असंख्य होने के कारण), अब यह एआई और ग्राफिक्स है।
आपका कोड इन परतों में दर्ज नहीं होना चाहिए। यहां तक कि प्रसिद्ध अवास्तविक इंजन में कई अलग-अलग संस्करण हैं जो प्रत्येक विशिष्ट गेम के लिए विशिष्ट हैं। कुछ फाइलें (डेटा संरचनाओं की तरह अन्य) शायद अपरिवर्तित हो गई हैं। यह ठीक है! यदि आप एक नया गेम बनाना चाहते हैं तो उसे 30 मिनट से अधिक समय लगेगा। कुंजी की योजना है, यह जानने के लिए कि क्या कॉपी और पेस्ट करना है और पीछे क्या छोड़ना है।