2011-09-12 10 views
8

के साथ कोई कुंजी नीचे है या नहीं, मैं कुछ ग्राफिक्स के साथ खेल रहा हूं, और मैंने तीर कुंजियों के साथ सरल कैमरा आंदोलन लागू किया है।जांचें कि क्यूटी

switch(key) 
{ 
    case up: MoveCameraForward(step); break; 
    case left: MoveCameraLeft(step); break; 
    ... 
} 

यह मैं चाहता हूँ के रूप में यह होता है काम नहीं करता है: मेरा पहला दृष्टिकोण इस तरह कुछ करने के लिए keyPressEvent ओवरराइड करने के लिए किया गया था। जब मैं दबाता हूं और दबाता हूं, उदाहरण के लिए, अगली कुंजी, कैमरा "चरण" इकाइयों को आगे बढ़ाता है, फिर थोड़ी देर तक रोकता है और फिर आगे बढ़ता रहता है। मैं अनुमान लगा रहा हूं कि थोड़ी देर की कुंजीपेशियों के मामले में कई घटनाओं से बचने के लिए घटना उत्पन्न होती है।

तो, मुझे अपने Paint() दिनचर्या में कीबोर्ड को पोल करने की आवश्यकता है। मुझे नहीं पता कि क्यूटी के साथ इसे कैसे किया जाए। मैंने map<Key, bool> रखने का विचार किया जो keyPressEvent और keyReleaseEvent में अपडेट किया जाएगा और Paint() में उस मानचित्र को मतदान करेगा। कोई बेहतर विचार? किसी भी अंतर्दृष्टि के लिए धन्यवाद।

उत्तर

6

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

आपका दूसरी विधि मैं, क्या किया होता, सिवाय इसके कि मैं एक सतत, समय-समय पर QTimer घटना का प्रयोग करेंगे कुंजीपटल दबाया नक्शा पोल और QWidget :: अद्यतन() फ़ंक्शन कॉल करने के लिए जब आवश्यक प्रदर्शन विजेट रद्द करने के लिए है बजाय। पेंट() के अंदर गैर-पेंटिंग परिचालन करना कई कारणों से दृढ़ता से निराश होता है लेकिन मुझे नहीं पता कि यह अच्छी तरह से कैसे समझाया जाए।

+0

यह विशेष रूप से प्रोत्साहित किया जाता है क्योंकि कुंजीपटल दोहराना दर उपयोगकर्ता द्वारा स्थापित की जा सकती है। यह गारंटी देने का एकमात्र तरीका है कि यह आपकी आंतरिक टिक दर से स्वतंत्र है। – RedX

+0

क्यूटी मंचों में इसके बारे में एक धागा है, और इसके बारे में एक उदाहरण है: http://qt-project.org/forums/viewreply/135346/ – bobbaluba

2

यह क्यूटी का उपयोग करते समय सीधे आगे नहीं है, लेकिन ग्लूऑन टीम वास्तव में उस समस्या (दूसरों के समूह के साथ) पर काम कर रही है। GluonInput समस्या हल करता है, और ग्लूऑन के हिस्से के रूप में उपलब्ध है: http://gluon.gamingfreedom.org/ यह एक अच्छा, क्यूटी-जैसी एपीआई भी है, इसलिए यह एक अतिरिक्त निर्भरता है, लेकिन इसका उपयोग करना आपके लिए संभव होना चाहिए।

3

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

विंडोज़ पर आप GetKeyState() और GetKeyboardState() का उपयोग कर सकते हैं, दोनों windows.h में घोषित किए गए हैं।

4

यह पता लगाने की सामान्य समस्या जो कुंजी दबाया जाता है का समाधान नहीं करता है, लेकिन अगर आप केवल कुंजीपटल संशोधक (SHIFT, CTRL alt, आदि) के लिए देख रहे हैं, तो आप स्थिर QApplication::keyboardModifiers() और QApplication::queryKeyboardModifiers() तरीकों के माध्यम से प्राप्त कर सकते हैं कि ।

संबंधित मुद्दे