OOP के बिना गेम कैसे बनाये? [बन्द है]


10

मैं खेल के विकास का अध्ययन कर रहा हूं और खेल बना रहा हूं।

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

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

मेरे लिए यह कल्पना करना कठिन है कि एक गेम (जो कि पीएसी-मैन से अधिक जटिल है) को गैर-ओओ भाषा में कैसे प्रोग्राम किया जा सकता है। (पाठ्यक्रम के गैर-ऊ कार्यक्रमकर्ताओं के लिए कोई अनादर नहीं)। न केवल इसमें कितना समय लगेगा, बल्कि ज्यादातर इस बात के संदर्भ में है कि किसी गेम को इस तरह से कैसे डिजाइन किया जा सकता है।

मैं ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग का उपयोग किए बिना गेम डिजाइन करने की कल्पना नहीं कर सकता, क्योंकि गेम-प्रोग्राम को कैसे डिज़ाइन किया जाए, इसकी मेरी पूरी समझ OOP पर आधारित है।

मैं पूछना चाहूंगा: आज, क्या कोई गेम है जिसे ओओपी का उपयोग करके क्रमबद्ध नहीं किया गया है, जो कि मैंने ऊपर वर्णित किया है? क्या कोई 'प्रोफेशनल' गेम हैं जो ओओपी को विकास प्रक्रिया में एक प्रमुख कारक के रूप में उपयोग नहीं करते हैं?

यदि हां, तो क्या आप मुझे इस बात का अंदाजा दे सकते हैं कि, उदाहरण के लिए, OOP के बिना, एक टैंक और N नंबर की मिसाइलों के बीच टकराव का पता कैसे लगाया जा सकता है?


6
क्या यह एक दार्शनिक प्रश्न है? यहां तक ​​कि अगर आप अपने टैंकों को "ऑब्जेक्ट" नहीं कहते हैं, तो आप शायद "एंटिटीज़", "एक्टर्स", "एजेंट्स", "स्ट्रक्चर्स" या सिर्फ कुछ अन्य नाम चाहते हैं एक ही विचार के लिए , जो एक संग्रह है विशेषताएँ और व्यवहार जो एक बुर्ज के साथ घूमने वाली क्यूबॉइड चीज़ बनाते हैं जो चीजों को शूट कर सकते हैं, एक टैंक कहलाता है। प्रोग्रामिंग भाषाओं में इस एक ही विचार को औपचारिक रूप देने के विभिन्न तरीके होंगे, लेकिन अंत में, यह एक टैंक बनने जा रहा है।
Anko

कई गेम एक घटक-आधारित प्रणाली का उपयोग करते हैं क्योंकि यह उत्तर बताता है: gamedev.stackexchange.com/a/31491/9366
जॉन मैकडॉनल्ड

यह दोनों अत्यधिक व्यापक है (जिसे आप संभवतः दायरे को कम करके ठीक कर सकते हैं) और वास्तव में गेम डेवलपमेंट के लिए विशिष्ट नहीं है (क्योंकि OO तकनीकों के बिना सॉफ़्टवेयर का निर्माण करना कोई ऐसी चीज़ नहीं है जो गेम डेवलपर आपको किसी अन्य सॉफ़्टवेयर डेवलपर की तुलना में बेहतर उत्तर देगा), जो यहाँ विषय को बंद कर देता है, मुझे डर है।

यह StackOverflow के लिए उपयुक्त हो सकता है, या आप बाहर की जाँच कर सकते हैं खेल-विकास विशिष्ट (GDNet जैसे) साइटों का चयन खोजने के सहायता केंद्र की हैं जो इस तरह के व्यापक, चर्चा-उन्मुख विषय की अनुमति देगा। सौभाग्य!

जवाबों:


16

मैं ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग का उपयोग किए बिना गेम डिजाइन करने की कल्पना नहीं कर सकता, क्योंकि गेम-प्रोग्राम को कैसे डिज़ाइन किया जाए, इसकी मेरी पूरी समझ OOP पर आधारित है।

फिर गैर-ओओ शैली में कुछ कार्यक्रम लिखने की कोशिश करना आपके लिए शायद अच्छा होगा। यहां तक ​​कि अगर आपको पता चलता है कि यह आपके लिए व्यावहारिक नहीं है, तो आप शायद इस तरह से बहुत कुछ सीखेंगे जो भविष्य में आपकी मदद करेगा।

खेल के लिए OO शैली बहुत अच्छी तरह से अनुकूल है क्योंकि खेल लगभग हमेशा राज्य वस्तुओं के हेरफेर के बारे में हैं। एक लेजर किरण रोबोट से टकराती है और रोबोट की स्थिति बदल जाती है जबकि उसकी पहचान वही रहती है।

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

