इस ट्यूटोरियल का उद्देश्य 2 डी गेम प्रोग्रामिंग और सी-भाषा को उदाहरणों के माध्यम से सिखाना है। लेखक 1980 के दशक के मध्य में खेल का कार्यक्रम करता था और 90 के दशक में एक वर्ष के लिए माइक्रोप्रो में एक गेम डिजाइनर था। हालाँकि यह बहुत कुछ आज के बड़े 3 डी गेम की प्रोग्रामिंग के लिए प्रासंगिक नहीं है, छोटे आकस्मिक खेलों के लिए यह एक उपयोगी परिचय के रूप में काम करेगा।
साँप को लागू करना
सांप की तरह के खेल जहां ऑब्जेक्ट 2 डी क्षेत्र में बढ़ रहे हैं, खेल वस्तुओं को या तो 2 डी ग्रिड में या वस्तुओं के एकल आयाम सरणी के रूप में दर्शा सकते हैं। "ऑब्जेक्ट" यहां किसी भी गेम ऑब्जेक्ट का अर्थ है, ऑब्जेक्ट नहीं जैसा कि ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में इस्तेमाल किया गया है।
खेल नियंत्रण
चाबियाँ डब्ल्यू = अप, ए = बाएं, एस = डाउन, डी = दाएं के साथ चलती हैं। गेम को छोड़ने के लिए Esc दबाएं, फ्रेम रेट को टॉगल करने के लिए f (यह डिस्प्ले के लिए सिंक्रोनाइज़ नहीं है इसलिए फास्ट हो सकता है), डीबग जानकारी को टॉगल करने के लिए टैब कुंजी और इसे पॉज करने के लिए p करें। जब यह कैप्शन बदलता है और सांप फड़कता है,
साँप में मुख्य खेल वस्तुएं हैं
- सांप
- जाल और फल
गेमप्ले के प्रयोजनों के लिए, प्रत्येक गेम ऑब्जेक्ट (या साँप के लिए भाग) में एक सरणी इन्ट्रैस धारण करेगा। स्क्रीन बफर में ऑब्जेक्ट्स को रेंडर करते समय यह भी मदद कर सकता है। मैंने गेम का ग्राफिक्स इस प्रकार बनाया है:
- क्षैतिज सांप शरीर - 0
- वर्टिकल स्नेक बॉडी - 1
- 4 x 90 डिग्री के रोटेशन में हेड 2-5
- 4 x 90-डिग्री घुमाव में पूंछ 6-9
- दिशा परिवर्तन के लिए घटता। 10-13
- सेब - 14
- स्ट्राबेरी - 15
- केला - 16
- ट्रैप - 17
- साँप ग्राफिक्स फ़ाइल snake.gif देखें
तो, यह इन मूल्यों को ब्लॉक [WIDTH * HEIGHT] के रूप में परिभाषित ग्रिड प्रकार का उपयोग करने के लिए समझ में आता है। चूंकि ग्रिड में केवल 256 स्थान हैं, इसलिए मैंने इसे एकल आयाम सरणी में संग्रहीत करने के लिए चुना है। 16 x16 ग्रिड पर प्रत्येक समन्वय एक पूर्णांक 0-255 है। हमने इनट्स का उपयोग किया है ताकि आप ग्रिड को बड़ा बना सकें। सब कुछ WIDTH और HEIGHT दोनों के साथ #defines द्वारा परिभाषित किया गया है। जैसा कि स्नेक ग्राफिक्स 48 x 48 पिक्सेल (GRWIDTH और GRHEIGHT #defines) हैं, विंडो को शुरू में 17 x GRWIDTH और 17 x GRHEIGHT के रूप में परिभाषित किया गया है जो ग्रिड से बस थोड़ा बड़ा है।
खेल की गति में इसके फायदे हैं क्योंकि दो इंडेक्स का उपयोग हमेशा एक से अधिक धीमा होता है लेकिन इसका मतलब है कि सांप के वाई निर्देशांक से 1 को जोड़ने या घटाने के बजाय लंबवत स्थानांतरित करने के लिए, आप WIDTH को घटाते हैं। सही स्थानांतरित करने के लिए 1 जोड़ें। हालांकि डरपोक होने के नाते हमने एक स्थूल l (x, y) को परिभाषित किया है जो संकलन समय पर x और y निर्देशांक को परिवर्तित करता है।
मैक्रो क्या है?
#define l (X, Y) (Y * WIDTH) + X
पहली पंक्ति इंडेक्स 0-15, दूसरी 16-31 आदि है। अगर सांप पहले कॉलम में है और बाएं घूम रहा है, तो दीवार को हिट करने के लिए चेक करें, बाएं जाने से पहले, यह जांच लें कि क्या% WIDTH == 0 का समन्वय करें और दाईं दीवार के लिए% WIDTH == WIDTH-1 का समन्वय करें। % C मापांक ऑपरेटर (घड़ी अंकगणित की तरह) है और विभाजन के बाद शेष राशि लौटाता है। 31 div 16 शेष 15 को छोड़ देता है।
साँप का प्रबंध करना
खेल में तीन ब्लॉक (int सरण) का उपयोग किया जाता है।
- साँप [], एक रिंग बफर
- आकार [] - नाग साँप ग्राफिक अनुक्रमित
- dir [] - सर्प में प्रत्येक खंड की दिशा को सिर और पूंछ सहित पकड़ता है।
खेल शुरू होने पर, सांप एक सिर और पूंछ के साथ दो खंड लंबा होता है। दोनों 4 दिशाओं में इंगित कर सकते हैं। उत्तर के लिए सिर 3 है, पूंछ 7 है, पूर्व के लिए सिर 4 है, पूंछ 8 है, दक्षिण के लिए सिर 5 है और पूंछ 9 है, और पश्चिम के लिए, सिर 6 है और पूंछ 10 है । जबकि सांप दो खंडों वाला होता है, सिर और पूंछ हमेशा 180 डिग्री अलग होते हैं, लेकिन साँप के बढ़ने के बाद वे 90 या 270 डिग्री हो सकते हैं।
खेल सिर 120 के स्थान पर उत्तर की ओर और पूंछ दक्षिण की ओर 136, लगभग मध्य में होती है। कुछ 1,600 बाइट्स के भंडारण की थोड़ी सी लागत पर, हम सांप [] रिंग बफ़र में ऊपर उल्लेखित साँप के स्थानों को पकड़कर खेल में एक बेहतर गति सुधार कर सकते हैं।
एक अंगूठी बफर क्या है?
रिंग बफ़र एक मेमोरी का एक ब्लॉक है जिसका उपयोग एक कतार के भंडारण के लिए किया जाता है जो एक निश्चित आकार है और सभी डेटा को रखने के लिए पर्याप्त बड़ा होना चाहिए। इस मामले में, यह सिर्फ सांप के लिए है। डेटा को कतार के मोर्चे पर धकेल दिया जाता है और पीछे की ओर ले जाया जाता है। यदि कतार के सामने ब्लॉक के अंत में हिट होता है, तो यह चारों ओर घूमता है। जब तक ब्लॉक काफी बड़ा हो जाता है, तब तक कतार का अग्र भाग कभी पीछे से नहीं पकड़ेगा।
सांप का प्रत्येक स्थान (यानी, एकल इंट समन्वय) पूंछ से सिर तक (यानी, पीछे की ओर) रिंग बफर में संग्रहीत होता है। इससे गति में लाभ मिलता है क्योंकि सांप को कितना भी लंबा समय हो, केवल सिर, पूंछ और सिर के बाद पहला सेगमेंट (यदि यह मौजूद है) को स्थानांतरित करने की आवश्यकता होती है।
इसे पीछे की तरफ रखना भी फायदेमंद है क्योंकि जब सांप को भोजन मिलता है, तो जब वह अगली बार चलेगा तो सांप बढ़ जाएगा। यह रिंग बफर में सिर को एक स्थान पर ले जाकर और एक खंड बनने के लिए पुराने सिर के स्थान को बदलकर किया जाता है। सांप एक सिर, 0-एन सेगमेंट) से बना है, और फिर एक पूंछ है।
जब सांप भोजन करता है, तो एटफूड चर 1 पर सेट होता है और फ़ंक्शन DoSnakeMove () में चेक किया जाता है
साँप को हिलाना
हम रिंग बफ़र में सिर और पूंछ के स्थानों को इंगित करने के लिए दो इंडेक्स चर, हेडइंडेक्स और टेलिंडेक्स का उपयोग करते हैं। ये 1 (हेडइंडेक्स) और 0 से शुरू होते हैं। तो रिंग बफर में स्थान 1 बोर्ड पर सांप का स्थान (0-255) रखता है। स्थान 0 टेल स्थान रखता है। जब सांप एक स्थान को आगे बढ़ाता है, तो दोनों टेलिंडेक्स और हेडइंडेक्स दोनों एक-दूसरे से बढ़े हुए होते हैं, जब वे 256 तक पहुंच जाते हैं तो राउंड 0 से लपेटते हैं। तो अब वह स्थान जहां सिर था, जहां पूंछ है।
यहां तक कि एक बहुत लंबे सांप के साथ, जो 200 खंडों में घुमावदार और दृढ़ है। केवल हेडइन्डेक्स, सिर के बगल वाला सेगमेंट और टेलिंडेक्स हर बार जब भी चलता है, बदल जाता है।
रास्ते की वजह से ध्यान दें एसडीएल काम करता है, हमें हर फ्रेम में पूरे सांप को खींचना है। हर तत्व को फ्रेम बफर में खींचा जाता है और फ़्लिप किया जाता है ताकि यह प्रदर्शित हो। इसका एक फायदा यह है कि इसमें हम सांप को आसानी से खींचते हुए कुछ पिक्स चल सकते हैं, न कि पूरे ग्रिड की स्थिति में।