2012-02-02 31 views
7

का उपयोग कर क्यूटी में एक टाइल-आधारित गेम के साथ प्रारंभ करना मैं क्यूटी में 2 डी टाइल-आधारित गेम प्रोग्रामिंग शुरू करने जा रहा हूं और क्यूग्राफिक्ससेन और क्यूग्राफिक्स व्यू क्लास के बारे में पढ़ता हूं जो कि 2 डी के बहुत सारे प्रदर्शन और संचालन के लिए हैं। वस्तुओं।QGraphicsScene और QGraphicsView

मेरा सवाल यह है कि QGraphicsScene का उपयोग करके कई टाइलों के साथ दुनिया बनाने के लिए संभव हो सकता है? क्या मैं पूरी दुनिया को एक बार टाइल-बाय-टाइल में जोड़ सकता हूं या क्या मुझे क्षेत्र को थोड़ा सा प्रतिबंधित करने के लिए कुछ लागू करने की कोशिश करनी चाहिए? मैंने पढ़ा है कि QGraphicsScene "हजारों आइटम" को संभाल सकता है लेकिन 2 डी टाइल नक्शा आसानी से वास्तव में बड़ा हो सकता है, वास्तव में बड़ा (200x200 टाइल्स? बहुत से नहीं, लेकिन यह पहले से ही 40,000 ऑब्जेक्ट्स है जो बहुत कुछ है)।

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

QGraphicsScene और QGraphics का उपयोग कर रहा है, यहां तक ​​कि एक अच्छा विचार भी है या क्या मुझे क्यूटी या शायद एक अलग, अधिक गेम उन्मुख पुस्तकालय के अंदर एक विकल्प की तलाश करने की कोशिश करनी चाहिए?

अग्रिम धन्यवाद

+0

है क्यूटी के हाल के संस्करणों के साथ, यह ओपन डिफ़ॉल्ट सॉफ्टवेयर रेंडरर के बजाय रेंडरर के रूप में निर्दिष्ट करके काफी प्रदर्शन को बढ़ाने के लिए संभव है -> सेट व्यूपोर्ट (नया QOpenGLWidget); – vsz

उत्तर

8

आपको QGraphicsView का उपयोग करना चाहिए।

40,000 Chips int Qt दस्तावेज़ीकरण बारीकी से जांच करने का आपका सबसे अच्छा उदाहरण है। यह बड़ी संख्या में तत्वों की जटिलता से निपटता है, उन्हें कई पैमाने पर खींचता है और बहुत कुछ।

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

chips.cpp स्रोत में, यह दिखाता है कि यह शैली विकल्प में संग्रहीत परिवर्तन के आधार पर "लेवलऑफडेंट" या लॉर वेरिएबल स्विच स्टेटमेंट का उपयोग करके तुरंत कैसे चला सकता है।

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

यदि आपको अभी भी उस मानचित्र के आकार के साथ समस्याएं हैं जो आप उपयोग करना चाहते हैं, तो मैं हार्डड्राइव पर टाइल लेआउट स्टोर करता हूं और जब आपको उनकी आवश्यकता होती है तो उन्हें लोड करें, और जिनकी आपको आवश्यकता नहीं है उन्हें हटा दें आवश्यक दृश्य के रूप में।

+0

लिंक मर गए हैं। – mrgloom

+0

फिक्स्ड लिंक। का आनंद लें। – phyatt

1

QGraphicsScene केवल पेंट करने के लिए क्या ध्यान में रखते हुए दिखाया जा रहा है की क्षमता है, बाकी सब सिर्फ दृश्य सूचकांक में बैठता है। आपके विशिष्ट उपयोग को अनुकूलित करने के लिए दृश्य और दृश्य कैसे संचालित होता है, यह कॉन्फ़िगर करने के लिए आपके पास अलग-अलग विकल्प हैं। सिर्फ इसलिए कि आपके दृश्य सूचकांक में 40k टाइल्स हैं, इसका मतलब यह नहीं है कि आपको उन लोगों को पेंट करने की आवश्यकता है। आप वास्तव में केवल अपने विचार के संकल्प में प्रदर्शित किए जा रहे हैं।

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

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

+0

महान उत्तर के लिए धन्यवाद! मैं इसे आजमाने की कोशिश कर रहा हूं। जैसा कि आपने कहा था, भले ही यह काम न करे, ऐसा नहीं है कि मैंने इसे करने में काफी समय गंवा दिया। – Maush

2

मैं एक समान प्रोजेक्ट पर काम कर रहा हूं और मैं लगातार QGraphicsPixmapItems का 30x30 ग्रिड का उपयोग कर रहा हूं। जब नक्शा का दृश्य बदलता है, तो QGraphicsscene वर्तमान में देखने वाले मानचित्र सरणी के हिस्से में पुनरावृत्ति करता है, इसे प्रत्येक टाइल पर सेट टिक्स प्रकार को नए टाइल प्रकार में बदलने के लिए कॉल करता है। यह बहुत आसानी से काम कर रहा है और मेरे पास अब तक कोई प्रदर्शन शिकायत नहीं है।

2

मैं जो कहा गया है उससे सहमत हूं। मैं वर्षों से QGraphicsView-based games कर रहा हूं (यदि आप लिनक्स पर हैं, तो अपने पैकेज मैनेजर से केडीमॉन्ड या पलापल्ली के लिए पूछें), और प्रदर्शन को प्रस्तुत करते समय एक मुद्दा रहा है जब QGraphicsView पहले साल पहले बाहर आया था, ये समस्याएं आम तौर पर होती हैं हल किया।

आपको स्मृति खपत के बारे में क्या चिंतित होना चाहिए। चिप्स उदाहरण में कई चिप्स हो सकते हैं क्योंकि आप टाइल्स रखना चाहते हैं, लेकिन उन चिप्स को स्मृति में पिक्समैप्स के रूप में नहीं रखा जाता है। `UI-> graphicsView: प्रत्येक टाइल एक निश्चित-आकार 50x50px छवि है, तो पहले से ही

32bits*50px*50px*200*200 = 381,9 MiB 
+0

धन्यवाद आप बहुत, Palapeli बहुत अच्छा है। अब, मैं अभी भी KDiamond कोशिश करने के लिए है ... – CapelliC