कुंजी प्रेस की शुरुआत में देरी को दूर करना


11

मैं एक सरल खेल बना रहा हूं, और जिन समस्याओं का मुझे सामना करना पड़ा है, उनमें से एक लगातार दबाने पर कष्टप्रद देरी है।

इसलिए मूल रूप से, जब मैं उदाहरण के लिए (बहुत लंबे समय के लिए) दबाता हूं, तो Upमेरी वस्तु 1 इकाई को ऊपर ले जाएगी, गति नहीं (लगभग 1 सेकंड के लिए), और फिर लगातार 1 इकाई ऊपर (बिना किसी देरी के) चलती है।

वर्तमान में, मैं इसका उपयोग ऑब्जेक्ट (SDL2) को स्थानांतरित करने के लिए करता हूं:

while (SDL_PollEvent(&event))
{
    switch (event.type)
    {
    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {
        case SDLK_UP:
            //Move object 1 unit up
            break;
        //Other unrelated things omitted
        }
        break;
    //Omitted other cases
    }
}

मुझे क्या करना है कि देरी को दूर करना है, ताकि वस्तु तुरंत Upबहुत जल्दी से आगे बढ़ सके। क्या इसे करने का कोई तरीका है?

जवाबों:


19

कुंजी-डाउन ईवेंट को निकाल दिए जाने की प्रतीक्षा करके, आप संभावित ईवेंट दोहराने की दर पर दया करते हैं कि OS नियंत्रण (और जो उपयोगकर्ता खुद को निर्दिष्ट कर सकते हैं)।

इसके बजाय, आप कीबोर्ड की स्थिति प्राप्त करने के लिए SDL_GetKeyboardStateअपने गेम अपडेट लूप के शीर्ष पर कॉल करना चाहते हैं (अपडेट का वह हिस्सा जो हर फ्रेम में होता है , चाहे कोई घटना हुई हो या नहीं)। कुंजी किसी भी व्यक्तिगत फ्रेम के दौरान नीचे है या नहीं।


क्या खिड़की के संदेश सुनना बेहतर नहीं होगा? मतदान का उपयोग करते हुए मुझे कभी-कभी बहुत ही कम प्रेस की याद आती है और फ्रैमरेट कम होने पर यह समस्या और भी बदतर हो जाती है।
रॉय टी।

@RoyT। यह वास्तव में आपके खेल पर निर्भर करता है और जिस तरह की कार्रवाई आप कुंजी के साथ ट्रिगर करना चाहते हैं। यदि की-प्रेस एक एकल-बंद चीज है, जैसे "एक्शन" कुंजी, जो एक संवाद को बंद कर देती है तो एक संदेश कतार सही दृष्टिकोण है - आप एक परमाणु घटना के लिए सुनना चाहते हैं। - अगर दूसरी ओर की-स्टेट "चल" कुंजी की तरह चल रही स्थिति का प्रतिनिधित्व करती है, तो तर्क आमतौर पर है while key UP is down move 30 units per second- और प्रति सेकंड केवल तभी समझ में आता है जब आपके पास कुंजी डाउन और अप के बीच एक औसत दर्जे का समय होता है - आमतौर पर एक से अधिक फ्रेम।
फाल्को

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

और फ्रेम से आपका मतलब गेम टिक है, न कि वीडियो फ्रेम, राइट? क्योंकि हम रेंडर लूप में प्लेब और एन्कोडिंग गेम लॉजिक नहीं कर रहे हैं। :-)
corsiKa

@JoshPetrie मैं पूरी तरह से सहमत हूं, अगर आप 'प्रेस' के बजाय 'क्लिक' को जांचना चाहते हैं, तो इस छोटे से चेतावनी को इंगित करना चाहते हैं। :)
रॉय टी।

10

एक वैकल्पिक तरीका (जोश का दृष्टिकोण बहुत अच्छा है!) एक बूलियन को सेटअप करना होगा SDL_KEYDOWN, और संभवतः सभी दोहराया प्रमुख घटनाओं को भी अनदेखा करना होगा। कि आप repeatप्रमुख घटना के सदस्य की जाँच करके कर सकते हैं ।

तब आप अपने खुद के टाइमर को लागू कर सकते हैं, जिसमें कुछ भी फैंसी होने की ज़रूरत नहीं है, और अपने स्वयं के प्रमुख पुनरावृत्ति को लागू करें। आप टाइमर से सीधे कार्रवाई को ट्रिगर कर सकते हैं, या यहां तक ​​कि एक SDL_KEYDOWNघटना उत्पन्न कर सकते हैं , और समाधानों को एकजुट कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.