"किसी भी बटन प्रेस" का पता लगाना


10

मैं खिलाड़ी को मुख्य पृष्ठ से जारी रखने के लिए किसी भी बटन को दबाने की अनुमति देने की कोशिश कर रहा हूं। मैं ऐसा करने में सक्षम था, बटन की सूची बनाकर और इन के माध्यम से लूपिंग और उनमें से एक के नीचे होने की जाँच करना; हालाँकि, मुझे ऐसा लगता है कि यह कोड बदसूरत है और आश्चर्य है कि क्या ऐसा करने का कोई सरल तरीका है जो मैं अभी नहीं सोच रहा हूँ?

यहाँ मेरा कोड अब कैसा दिखता है:

            if (GamePad.GetState(PlayerIndex.One).IsConnected)
            {
                var buttonList = new List<Buttons>()
                {
                    {Buttons.A},
                    {Buttons.B},
                    {Buttons.Y},
                    {Buttons.X},
                    {Buttons.Start},
                    {Buttons.Back},
                    {Buttons.RightShoulder},
                    {Buttons.LeftShoulder},
                    {Buttons.RightTrigger},
                    {Buttons.LeftTrigger}
                };

                foreach (var button in buttonList)
                {
                    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
                        ExitMainMenu= true;
                }
            }

मैं व्यक्तिगत रूप से केवल एक बड़ा IF लूप करता हूँ, जैसा कि एक अरै बनाने और लूपिंग के विपरीत है।
jgallant

@ जो एक बड़ा IF लूप है और यह बेहतर क्यों होगा?
craftworkgames

मुझे पसंद है कि यह प्रश्न सभी की प्रतिक्रिया है। मुझे लगता है कि @Katu को हालांकि "सही" उत्तर मिला।
सेठ बत्तीन

जवाबों:


10

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

GamePadState.PacketNumber :

आप इनपुट स्थिति बदल गई है या नहीं यह निर्धारित करने के लिए PacketNumber का उपयोग कर सकते हैं। यदि GetState के दो अनुक्रमिक कॉल के बीच PacketNumber का मूल्य समान रहता है, तो इनपुट में कोई बदलाव नहीं हुआ है।

public bool HasInputChanged(GamePadState previousGamePadState, bool ignoreThumbsticks)
{ 
    GamePadState currentState = GamePad.GetState( PlayerIndex.One );
    if ((currentState.IsConnected) && (currentState.PacketNumber != previousGamePadState.PacketNumber))
    {
        //ignore thumbstick movement
        if ((ignoreThumbsticks == true) && ((currentState.ThumbSticks.Left.Length() != previousGamePadState.ThumbSticks.Left.Length() )&&(currentState.ThumbSticks.Right.Length() != previousGamePadState.ThumbSticks.Right.Length()) ))
            return false;
        return true
    }
    return false;
}

संपादित करें: विधि में परिवर्तित। यह सही काम करने की गारंटी नहीं है, लेकिन काम करना चाहिए। इसके अलावा, क्योंकि यह वास्तव में इनपुट में परिवर्तन का पता लगाता है, इसलिए यदि उपयोगकर्ता बटन जारी करता है, तो इसे इसके साथ भी देखा जाता है। मैंने ifथम्बस्टिक आंदोलन का पता लगाने के लिए भी जोड़ा , ताकि आप कम से कम उन पर ध्यान न दें।

आशा है कि यह आपकी मदद करता है। मुझे पता है, अगर यह आपकी आवश्यकताओं के अनुरूप नहीं है, मुझे यकीन है कि हम इसे बाहर काम कर सकते हैं।

कैसे करें: पता लगाएँ कि क्या एक नियंत्रक बटन इस फ्रेम GamePadState.PacketNumber संपत्ति दबाया गया है


वहाँ के लिए यह लिखने के लिए एक अनुरूप रास्ता नहीं है GamePadStateऔर enum Buttonsजो संदर्भ ओ पी का उपयोग कर किया जा रहा है के करीब है,।
सेठ बत्तीन

