दो अलग ग्राफिक पुस्तकालयों पर एक ही खेल तर्क


11

क्या कोड दर्शन / अमूर्तता / प्रोग्राम डिज़ाइन की संरचना 2 डी और 3 डी ग्राफिक्स (अलग से) के साथ एक गेम का उपयोग करने की अनुमति देगा, गेम लॉजिक को फिर से कोड किए बिना?

हम समान कोड लेने की बात कर रहे हैं, न्यूनतम चीजों को बदल रहे हैं (उदाहरण के लिए, 3D संपत्तियों के लिए फ़ाइलनाम के साथ 2D संपत्तियों के लिए फ़ाइल नाम का आदान-प्रदान), और हो सकता है कि बेस क्लास प्रति जेनरिक / टेम्प्लेट की कुछ विशिष्टताओं में प्लगिंग हो।

इसे वास्तविक संदर्भ में रखने के लिए, जहां यह समझ में आता है: एक लैन-मल्टीप्लेयर गेम की कल्पना करें जहां एक शीर्ष-पायदान है, कुछ वास्तव में अच्छे गेमर रिग्स वाले खिलाड़ियों के लिए प्रदर्शन-भूखे 3 डी क्लाइंट, और पुराने के लिए एक अधिक विनम्र 2 डी क्लाइंट। धूल के बक्से जो किसी ने अपने अटारी में पाए। लेकिन यह अभी भी एक ही खेल है - समान घटनाओं को पंजीकृत किया जाता है (किसी ने एक सिक्का उठाया), उसी नेटवर्क प्रोटोकॉल का उपयोग किया जाता है, दुनिया आनुपातिक हैं, आदि।

इसे MVC के संदर्भ में रखने के लिए: नियंत्रक बिल्कुल एक ही हैं ("ऊपर" कुंजी दबाने से खिलाड़ियों का त्वरण 3.5 यूनिट / सेकंड पर सेट हो जाएगा), दृश्य पूरी तरह से अलग हैं (2 डी बनाम 3 डी), और मॉडल समान है ग्राफिक्स से सीधे संबंधित किसी भी चीज को छोड़कर (पर्यावरण के लिए टकराव की जांच हर 5 सेकंड में की जाती है, और यह समान कॉन्फ़िगरेशन का उपयोग करता है। ध्यान दें कि इसका मतलब यह होगा कि 2 डी संस्करण में सभी गेम ऑब्जेक्ट्स के लिए एक जेड-समन्वय है, लेकिन यह है उदाहरण के लिए किसी अन्य तरीके से उपयोगकर्ता को केवल अनदेखा या प्रदर्शित किया जाता है, जो खिलाड़ी के हवा में होने पर आगे बाईं ओर प्रदर्शित होता है)।

इस तरह के एक आकर्षक विषय यह है कि यह डेवलपर को यह स्पष्ट रूप से बताएगा कि उसका डेटा कैसे संरचित है और नियंत्रण कैसे प्रवाहित होता है। ध्यान दें कि यह एसडीएल, डी 3 डीएक्स या ओपनगेल जैसे ग्राफिक्स लाइब्रेरी के अलावा कुछ भी उपयोग नहीं करता है। कोई खेल इंजन नहीं!

चूंकि यह ज्यादातर सैद्धांतिक सवाल है, इसलिए मैं प्रोग्रामिंग भाषाओं को इससे बाहर छोड़ दूंगा, लेकिन यदि आप एक उदाहरण देना चाहते हैं तो आप अपनी पसंद की किसी भी भाषा का उपयोग कर सकते हैं, C ++ यदि आप पूरा हॉग जाना चाहते हैं, या ब्रेनफक भी महसूस कर सकते हैं चुनौती तक (किसी भी ठोस जवाब की सराहना की जाएगी, साथ ही साथ किसी भी सार!)।


मुझे यकीन नहीं है कि यह व्यावहारिक है। इतना गेम लॉजिक वेक्टर गणित का उपयोग करता है, आपको 2 डी में बदलने से पहले या फिर रेंडरिंग के लिए 3 डी में सब कुछ करना होगा, या आपको अपने वेक्टर लाइब्रेरी को पूरी तरह से अलग करना होगा - जो निश्चित रूप से अव्यावहारिक होगा?
तेनपुन

"एब्सट्रैक्शन लेयर" शब्द की खोज करें और इससे परिचित हों, क्योंकि आप दोनों कुछ समय के लिए साथ काम करने वाले हैं।
ज़रातुस्तरा

जवाबों:


8

मुझे लगता है कि सभी (?) की आवश्यकता होगी आप अपने ग्राफिक्स पुस्तकालय लपेटकर अमूर्त की एक परत होगी; आपके द्वारा उपयोग की जा रही प्रत्येक लाइब्रेरी के लिए आपको एक नए की आवश्यकता होगी, और प्रत्येक को सटीक बाहरी API की आवश्यकता होगी।

स्ट्रिंग्स के स्थानीयकरण के बारे में सोचें: अपने गेम में स्ट्रिंग "इन्वेंटरी" को हार्ड-कोडिंग करने के बजाय, आप इसके बजाय अपने (संभवतः कस्टम-निर्मित) स्थानीयकरण लाइब्रेरी को कॉल करेंगे, जो कुछ प्रक्रियाओं को करेगा और एक उचित स्ट्रिंग लौटाएगा, जो कि संदर्भ के आधार पर होगा खेल।