कार्यात्मक प्रोग्रामिंग में प्रत्येक फ़ंक्शन को अपने रिटर्न मूल्य की गणना केवल पास की गई जानकारी से करनी चाहिए; "ग्लोबल स्टेट" से कोई रीडिंग नहीं है।

यदि आप ऐसा करते हैं, तो आपको अपने सिर के माध्यम से जो मूलभूत समस्या उठानी होगी, वह यह है कि हर अपडेट गैर-विनाशकारी है । जब लेजर रोबोट को हिट करता है तो आप रोबोट की स्थिति को नहीं बदलते हैं। अंतत: आप पुराने ब्रह्मांड के समान एक बिल्कुल नए ब्रह्मांड की गणना करते हैं, सिवाय इसके कि रोबोट की एक अलग स्थिति है; यदि आपको उस पुराने ब्रह्मांड की आवश्यकता है, तो यह अभी भी अपरिवर्तित है।

ब्लॉग लेखों की इस श्रृंखला में कार्यात्मक शैली में खेल लिखने पर अधिक विचार हैं:

http://prog21.dadgum.com/23.html

यह लेख विशेष रूप से आपके "शेल हिट ए टैंक" प्रश्न को संबोधित करता है:

http://prog21.dadgum.com/189.html

वास्तव में, बस पूरे ब्लॉग को पढ़ें। वहाँ अच्छा सामान है और लेख कम हैं।


12

किसी भी ऑब्जेक्ट-ओरिएंटेड प्रोग्राम को सभी वर्गों को संरचनाओं के साथ बदलकर और सभी सदस्य-फ़ंक्शंस को स्टैंड-अलोन फ़ंक्शन में परिवर्तित करके एक प्रक्रियात्मक कार्यक्रम के लिए फिर से तैयार किया जा सकता है। this को तर्क के रूप में ।

इसलिए

 missile.setVelocity(100);

हो जाता है

 setMissileVelocity(missile, 100);

या जब वह फ़ंक्शन तुच्छ हो, तो आप बस करें

 missile.velocity = 100;

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

जब आप संरचनाओं को बहुत ऑब्जेक्ट-ओरिएंटेड मानते हैं, तो आप एक सरणी को कई सरणियों के साथ बदल सकते हैं, एक सब कुछ के लिए जो एक मिसाइल का एक चर होगा। इसलिए

struct Missile {
     int x;
     int y;
     int velocity;
}

Missile missiles[256];

हो जाता है

int missileX[256];
int missileY[256];
int missileVelocities[256];

इस डिजाइन में, एक फ़ंक्शन जो एक ही मिसाइल पर कई विशेषताओं को शामिल करने वाला एक ऑपरेशन करता है, अब एक संरचना के संदर्भ के बजाय एक सरणी सूचकांक ले जाएगा। इसका कार्यान्वयन इस तरह दिखेगा:

function updateMissilePosition(int index) {
     missileX[index] += missileVelocity[index];
}

1
लेकिन missileएक वस्तु का एक उदाहरण है। गैर-ओओपी में, कोई उदाहरण नहीं हैं, क्या मैं सही हूं? यदि हां, तो आप कैसे कर सकते हैं setMissileVelocity (मिसाइल, 100)?
user3150201

1
@ user3150201 आप पूरी तरह से सही नहीं हैं। अधिकांश गैर-ओओपी भाषाएँ (और मैं केवल किसी भी गंभीर खेल के विकास के लिए उपयुक्त के बारे में बहस करूँगा) संरचनाओं का समर्थन करता है। एक संरचना एक वर्ग की तरह है, बस इसमें सार्वजनिक चर के अलावा कुछ भी नहीं है। तो यह आप के लिए एक प्रकार बनाने के लिए अनुमति होगी Missile, जो कई क्षेत्रों, जैसे के साथ एक संरचना है x, y, angleऔर velocity
फिलिप

@ user3150201 संरचनाओं के बिना इसे कैसे करें के बारे में एक अनुभाग के साथ अपडेट किया गया उत्तर।
फिलिप

अच्छा जवाब फिलिप, हालांकि, मुझे समझ नहीं आता कि कोई ऑब्जेक्ट-ओरिएंटेड प्रोग्राम क्यों नहीं करना चाहता है। गैर-ओओपी भाषाओं को पढ़ना वास्तव में कठिन है, और यह निराशाजनक हो सकता है। कुछ ही समय में कोड गड़बड़ हो सकता है।
ज़फ़र

2
@ ज़फ़र आप जानते हैं कि आपका बयान एक व्यापक लौ है, क्या आप?
फिलिप

6

