पिक्सेल के लिए "वास्तविक इकाइयों" को स्केल करने के लिए सामान्य पैटर्न?


10

यह इस अन्य के लिए एक अनुवर्ती प्रश्न है ।

मैं यह जानना चाहूंगा कि क्या दुनिया के मेरे प्रतिनिधित्व (वर्तमान में 160Kmx160Km) को ड्राइंग क्षेत्र (वर्तमान में 800x600 पिक्सल) पर फिट करने के लिए एक सामान्य / विशिष्ट / सर्वोत्तम पैटर्न है

मैं कम से कम चार अलग-अलग तरीकों से सोच सकता हूं:

एक भोले (जिस तरह से मैंने अब तक किया था)। मैंने एक वैश्विक फ़ंक्शन लागू किया है sc(vector)जो बस पास की गई वेक्टर की एक स्केल डाउन कॉपी लौटाएगा। यह निश्चित रूप से काम करता है, लेकिन मुझे कोड लिखने के लिए बाध्य करता है:

drawCircle(sc(radius), sc(position))

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

फंक्शन डेकोरेटर । मैं बस मौजूदा मिडलवेयर फ़ंक्शंस को सजाने के लिए, सभी मापदंडों के लिए स्वचालित स्केलिंग प्रदान कर सकता हूं जो कि क्लास का एक पल है Vector3D, लेकिन समस्या यह है कि वे फ़ंक्शंस समान मापदंडों के साथ listया Vector2Dबहुत अधिक काम करते हैं, और डेकोरेटर को पता करने का कोई तरीका नहीं होगा। किन सूचियों को बढ़ाया जाना चाहिए (उदाहरण के लिए त्रिज्या) और जो नहीं (आरजीबी मान)।

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

... किसी भी तरह से: यह एक बहुत ही आम समस्या है, मुझे आश्चर्य है कि अगर कोई स्थापित पैटर्न है जो इस समस्या को हल करता है जिसे मैं खोजने में विफल रहा।

पुनश्च: इस परियोजना के लिए मैं अजगर ( pygame के साथ ) का उपयोग कर रहा हूं , लेकिन - हालांकि एक अजगर / pygame- विशिष्ट उत्तर की बहुत सराहना की जाती है, मैं इसके ठोस कार्यान्वयन के बजाय पैटर्न के सामान्य / उच्च-स्तरीय विवरण में अधिक रुचि रखता हूं।

आपके समय और विशेषज्ञता के लिए अग्रिम धन्यवाद।

जवाबों:


6

रेंडरिंग के दौरान रूपांतरण करने के लिए ट्रांसफॉर्म मैट्रिक्स को सेट करने के लिए मानक तरीका है। 3D रेंडरिंग के लिए यह कैमरा के लिए व्यू ट्रांसफॉर्म मैट्रिक्स है जो इसे करता है।

अधिकांश 2D API में व्यू ट्रांसफ़ॉर्म को निर्दिष्ट करने का एक तरीका है, या तो 2x3 मैट्रिक्स या एक अलग पैमाने, अनुवाद और रोटेशन के रूप में।

Pygame दस्तावेज़ीकरण पर एक त्वरित नज़र आपको सुझाव देती है कि आपको अपने आप को एक दृश्य परिवर्तन मैट्रिक्स लागू करना होगा। क्या यह आपको अपनी कक्षा को सतह वर्ग से प्राप्त करने देता है ताकि आप उस कार्यक्षमता को जोड़ सकें?


आप जवाब बहुत उपयोगी है (+1)। मैं अपनी सतह वर्ग को उप-वर्ग कर सकता हूं, लेकिन मुझे यह पता लगाने के लिए अधिक समय चाहिए कि क्या मैं आपकी पोस्ट में बताए गए लक्ष्य को प्राप्त कर सकता हूं। मैं सामान्य रूप से गेम प्रोग्रामिंग और ग्राफिक्स के लिए बहुत नया हूं, क्या आपके पास इस मैट्रिक्स दृष्टिकोण (या यहां तक ​​कि केवल गणित का उपयोग करके सतह को स्केल करने के लिए शामिल है) को समझाने के लिए कुछ लिंक है? धन्यवाद!
मैक

1
चूंकि यह 2D है और इसमें कोई रोटेशन शामिल नहीं है @ mac मूल रूप से फ़ंक्शन को लपेटने के लिए कह रहा है और आप अपने साधारण स्केल डिवाइड को उन रैपर में उपयोग कर सकते हैं। आमतौर पर एक पूर्ण मैट्रिक्स का उपयोग करने का कारण यह है कि अधिकांश एपीआई में व्यूपोर्ट को नियंत्रित करने वाला एक मैट्रिक्स होता है, लेकिन ऐसा प्रतीत होता है कि pygame ऐसा नहीं है, इसलिए आपको इसे स्वयं एक परत ऊपर करना होगा।
पैट्रिक ह्यूजेस

2

