"गेम लॉजिक कोड क्या है?"


50

मैं C # / XNA का उपयोग कर रहा हूं और ड्रॉ कोड के साथ अपडेट कोड को नहीं करने के लिए काफी बार कहा गया है - और मुझे यकीन है कि मैं नहीं हूं! लेकिन क्या कोई यह बता सकता है कि वास्तव में 'लॉजिक कोड' क्या है?

जैसा कि यहाँ देखा गया है: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...] सुनिश्चित करें कि आपने अपने सभी गेम लॉजिक को अपडेट विधि के अंदर रखा है (ड्रा में नहीं!) और सब कुछ एक स्थिर गति से चलेगा।

मैं यह पूछ रहा हूं क्योंकि मेरे खेल की गति एफपीएस के सापेक्ष उतार-चढ़ाव है। स्लो एफपीएस धीमी गति से चलने वाली वस्तुओं और वीज़ा वर्सा के बराबर है। और हां, मैं अपेक्षित position += speed * (float)gt.ElapsedGameTime.TotalSeconds;कोड सहित हूं ।

यह शायद एक बड़ा रूखे सवाल है, लेकिन मैं सिर्फ इस की परिभाषा पर बिल्कुल स्पष्ट होना चाहता हूं।


मुझे लगता है कि आपका मतलब था position = speed * ...TotalSeconds। ध्यान दें यह =नहीं है +=। यदि यह +=आपके टाइप करने के समान था, तो आपकी स्थिति लगभग तुरंत स्क्रीन से उड़ जाएगी।
DrZ214

मेरे पास कोड है जो 'स्थिति + = दिशा * गति * ... कुल मिलाता है' जैसा दिखता है और यह बहुत अच्छी तरह से काम करता है। मैं कुछ गलत हो सकता है, लेकिन स्थिति = गति इसे हर अद्यतन प्रदान करेगा। आपका तरीका काम कर सकता है, लेकिन मेरा कोड इस तरह काम कर रहा है। (ध्यान दें कि दिशा सामान्यीकृत है)
शाइ गय

मैंने सोचा था gt.ElapsedGameTime.TotalSecondsकि कार्यक्रम (खेल) शुरू करने से कुछ सेकंड की संख्या है। यदि आप अपनी गति को उससे बढ़ा रहे हैं, तो 5 सेकंड खेलने के बाद, आपकी गति 5 गुना तेज होगी (विशेष मामले को छोड़कर जहां गति 0 पर सेट है)। निश्चित नहीं कि आपके पास और क्या हो सकता है जो उस असत्य को बना देगा, लेकिन मैं अंतर्विरोधी हूं।
DrZ214

1
अहा, यह आखिरी अपडेट के बाद से है। gamedev.stackexchange.com/questions/67968/…
शर्मीली गाय

2
आकर्षक मुझे लगता है कि कभी नहीं होगा। सेकंड में ऐसी किसी चीज की कभी आवश्यकता नहीं थी, क्योंकि मैं व्यक्तिगत रूप से अपने स्वयं के चर का उपयोग करता हूं, जिसे iiiमैं मैन्युअल रूप से हर अपडेट बढ़ाता हूं, क्योंकि मैं इसे सेकंड में नहीं चाहता हूं, मुझे कदम या फ्रेम चाहिए। मैं देख सकता हूं कि आपका रास्ता नरम-कोडिंग चीजों का एक मान्य तरीका है।
DrZ214

जवाबों:


102

क्या यह आपके खेल की दुनिया की स्थिति को बदल देता है? यह लॉजिक कोड है।

क्या यह खेल की स्थिति को प्रदर्शित करता है? यह कोड प्रदान कर रहा है।


मैं अपने कोड के माध्यम से 100% निश्चित होना चाहूँगा। अच्छी व्याख्या, धन्यवाद।
शाइ गाइ

38
क्या यह इनपुट संभालता है? इसका कंट्रोलर कोड है। तर्क से अलग नियंत्रण, ताकि आप विभिन्न प्रकार के नियंत्रणों के साथ एक ही तर्क का उपयोग कर सकें। जैसे एक FPSInputController + CharacterMotor बनाम AIInputController + CharacterMotor बनाम NetworkInputController (एक मल्टीप्लेयर उदाहरण में अन्य खिलाड़ी) + चरित्रमाटर। मोटर (लॉजिक कोड) परवाह नहीं करता है कि इसे कैसे निर्देश मिलते हैं, केवल यह कि वे आपूर्ति कर रहे हैं (इस तरह के डिकॉउलिंग से खिलाड़ी को एआई बॉट में आसानी से संक्रमण की अनुमति मिलती है (लेफ्ट 4 डेड और निष्क्रिय खिलाड़ी) और पीछे) अन्य बातों के अलावा)।
ड्रेको 18

10
ड्रेको एक अच्छा बिंदु लाता है। कई अलग-अलग डिवीजन हैं जो आप कोड में डाल सकते हैं। निल्स का विभाजन वह है जो मैं तर्क और प्रतिपादन के बीच के कट्टरपंथी विभाजन पर विचार करूंगा, लेकिन कई अन्य परतें हैं जो आप देखेंगे। उन्हें परतों में अलग करने का असली कारण यह है कि प्रत्येक परत में समान क्रियाएं होती हैं जिनके लिए समान आवश्यकताओं के साथ समान शैली की कोड की आवश्यकता होती है। उदाहरण के लिए, कई खेलों में, आप गेम लॉजिक को पूरा करने के लिए 2 या 3 फ्रेम ले सकते हैं, लेकिन यदि आप प्रत्येक फ्रेम को रेंडर नहीं करते हैं, तो उपयोगकर्ता की आंख जल्दी से नोटिस करेगी।
Cort Ammon