मैं इसे निम्नानुसार करता हूं:

  • सभी ओओपी वर्गों / विधियों तक पहुंच है thisthisगैर-ओओ दृष्टिकोण में उपयोग करने के लिए , बस जो भी उदाहरण हो (अगले बिंदु देखें) thisपहले पैरामीटर के रूप में होना चाहिए।
  • अब, उदाहरण के लिए, आप structअपने कार्यों में एस पास कर सकते हैं this, लेकिन मैं उन वस्तुओं के लिए अच्छा कैश प्रदर्शन प्राप्त करने का सबसे अच्छा तरीका ढूंढता हूं, जो विपुल हैं, जैसे कि निकाय या कण, आदिम की कई सरणियों में एक ही इंडेक्स पास करना है। या छोटे structएस। इसलिए इस इंडेक्स का उपयोग मूल वर्ग के प्रत्येक व्यक्तिगत डेटा सदस्य के लिए किया जाता है। उदाहरण के लिए यदि आपके पास था

...

class Entity //let's say you had 100 instances of this
{
   int a;
   char b;
   function foo() 
   {
      .../*can access 'this' herein*/
   }
}

आप इसके साथ प्रतिस्थापित करेंगे

int a[100];
char b[100];
function foo(int index);

ताकि अब आप फ़ंक्शन में एक इंडेक्स पास कर रहे हैं ताकि आमतौर पर क्या हो this

मन आप ऊपर, के रूप में पुरातन के दोनों सरणियों का उपयोग करना चाहते हो सकता है कि में भालू या के एरे structअच्छा कैश इलाके (संदर्भ के इलाके) के लिए अपने डेटा को बिछा करने के लिए कैसे सबसे अच्छा के आधार पर, रों। बेशक, सभ्य कैश प्रदर्शन इस पर बहुत अधिक निर्भर करता है - विशेष रूप से, आप किस भाषा / मंच पर अपना कोड लिख रहे हैं - लेकिन यहां तक ​​कि वीएम-आधारित, गतिशील रूप से आवंटित जावा जैसी भाषाओं में, आदिम की बड़ी रेखीय सरणियाँ होती हैं। ऑब्जेक्ट इंस्टेंस की तुलना में बेहतर प्रदर्शन विशेषताओं को प्रदर्शित करता है। इसका मुख्य कारण यह है कि ऑब्जेक्ट्स को संदर्भ द्वारा एक्सेस किया जाता है और इसका मतलब है कि आप डेटा तक पहुंचने के लिए सभी मेमोरीज़ को जंप कर रहे हैं - एक बड़े एरे से कन्टिन्यूअसली एक्सेस करने की तुलना में अक्षम।

संरचनाओं या आदिमों की सरणी के रूप में निर्माण संस्थाओं आदि के बारे में अधिक जानकारी के लिए, मिक वेस्ट के विकास को अपने पदानुक्रम में देखें


0

मौजूदा उत्तरों के अलावा आप जानना चाहते हैं कि प्रक्रियात्मक भाषा में बहुरूपता कैसे किया जा सकता है।

दो दृष्टिकोण हैं:

प्रकार का भंडारण

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

दूसरा तरीका है:

समारोह संकेत भंडारण

आपने यह नहीं बताया कि आपको किस प्रोग्रामिंग लैंग्वेज का अनुभव है, लेकिन विभिन्न भाषाओं में उन्हें कॉलबैक, डेलिगेट्स, इवेंट्स या हाई ऑर्डर फ़ंक्शंस या बस फंक्शन ऑब्जेक्ट्स भी कहा जाता है।

इस स्थिति में आप एक प्रकार का संग्रह नहीं करेंगे, लेकिन एक पॉइंटर / संदर्भ को किसी फ़ंक्शन में संग्रहीत करते हैं जो विशेष क्रिया करता है। जब विशिष्ट प्रकार की कार्रवाई करने की आवश्यकता होती है, तो आप बस इस फ़ंक्शन को कॉल करते हैं। यह साधारण आभासी तरीकों की तरह दिखता है।

प्रत्येक फ़ंक्शन को स्वतंत्र रूप से सेट करने की अनुमति देकर आपको रणनीति पैटर्न मुफ्त मिलता है ।


टक्कर का पता लगाने के साथ अपने अंतिम पैराग्राफ के बारे में। मुझे लगता है कि आपके पास संभवतः कई प्रकार के टैंक हैं और आपके पास कई प्रकार की मिसाइलें हैं, और प्रत्येक संयोजन संभवतः एक अलग परिणाम हो सकता है जब वे टकराते हैं। यदि यह वह है जिसे आप खोजते हैं, तो आपके पास एक समस्या है जो अभी तक ओओपी भाषाओं द्वारा हल नहीं की गई है: कई प्रेषण और बहु-विधियाँ thisजिनमें विभिन्न प्रकार के कई पैरामीटर हो सकते हैं । इस समस्या के लिए फिर से दो विकल्प हैं:

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