क्या मैं और कैसे, इनपुट और गेम ऑब्जेक्ट की चिंताओं को अलग करता है?


20

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

  • खेल ऑब्जेक्ट को स्वयं इसे संभालने दें, घटनाओं की सदस्यता लें और इसे अपने तरीके से कॉल करें। यह गेम-ऑब्जेक्ट्स को स्वयं निर्णय लेने का लाभ देता है कि कौन सा इनपुट किस क्रिया का कारण बनता है। एक नुकसान यह प्रतीत होता है कि इनपुट कोड "कोर" गेम ऑब्जेक्ट कोड के साथ उलझ गया है। इसके अलावा खेल की वस्तुएं बाकी खेल की स्थिति से अनजान हैं, और कभी-कभी इनपुट घटनाओं पर कार्रवाई नहीं करनी चाहिए। यह सही नहीं लगता।

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

इसे संभालने के लिए आप किन रणनीतियों का उपयोग कर रहे हैं?

जवाबों:


7

मैं गेम ऑब्जेक्ट्स से इनपुट ईवेंट को अलग करने की सलाह देता हूं ताकि आप 10 ऑब्जेक्ट कक्षाओं को संपादित और डीबग किए बिना इनपुट मेथोडोलॉजी को जल्दी से बदल सकें / अपग्रेड कर सकें। कीबोर्ड-केवल नियंत्रण से माउस + कीबोर्ड पर शिफ्ट होने या उदाहरण के तौर पर कुंजी को पुन: असाइन करने के उदाहरण हैं।

व्यक्तिगत गेम ऑब्जेक्ट्स पर कसकर युग्मन इनपुट के बजाय, गेम ऑब्जेक्ट पर अद्वितीय इनपुट सिग्नल प्रति केवल एक विधि को कॉल करें, और इसे निष्पादित करने का तरीका तय करें।

इनपुट स्थिति का ट्रैक रखने के लिए एक इनपुट नियंत्रक का उपयोग करें:

Up press event   -> dir = up
Down press event -> dir = down

जब भी इनपुट स्थिति में परिवर्तन होता है, मूल्यांकन करें कि क्या गेम ऑब्जेक्ट संशोधित होने के लिए तैयार हैं:

set dir  ->  if gamestate != paused && battlemode == false
             ->  character.changeDir(dir);

अपने गेम ऑब्जेक्ट्स पर सामान्य तरीकों को लागू करें, जिन्हें इनपुट नियंत्रक या आवश्यकतानुसार अन्य गेम ऑब्जेक्ट द्वारा कॉल किया जा सकता है:

changeDir (dir)
setSpeed (walk/run)

7

मैं एमवीसी दृष्टिकोण की सिफारिश करता हूं। MVC में गेम ऑब्जेक्ट्स को केवल गेम सिस्टम मॉडलिंग के बारे में चिंता करना पड़ता है, और एक उच्च स्तरीय इंटरफ़ेस जैसे Move_left प्रदान करते हैं। फिर एक नियंत्रक ऑब्जेक्ट होता है जो मॉडल कॉल के लिए मैपिंग इनपुट के बारे में चिंता करता है। इतना ही नहीं यह नियंत्रण के आसान परिवर्तन के लिए अनुमति देता है, यह एआई के लिए एक अच्छा इंटरफ़ेस देता है वे सिर्फ एक और नियंत्रक हैं।

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


5
इस साइट पर कहीं और बहुत चर्चा है कि एमवीसी आमतौर पर खेलों के लिए एक उपयुक्त पैटर्न क्यों नहीं है; क्या पत्थरबाज़ी का वर्णन MVC भी नहीं है, यह सिर्फ अमूर्तता है; और "एमवीसी का उपयोग करें" एक जवाब नहीं है, क्योंकि एमवीसी आर्किटेक्चर की एक पूरी कक्षा का वर्णन है और चिंताओं को अलग करने का एक विशेष तरीका नहीं है (न ही इसे करने का एकमात्र तरीका)।

2
एमवीसी को उसे ए) बी पढ़ने के लिए एक विकिपीडिया लेख देना चाहिए) सी पर काम करने के लिए दिखाए गए समाधान के दृष्टिकोण के लिए कई विविधताएं) मैं उस तरीके का उल्लेख करता हूं जहां मैं इसे स्थापित करूंगा जहां मॉडल एक उच्च स्तरीय इंटरफ़ेस को उजागर करता है नियंत्रक उच्च स्तर की कार्रवाई के लिए निम्न स्तर के इनपुट (वास्तविक या सिंथेटिक) को मैप करता है और सीधे कुछ इवेंटिंग सिस्टम के बजाय मॉडल में हेरफेर करता है।
पत्थरबाज़ी

1

मैं आपके गेम ( मॉडल ) को संभव इनपुट घटनाओं की सूची बनाना (सामान्य रूप में आधार इंटरफ़ेस के साथ एनम या ऑब्जेक्ट के रूप में कार्यान्वित) बनाने की सलाह दूंगा। जैसे हालात MovingRightStarted, MovingRightStopped, FiredWeapon1, Escape, आदि ...

खेल एक डेटा संरचना (उदाहरण के लिए queue) को परिभाषित करता है जो आपके इनपुट कोड ( नियंत्रक ) इनपुट घटनाओं से भर सकता है।

फिर आपका गेम इनपुट घटनाओं को प्राप्त करने के लिए डेटा संरचना को प्रदूषित कर सकता है।

इस तरह, आप मॉडल को खिलाने के लिए विभिन्न प्रकार के नियंत्रकों को प्लग कर सकते हैं:

  • केवल कीबोर्ड
  • कीबोर्ड + माउस
  • जोस्टिक
  • टच स्क्रीन
  • कृत्रिम होशियारी

आपको बस उन्हें इनपुट ईवेंट को मॉडल पर धकेलना होगा।


मुझे लगता है कि मुझे समझ में आ गया है कि आपके पास इसका मतलब क्या है, queueइसे स्टोर करने के लिए एक डेटाटाइप के विकल्प के अलावा । क्या आप बता सकते हैं कि क्यों?
रॉबर्ट मास

अच्छी तरह से मॉडल से 2 इनपुट इवेंट पोलिंग के बीच, नियंत्रक ने कई एक्शन इवेंट्स को धक्का दिया हो सकता है, और उपयोगकर्ता इनपुट के क्रम को बनाए रखना महत्वपूर्ण है। यही कारण है कि मैंने एक FIFO डेटा संरचना को चुना। वास्तव में आपको यह निर्दिष्ट करने की आवश्यकता हो सकती है कि इनपुट कितने सटीक समय पर हुआ।
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.