2010-05-03 13 views
26

वास्तव में गेम इंजन/तर्क कोड से प्रतिपादन कोड को अलग करने का सबसे अच्छा तरीका क्या है? और क्या उनको अलग करना भी एक अच्छा विचार है?खेल का पृथक्करण और तर्क प्रस्तुत करना

मान लीजिए कि हमारे पास नाइट नामक गेम ऑब्जेक्ट है। उपयोगकर्ता को देखने के लिए नाइट को स्क्रीन पर प्रस्तुत किया जाना है। अब हम दो विकल्पों के साथ छोड़ दिया गया है। या तो हम नाइट को Render/Draw विधि देते हैं जिसे हम कॉल कर सकते हैं, या हम एक रेंडरर क्लास बनाते हैं जो सभी शूरवीरों को प्रस्तुत करने का ख्याल रखता है।

परिदृश्य में जहाँ दो नाइट अलग होती है चाहिए नाइट अभी भी सभी जानकारी उसे प्रस्तुत करना करने के लिए आवश्यक होते हैं, या इस रूप में अच्छी तरह अलग किया जाना चाहिए में?

आखिरी परियोजना में हमने बनाया है कि हमने ऑब्जेक्ट के अंदर किसी ऑब्जेक्ट को संग्रहीत करने के लिए आवश्यक सभी जानकारी देने का निर्णय लिया है, लेकिन हमारे पास वास्तव में उस जानकारी को पढ़ने और वस्तुओं को प्रस्तुत करने के लिए एक अलग घटक था। ऑब्जेक्ट में आकार, रोटेशन, स्केल, और वर्तमान में कौन सी एनीमेशन चल रही थी, इस पर आधारित होगा और इस पर आधारित रेंडरर ऑब्जेक्ट स्क्रीन तैयार करेगा।

एक्सएनए जैसे फ्रेमवर्क ऑब्जेक्ट में शामिल होने के बारे में सोचने लगते हैं और प्रतिपादन एक अच्छा विचार है, लेकिन हम एक विशिष्ट प्रतिपादन ढांचे से बंधने से डरते हैं, जबकि एक अलग प्रतिपादन घटक का निर्माण हमें फ्रेमवर्क को बदलने की अधिक स्वतंत्रता देता है किसी भी दिये गये समय।

+3

XNA के कार्यान्वयन पर ध्यान न दें। जितना मैं इसे प्यार करता हूं, वेब पर और किताबों में उदाहरण देखने वाले "डिफ़ॉल्ट" तरीके से भयानक है। प्रत्येक ऑब्जेक्ट गेम बेस क्लास के बारे में जानता है और बदले में, सबकुछ जानता है कि कैसे आकर्षित करना है और इसी तरह। यह अच्छा नहीं है। थॉमस का समाधान आदर्श है, और कितने लोग करते हैं। – Finglas

उत्तर

5

मैं संभव के रूप में सामान्य रूप में अपने वस्तुओं बनाने का प्रयास करेंगे और जितना संभव के रूप में अपने कोड में एन्कोडिंग गेमप्ले तथ्यों से बचने के लिए।

उदा। आपके पास एक इकाई या ऑब्जेक्ट या अभिनेता वर्ग है, और उस वर्ग के अपने निर्णय लेने (इसकी एआई) और उसके ग्राफिकल प्रतिनिधित्व के लिए एक सूचक के लिए एक सूचक है।

इसका निर्णय लेने जरूरी गेमप्ले तथ्यों के लिए युग्मित है; वास्तव में यह गेमप्ले तथ्यों का एक हिस्सा है। तो यह कहीं कहीं है जहां आप अपने निर्णय निर्माता "नाइटएई" या कुछ नाम दे सकते हैं।

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

कहें कि आपकी संस्थाएं सभी मंडलियों के रूप में प्रतिनिधित्व की गई थीं। आप उन्हें एक CircleRenderer को इंगित करेंगे जो आकार ले लिया है कि उन्हें खींचा जाना चाहिए। आप इच्छित सर्कल के प्रत्येक अलग आकार (या रंग, या जो कुछ भी) के लिए एक अलग रेंडरर क्लास नहीं बनाएंगे!

20

मैं एक अलग KnightRenderer वर्ग पैदा करेगा। फायदे:

  • खेल तर्क और प्रतिपादन के बीच साफ अलगाव। Knight स्वयं एक गेम सर्वर पर भी चला सकता है और बिल्कुल प्रतिपादन के बारे में कुछ भी नहीं जानता है।
  • छोटे, सरल वर्ग, एक और केवल कार्यक्षमता के एक टुकड़े से संबंधित हैं।

सब कुछ Knight (स्थिति, स्थिति) के बारे में जानना KnightRenderer जरूरतों Knight में सार्वजनिक रूप से पठनीय हो गया है।

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

+0

यह बिल्कुल ठीक है कि मैं इसे कैसे करता हूं। – Finglas

+3

मुझे आपके विचार पसंद हैं। प्रश्न: आप नाइट रेंडरर कहां बनाते हैं? क्या आप इसे सीधे नाइट में संदर्भित करते हैं, या आप इसे कहीं और बनाते हैं और इसे पास करते हैं? – lochok

+0

@ थॉमस नाइट नाइटरेंडर में वास्तविक (gl */directx/जो भी) कोड होता है? यदि इसमें शामिल है तो कुछ अनुकूलन लागू करना और कार्यान्वयन स्विच करना मुश्किल लगता है। KnightRenderOpelGL आदि की तरह – GorillaApe

6

मुझे पता है कि मैं देर से आ रहा हूं, लेकिन भविष्य के पाठकों के लिए, आपको एक ट्यूटोरियल में दिलचस्पी हो सकती है।

मैं कोई वास्तविक विशेषज्ञ हूँ, लेकिन यह है कि कैसे मैं चिंताओं का उचित जुदाई देखें:
http://aurelienribon.wordpress.com/2011/04/26/logic-vs-render-separation-of-concerns/

alt text

संबंधित मुद्दे