उन्हें अलग रखने से आपको अपनी आवश्यकताओं का प्रबंधन करने में मदद मिलेगी जब वे तनाव का स्रोत बनने लगते हैं।
Cort Ammon

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

24

आपका अलगाव सही है अगर:

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

5
Draw()समय बीतने के साथ उचित रूप से लिखे गए विभिन्न चित्र खींच सकते हैं। उदाहरण के लिए, एनिमेटेड स्प्राइट्स के फ्रेम बदलना जारी रख सकते हैं। इसके अलावा, ऑब्जेक्ट्स आगे बढ़ना जारी रख सकते हैं यदि रेंडरिंग कोड एक सामान्य ट्रिक का उपयोग करता है और velocity * time since last update / period of updateवस्तुओं की दृश्य स्थिति में जोड़ता है (जबकि उनकी वास्तविक स्थिति अपरिवर्तित रहती है)।
होलीब्लैककैट

2
iffमतलब अगर और-ही-अगर?
बालिनकििंगऑफ़ोरिया

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

@SeanMiddleditch मैं सहमत हूँ, लगभग हमेशा आप Draw()इस तरह से लिख सकते हैं इसलिए यह हमेशा एक ही चित्र खींचता है जब कई बार एक पंक्ति में बुलाया जाता है। यदि संभव हो तो ऐसा करना चाहिए। लेकिन ऐसे मामले हैं जब आप नहीं जानते कि किस आवृत्ति Draw()को कहा जाएगा। उदाहरण के लिए, यदि आप नए 120hz मॉनिटर के लिए पूर्ण समर्थन (वास्तविक 120 FPS) चाहते हैं और आप vsync चालू करते हैं। What if I want to pause graphics?फिर आप वास्तविक डेल्टा समय के बजाय 0 पास करते हैं Draw()
होलीब्लैककट

2
@HolyBlackCat: कुछ भी नहीं मुझे 120hz प्रतिपादन का उपयोग करना होगा। मैं निश्चित रूप से एक निश्चित ड्रॉ दर की सिफारिश नहीं कर रहा था; वह सिर्फ शौकिया है। एक वैश्विक गेम क्लॉक होनी चाहिए जिसका डेल्टा रेंडर फ्रेम के संदर्भ में मापा जाता है जो फिक्स्ड-रेट लॉजिक टिक के लिए संचय मूल्य में फीड होता है। वह वैश्विक घड़ी ग्राफिक्स को प्रक्षेपित करता है, जिसमें प्रक्षेप भी शामिल है। आप घड़ी पैमाने को सेट करके ग्राफिक्स को रोक सकते हैं 0। आपके पास पदानुक्रमित घड़ियाँ हो सकती हैं, जैसे कि यूआई अभी भी चलता है और एनिमेट करता है जबकि चरित्र प्रक्षेप रुकता है, बहुत आसानी से।
शॉन मिडिल्डिच

7

यहां बिंदु उन मॉडल चीजों को अलग करना है जो मॉडल नहीं हैं।

गेम लॉजिक मॉडल के रूप में संदर्भित है

ये सभी अलग-अलग, संबंधित, सॉफ्टवेयर आर्किटेक्चर पैटर्न हैं। लेकिन सभी मामलों में मॉडल एक ही बात है कि यह वास्तविक तर्क और वास्तविक स्थिति है।

यह व्यवसाय सॉफ़्टवेयर बनाते समय इसे कभी-कभी व्यावसायिक तर्क कहा जाता है, और कुछ व्यावसायिक नीतियों को इनकोड किया जाता है। उदाहरण के लिए, यदि आपका बैंक क्रेडिट कार्ड के बिलों की गणना करने के लिए किसी चीज का कोडिंग कर रहा है, तो किसी को 30 दिनों से कम समय में अपना ऋण चुकाने के लिए किसी को ब्याज नहीं देना पड़ता है, यह व्यवसायिक तर्क का हिस्सा है, यह रहता है आदर्श। यह उदाहरण के लिए प्रदर्शित परतों में से एक पर नहीं रहता है। एक बिल को प्रिंट करने के लिए कोड, उदाहरण के लिए, उनके कार्यों के आधार पर पाठ को संपादित नहीं करता है। यह उदाहरण शायद इस बात पर प्रकाश डालता है कि आप अपने कोड को इस तरह व्यवस्थित क्यों करना चाहते हैं।

गेम लॉजिक के लिए भी ऐसा ही है।

कल्पना कीजिए कि किसी समय आपका गेम दूसरे कंसोल में पोर्ट किया गया था। यह आपके वर्तमान लक्ष्य के लिए वास्तव में कुछ अलग कल्पना करने में मदद कर सकता है। उदाहरण के लिए, यदि आप गेमपैड / कंट्रोलर के साथ कुछ काम कर रहे हैं, तो अपने गेम को टचस्क्रीन टैबलेट में पोर्ट करने की कल्पना करें। गेम लॉजिक उस कोड का हिस्सा है जिसे आप पोर्ट करते समय नहीं बदलते हैं।

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

खेल तर्क वह चीज है जो कभी बदलता नहीं है, चाहे कोई भी रूप हो।

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