कैमरा / व्यूपोर्ट को 2 डी गेम में लागू करना


21

2 डी गेम में कैमरा / व्यूपोर्ट को लागू करने का सबसे व्यावहारिक तरीका क्या है?

मैंने पढ़ा है, कि मुझे स्क्रीन के सापेक्ष स्थिति के बजाय ऑब्जेक्ट वर्ल्ड पोजिशन को स्टोर करना चाहिए ?

वर्तमान स्थिति:

मैंने एक साधारण 2 डी गेम लागू किया है जहां मैं एक्सएमएल-फाइलों से वस्तुओं और स्तरों को लोड करता हूं। वर्तमान में स्तर XML फ़ाइल इस तरह दिखती है:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

सभी वस्तुओं में 2d-वेक्टर "स्थिति" है जो स्क्रीन पर अपने वर्तमान स्थान को संग्रहीत करता है।

मैं यह क्या चाहता हूँ:

व्यूपोर्ट / गेमवर्ल्ड चित्रण

चित्र में:

  • कैमरा या तो 800x600 या 640x480 है
  • ब्लॉक और स्प्राइट 16x16 पिक्सेल हैं।
  • दुनिया का आकार भिन्न हो सकता है
  • निर्देशांक शायद दुनिया के सापेक्ष सामान्यीकृत होना चाहिए, स्क्रीन के लिए नहीं?
  • जब खिलाड़ी कैमरा डेड जोन ( इस वीडियो के समान ) में पहुंचता है, तो खिलाड़ी की x, y और चाल के सापेक्ष व्यूपोर्ट स्थिति ।

मैं छद्म उदाहरण / लेख पूछ रहा हूं, लेकिन अगर आपको यह जानने की जरूरत है कि मैं विकास के लिए क्या उपयोग कर रहा हूं: एसडीएल और सी / सी ++।


1
यहाँ टिप्पणियों में अपना तीसरा लिंक जोड़ें और मैं इसे आपके प्रश्न में जोड़ सकता हूं।
MichaelHouse

यहाँ कैमरा डेड ज़ोन के साथ मेरा क्या मतलब है: youtube.com/watch?v=89TRXUm8jMI
bluekirai


हैलो @ अरथ वुल्फ व्हाइट, देखभाल करने के लिए विस्तृत? धन्यवाद।
ब्लूकिरी

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

जवाबों:


20

आपको स्क्रीन के बजाय दुनिया के सापेक्ष हर वस्तु को रखने की आवश्यकता है। आपके कैमरे का अपना विश्व निर्देशांक भी होना चाहिए ताकि इसे दुनिया में किसी सापेक्ष स्थिति में खींचा जा सके। आपके कैमरे का किसी ऑब्जेक्ट का अनुसरण करना सुविधाजनक भी हो सकता है, इसलिए जहां भी ऑब्जेक्ट है, कैमरा सिर्फ अपने निर्देशांक का उपयोग करता है। आमतौर पर कैमरे के निर्देशांक इसे ऊपरी बाएं कोने से स्थिति देंगे। इसका मतलब है कि कैमरे में लगभग (0,24) की विश्व स्थिति होगी तस्वीर

जैसा कि वास्तव में वस्तुओं को कैमरे द्वारा "देखने" के लिए आकर्षित किया जाता है, आपको कैमरे की दुनिया के निर्देशांक के सापेक्ष सभी वस्तुओं को खींचना होगा। कैमरे के सापेक्ष किसी वस्तु की स्क्रीन स्थिति की गणना करने के लिए, बस करें:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

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


2

यह दुनिया में और दृश्य मैट्रिक्स का उपयोग करके GPU में यह सब करने के लिए सबसे अच्छा है, कि आप सीपीयू पर वस्तुओं को संशोधित करके संशोधित करते हैं।

इस तरह, आप कैमरे को मनमाने ढंग से बदल सकते हैं (यहां तक ​​कि इसे ज़ूम इन और आउट भी कर सकते हैं!) और यह सिर्फ जादुई रूप से काम करेगा। आप ड्रॉ समय पर बचत करने के लिए अभी भी पुलिंग देख सकते हैं। और आपके द्वारा दृश्य और विश्व मैट्रिसेस को सही तरीके से सेट करने के बाद दुनिया को आकर्षित करने के लिए आपके किसी भी कोड को बदलना नहीं पड़ेगा।

एसडीएल में, आप शायद ओपनलाइन कॉल जैसे इनलाइन glOrthoऔर इनलाइन कर सकते हैंglTranslate

इस धागे को देखें ।


क्या कोई नीच को समझा सकता है? यह समझ में आता है।
हैलो वर्ल्ड

1
मैंने वोट नहीं डाला, लेकिन मुझे लगता है कि यह इस सवाल का जवाब नहीं देता है। सवाल यह है कि किसी चीज़ की गणना कैसे की जाए, यह नहीं कि यह GPU बनाम CPU पर करना अधिक कुशल या आसान है। ओपी ने यहां तक ​​कहा कि वह छद्म उदाहरणों की तलाश में है। इसमें कोई शक नहीं है कि कैमरा / वर्ल्ड / मॉडल मैट्रिसेस के संयोजन का उपयोग करना अधिक कुशल होगा, इसलिए एमकलिंगन में एक बिंदु कम से कम है।
डैन वॉटकिंस

यह जवाब बुरा नहीं है! यह OpenGL / DX के विकास के लिए अधिक विशिष्ट है, लेकिन इसका सही तरीका यह है कि आप कैमरा कोरर्स पर आधारित अनुवाद मैट्रिक्स की गणना कर सकते हैं और कैम मैट्रिक्स के माध्यम से वस्तुओं को स्थानांतरित कर सकते हैं, बिना उनकी वास्तविक स्थिति को बदले।
nenchev
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.