1
सुबह की कॉफी से पहले कुछ भी जवाब नहीं देना चाहिए :)
काटू

1
अब यह काम करता है और इससे तेज कोई नहीं कर सकता।
काटू

वाह, पूरी तरह से अलग विधि, और मुझे लगता है कि आप इसके बारे में सही हैं कि यह सबसे तेज़ है। अच्छा लगा।
सेठ बट्टिन

क्या यह केवल बटन प्रेस का पता लगाता है, या क्या यह बटन रिलीज का भी पता लगाता है?
जॉर्ज डकेट

1

यदि आप परावर्तन के उपयोग को बुरा नहीं मानते हैं, तो आप कुछ इस तरह का उपयोग कर सकते हैं (संभवतः यह बिल्कुल भी):

        var properties = typeof(GamePadButtons).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var property in properties)
        {
            var value = property.GetValue(GamePad.GetState(PlayerIndex.One).Buttons);
            if (value is ButtonState && (ButtonState)value == ButtonState.Pressed)
                ExitMainMenu = true;
        }

1

आप मैन्युअल रूप से एक खाली का निर्माणGamePadState कर सकते हैं , और फिर इसे चालू (वास्तविक ) के साथ समानता के लिए जांचें , जिसे आप कॉल करके प्राप्त करते हैं GamePad.GetState

playerInput = GamePad.GetState(PlayerIndex.One);  
emptyInput = new GamePadState(Vector2.Zero, Vector2.Zero, 0, 0);
if (playerInput != emptyInput){

    // yay!!!!, a button push!
    // 
    // P.S., remember to allow any PlayerIndex to take control of the the game 
    // from the main menu.  It sucks when you pick up controller2 and it doesn't work.

}

अगर यह काम करता है तो मुझे कुछ पता नहीं है; मैंने कभी इसे करने की कोशिश नहीं की। मुझे पता है अगर यह तुम्हारे लिए काम करता है।
सेठ बत्तीन

चतुर विचार, हालांकि यह केवल तभी काम करेगा जब GamePadState समतुल्य को समाप्‍त कर देता है जो कि संभावना नहीं है। सबसे अधिक संभावना है, यह संदर्भ समानता का उपयोग करेगा और इसलिए ऊपर यदि कथन सत्य का मूल्यांकन कभी नहीं करेगा।
craftworkgames

@craftworkgames Equalsअलग है; यह एक ही उदाहरण होने के लिए दो संदर्भों की तुलना करता है। लेकिन GamePadStateउनके मूल्यों की तुलना करने के लिए == ऑपरेटर को ओवरलोड करता है, जिसे मैंने अपने उत्तर ( op_Equality) में जोड़ा था ।
सेठ बत्तीन

वास्तव में मुझे नहीं पता था कि GamePadState एक ऐसी संरचना थी जो शायद काम करेगी। तकनीकी रूप से, हालांकि, समान और == का व्यवहार अक्सर समान होता है, ज़ाहिर है, यह कार्यान्वयन पर निर्भर करता है लेकिन दिशानिर्देश इसे इस तरह से सुझाते हैं। यदि आप संदर्भ समानता चाहते हैं, तो आप ऑब्जेक्ट
craftworkgames

आह, आप सही हैं, गेमपैडस्टैट एक मूल्य-प्रकार है, इसलिए यह प्रासंगिक नहीं है। भले ही, == अतिभारित है, साथ ही इसका उपयोग कर सकते हैं IMO।
सेठ बत्तीन

1

चूंकि बटन एक एनुमरेशन है, आप Enum.GetValues विधि का उपयोग इस तरह कर सकते हैं :

var buttonList = (Buttons[])Enum.GetValues(typeof(Buttons));

foreach (var button in buttonList)
{
    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
        ExitMainMenu= true;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.