चूंकि यह एक बहुत ही आम समस्या है, इसलिए मुझे आश्चर्य होता है कि क्या कोई ऐसा स्थापित पैटर्न है जो इस समस्या को हल करता है जिसे मैं खोजने में असफल रहा।

आमतौर पर लोग 2D गेम में रन-टाइम स्केलिंग करने की कोशिश नहीं करते हैं। मैं सहमत नहीं हूं कि यह एक आम समस्या है। अगर लोग एक मिनी-मैप या कुछ अन्य फिक्स्ड रिस्कलिंग चाहते हैं, तो इस उद्देश्य के लिए अक्सर ग्राफिक्स का एक नया सेट होता है। यह दुर्लभ है कि आपको 2 डी गेम में 2 अलग-अलग ज़ूम स्तरों पर चलने के लिए किसी भी एकल दिनचर्या की आवश्यकता होती है।

यदि आप एक 3D एपीआई का उपयोग करते हैं, तो आप इस कार्यक्षमता को मुफ्त में प्राप्त कर सकते हैं - बस कैमरा / व्यूपोर्ट मापदंडों को बदल दें।

PyGame एक बहुत पुराना API है और दुर्भाग्य से केवल 2D के लिए वास्तव में अनुकूल है। यहां तक ​​कि अगर आप अलग-अलग ज़ूम स्तरों के लिए पर्याप्त स्केलिंग सिस्टम बाहर काम कर सकते हैं, तो प्रदर्शन पर्याप्त अच्छा नहीं होगा और उपस्थिति अस्वीकार्य रूप से खराब होने की संभावना है।

मैं आपको सलाह दूंगा कि यदि आप बहुत अधिक ज़ूम इन और आउट करना चाहते हैं, तो आप जल्द से जल्द एक आधुनिक 3D API पर जाएँ। मैं पैगलेट की सिफारिश करूंगा, लेकिन दूसरों के भी होने की संभावना है।


आपके उत्तर के लिए धन्यवाद (+1)। मैं पहले से ही pygletsएक 3 डी सिमुलेशन के लिए अतीत में इस्तेमाल किया । यह निश्चित रूप से की तुलना में अधिक सक्षम है pygame, लेकिन 2 डी के लिए समर्थन एक की तुलना में काफी निचले स्तर का है pygame। उपलब्ध दस्तावेज / उदाहरण भी कम विस्तृत नहीं हैं, जो मेरे लिए summer है क्योंकि मैं खेल के विकास में एक शुरुआती हूं, और मुझे वास्तव में सबसे अधिक निष्पादित कार्यों के आधार को समझने की आवश्यकता है। :) के रूप में pygame की "उम्र" के लिए: आप सही हैं। एक आधुनिकीकरण हालांकि प्रगति पर है! :)
मैक

के रूप में: "यह दुर्लभ है कि आपको 2 अलग-अलग ज़ूम स्तरों पर चलने के लिए किसी भी एकल दिनचर्या की आवश्यकता होती है ..." मैंने सोचा था कि खिड़की के आकार / पूर्ण-स्क्रीन गेम के रिज़ॉल्यूशन को बदलते समय इसका उपयोग किया जाएगा। आपकी टिप्पणी से मुझे समझ में आया कि यह कोई संकेत नहीं है: इसके बजाय "सामान्य" क्या है?
मैक

आप कौन से 2D ऑपरेशन कर रहे हैं जहाँ pyglet pygame की तुलना में अधिक निम्न-स्तर का है? दोनों आपको 1 पंक्ति के कोड के साथ एक प्रेत आकर्षित करते हैं। जब आप एक 2D गेम की विंडो का आकार बदलते हैं, तो पिक्सेल-टू-वर्ल्ड-यूनिट अनुपात लगभग हमेशा स्थिर रहता है। तो आप बस अधिक स्प्राइट्स को ड्राइंग करते हैं: आप उन्हें अलग तरह से नहीं खींचते हैं।
18ot में Kylotan

चीजों के निम्न-स्तरीय पक्ष पर: मैं वास्तव में दोनों कामों में से एक पर विशेषज्ञ नहीं हूं, लेकिन pyglets में मैं आउट-ऑफ-द-बॉक्स के समूह रेंडरिंग व्यवहार pygame द्वारा प्रस्तुत नहीं कर सका ( pygame.sprite.LayeredUpdatesउदाहरण के लिए)। अपरिवर्तनीय अनुपात के रूप में: मुझे वही मिला है जो आपका मतलब है। आपके द्वारा वर्णित व्यवहार वह नहीं है जिसे मैं दोहराना चाहता हूं, लेकिन मैं समझ गया कि आपका क्या मतलब है, स्पष्टीकरण के लिए धन्यवाद! :)
मैक

pyglet के पास आर्डरग्रुप ऑब्जेक्ट्स हैं - डॉक्स यहाँ हैं यदि आप या कोई और दिलचस्पी रखता है: pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotlet
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.