गेम बनाते समय आप अक्सर निम्नलिखित गेम ऑब्जेक्ट बनाते हैं जिसमें से सभी निकाय वारिस होते हैं:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
इसलिए आप लूप को अपडेट करते हैं, आप सभी गेम ऑब्जेक्ट्स पर पुनरावृति करते हैं और उन्हें राज्य बदलने का मौका देते हैं, फिर अगले ड्रॉ लूप में आप सभी गेम ऑब्जेक्ट्स पर फिर से पुनरावृति करते हैं और उन्हें खुद को आकर्षित करने का मौका देते हैं।
यद्यपि यह एक साधारण गेम में एक साधारण फॉरवर्ड रेंडरर के साथ काफी अच्छी तरह से काम करता है, यह अक्सर कुछ विशाल गेम ऑब्जेक्ट्स को ले जाता है, जिन्हें अपने मॉडल, कई टेक्सचर और सभी फैट ड्रॉ विधि में से सबसे खराब स्टोर करने की आवश्यकता होती है, जो गेम ऑब्जेक्ट के बीच एक तंग युग्मन बनाता है, वर्तमान रेंडर रणनीति और किसी भी संबंधित वर्ग प्रदान करते हैं।
अगर मैं रेंडर की रणनीति को आगे से स्थगित करने के लिए बदल सकता था तो मुझे बहुत सी गेम ऑब्जेक्ट को अपडेट करना होगा। और मेरे द्वारा बनाई गई खेल वस्तुएं पुन: प्रयोज्य नहीं हैं क्योंकि वे हो सकते हैं। बेशक विरासत और / या रचना मुझे कोड डुप्लीकेशन से लड़ने में मदद कर सकती है और कार्यान्वयन को बदलना थोड़ा आसान बना सकती है लेकिन फिर भी यह कमी महसूस होती है।
एक बेहतर तरीका, शायद, गेमऑबजेक्ट क्लास से ड्रॉ पद्धति को पूरी तरह से हटाना और एक रेंडरर क्लास बनाना होगा। GameObject को अभी भी कुछ डेटा शामिल करने की आवश्यकता है, यह दृश्य है, जैसे कि किस मॉडल के साथ इसका प्रतिनिधित्व करना है और किस बनावट को मॉडल पर चित्रित किया जाना चाहिए, लेकिन यह कैसे किया जाता है इसे रेंडरर पर छोड़ दिया जाएगा। हालाँकि, अक्सर रेंडरिंग में बहुत सारे बॉर्डर केस होते हैं, हालांकि इससे गेमऑब्जेक्ट से तंग-युग्मन को हटा दिया जाएगा। कसकर जुड़े हुए। यह काफी अच्छी प्रथाओं का उल्लंघन होगा। शायद डेटा-ओरिएंटेड-डिजाइन चाल कर सकता है। गेम ऑब्जेक्ट्स निश्चित रूप से डेटा होंगे, लेकिन रेंडरर इसे कैसे संचालित करेगा? मुझे यकीन नहीं है।
इसलिए मैं एक नुकसान में हूं और एक अच्छे समाधान के बारे में नहीं सोच सकता। मैंने एमवीसी के सिद्धांतों का उपयोग करने की कोशिश की है और अतीत में मुझे इस बारे में कुछ विचार थे कि खेलों में कैसे उपयोग किया जाए, लेकिन हाल ही में यह उतना लागू नहीं हुआ जितना मैंने सोचा था। मुझे यह जानकर अच्छा लगेगा कि आप सभी इस समस्या से कैसे निपटेंगे।
वैसे भी चलो पुनर्कथन करते हैं, मुझे दिलचस्पी है कि निम्नलिखित डिज़ाइन लक्ष्यों को कैसे प्राप्त किया जा सकता है।
- खेल वस्तु में कोई प्रतिपादन तर्क नहीं
- गेम ऑब्जेक्ट्स और रेंडर इंजन के बीच ढीली कपलिंग
- सभी जानने वाले रेंडर नहीं
- रेंडर इंजन के बीच अधिमानतः रनटाइम स्विचिंग
आदर्श प्रोजेक्ट सेटअप एक अलग 'गेम लॉजिक' होगा और लॉजिक प्रोजेक्ट को प्रस्तुत करना होगा जो एक दूसरे को संदर्भित करने की आवश्यकता न हो।
जॉन कार्मैक को ट्विटर पर यह कहते हुए सुना कि यह ट्रेन तब शुरू हुई, जब उनके पास इतना लचीला सिस्टम है कि वह रेंडर समय पर रेंडर इंजन को स्वैप कर सकते हैं और अपने सिस्टम को रेंडरर्स (एक सॉफ्टवेयर रेंडरर और हार्डवेयर-त्वरित रेंडरर) दोनों का उपयोग करने के लिए कह सकते हैं उसी समय इसलिए वह मतभेदों का निरीक्षण कर सकता है। अब तक मैंने जो सिस्टम प्रोग्राम किए हैं, वे उस लचीले के पास भी नहीं हैं