उसी तरह, आपके ग्राफिक्स इंजन के सभी कॉल इसके चारों ओर आपके आवरण के माध्यम से किए जाएंगे ।

ऐसा करने में, आप अपने ग्राफिक्स इंजन को क्या कमांड दे सकते हैं, इसे सीमित / प्रतिबंधित करें। यहाँ कुछ आवश्यक हैं:

  1. (ग्राफिक ऑब्जेक्ट) ड्रा (स्थान)
  2. संशोधित (अल्फा, रोटेशन, आदि) की संपत्ति (ग्राफिक ऑब्जेक्ट)
  3. (ग्राफ़िक ऑब्जेक्ट) को (स्थान) पर ले जाएँ
  4. (स्तर नाम / डेटा संरचना) का मानचित्र बनाएँ

और कुछ अन्य, जिन्हें आप अपने प्रोजेक्ट पर काम करते हुए पाएंगे।

यदि आप एक स्ट्रिक्ट-टाइप ऑब्जेक्ट-ओरिएंटेड भाषा का उपयोग कर रहे हैं, तो आप ऊपर दिए गए आदेशों को इंटरफ़ेस कहेंगे जो आपके रैपर सभी लागू करेंगे। अधिमानतः, ये केवल अन-संरक्षित / सार्वजनिक तरीके होंगे।

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

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

आशा है कि यह आपको आरंभ करने में मदद करता है =]


2

प्रदर्शन कोड के पूर्ण अमूर्तता की अनुमति देने के लिए MVC के पास पर्याप्त प्रतिमान के साथ अपने खेल की वास्तुकला का निर्माण करना किसी भी बड़ी परियोजना के लिए काफी मुश्किल होगा। हालांकि, ऐसा लगता है कि गेम बनाने में सबसे बड़ी बाधा यह है कि एक 2 डी और 3 डी क्लाइंट दोनों का समर्थन करता है, एक गेम डिजाइन करेगा जिसमें दोनों क्लाइंट समान रूप से सक्षम हैं।

दो ग्राहकों को बनाने और समर्थन करने के पूरे इरादे से अपने खेल के डिजाइन को शुरू करना आवश्यक होगा, और यह शायद 2 डी क्लाइंट के लिए सभी गेम की कार्यक्षमता को प्रतिबंधित करने के लिए सबसे सुरक्षित होगा।

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

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

मेरी राय में यह एक खराब पसंद होगा जो 2D और 3D क्लाइंट्स के लिए गेम डिज़ाइन की अनुमति देता है जो समान क्षमताओं के लिए होता है। मुझे लगता है कि यह विषम गेमप्ले विकल्पों को डिजाइन करने के लिए संसाधनों का बेहतर उपयोग होगा, और प्रत्येक ग्राहक को अपनी ताकत के लिए खेलने की अनुमति देगा। उदाहरण के लिए यदि 2 डी क्लाइंट मुख्य रूप से गेम की दुनिया पर एक रणनीतिक-स्तरीय परिप्रेक्ष्य पर केंद्रित था, जिसमें 3 डी क्लाइंट को सामरिक स्तर के गेमप्ले के लिए इस्तेमाल किया जा रहा था।


0

मुझे लगता है कि आपने अपने स्वयं के प्रश्न का उत्तर दिया है:

इसे MVC के संदर्भ में रखने के लिए: नियंत्रक बिल्कुल एक ही हैं ("ऊपर" दबाकर कुंजी खिलाड़ियों को 3.5 इकाइयों / सेकंड में सेट कर देगा), दृश्य पूरी तरह से अलग हैं (2 डी बनाम 3 डी), और मॉडल समान है ग्राफिक्स से सीधे संबंधित किसी भी चीज को छोड़कर।

इसलिए, इनपुट, गेम लॉजिक, आदि और ग्राफिक्स के बीच एक पर्याप्त अमूर्तता प्रदान करके, आपने समस्या को हल कर दिया होगा।

यह मूल रूप से एमवीसी मॉडल का बिंदु है, विशेष रूप से यह डेस्कटॉप और वेब अनुप्रयोगों से संबंधित है: एक ही डेटा (ईमेल के लिए एक वेब इंटरफ़ेस, मोबाइल क्लाइंट और डेस्कटॉप क्लाइंट) को एक ही डेटा तक पहुंचने और हेरफेर करने वाले कई क्लाइंट हो सकते हैं।


0

यदि आप इसे सरल चाहते हैं तो इसे सरल रखें: - वस्तुओं को स्थानांतरित करने के लिए गेम लॉजिक लिखें। उन पर कोई डेटा संग्रहीत न करें जो रेंडरिंग से संबंधित हो। - रेंडरर्स लिखें जिन्हें गेम डेटा की स्थिति को देखने और इसे आकर्षित करने का मौका दिया जाता है।

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

यदि आपको अधिक जटिल तरीकों की आवश्यकता है, तो बहुरूपता, स्मृति चिन्ह पैटर्न, हैश टेबल, शून्य * पॉइंटर्स आदि पर विचार करें, इसे इंजीनियर न करें (इन विधियों में से अधिकांश इंजीनियर हैं)।

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