XNA में माउस इनपुट को कैसे संभालें?


13

मैं XNA में एक कार्ड गेम विकसित कर रहा हूं।

क्या OnClickवस्तुओं के लिए XNA में कोई घटना है?

जब खिलाड़ी उन पर क्लिक करता है तो मैं कार्ड ले जाने की कोशिश कर रहा हूं। इस परियोजना में, स्प्राइट वर्ग है जो कार्ड को खींचता है, लेकिन मैं थोड़ा अटक गया हूं क्योंकि मुझे नहीं पता कि OnClickघटनाओं या इस तरह से कुछ भी कैसे उपयोग किया जाए ।

जवाबों:


12

सामान्य रूप से XNA के साथ काम करते समय आपको एक घटना संचालित कोड प्रतिमान से एक पाश चालित कोड प्रतिमान तक ले जाना पड़ता है। आपका अपडेट कोड 60 गुना / सेकेंड लूप है। इसलिए हर बार, माउस की स्थिति को देखें और यदि बटन नीचे है और पॉइंटर आपके रूट के भीतर है, तो कोड को ब्रांच करने के लिए आपको सामान्य रूप से एक ऑनक्लिक इवेंट में जगह मिलेगी।


2
ऐसा लगता है कि यह शब्द सही हो सकता है, लेकिन मेरी राय में गलत भी हो सकता है। जब आप किसी थ्रेड को देखते हैं और प्रत्येक लूप के दौरान वर्तमान स्थिति क्या होती है, तो कोई घटना नहीं होती है। यही कारण है कि हम अपनी घटनाओं को बनाते हैं और उनके अनुरूप हैंडलर लिखते हैं। मैं कहता हूँ कि माउस के हर उदाहरण के लिए शाखा पर प्रवाह नियंत्रण का उपयोग करना एक बड़ी परियोजना में पागल हो जाएगा। इसके बजाय, एक घटना दर्ज करें और जहां भी जरूरत हो हैंडलर लिखें। इस कारण से घटनाओं को पहले स्थान पर रखा गया था।
ब्रैंडन

5
ब्रैंडन: आप "माउस के हर उदाहरण के लिए शाखा में प्रवाह नियंत्रण का उपयोग नहीं करते हैं"। आप प्रत्येक फ्रेम की शुरुआत में एक बार वर्तमान और पिछले माउस राज्य को रिकॉर्ड करते हैं, और फिर प्रत्येक स्थान पर जो आपका कोड एक मूसडाउन प्रेस से प्रतिक्रिया करता है जो आप बस करते हैं if(MouseLeftPress()){ DoSomething(); }, जहां MouseLeftPress()आप वर्तमान और पिछले बाएं बटन माउस राज्यों की तुलना करने के लिए लिखते हैं। मुझे ज्यादातर समय घटनाओं को लागू करने की तुलना में यह आसान लगता है।
ओल्होव्स्की

4
साधारण मतदान वास्तव में आपके बुनियादी आर्केड नियंत्रण से परे बदसूरत हो जाता है। मेरे पास एक इनपुट प्रबंधक वर्ग है जो गेमपैड राज्य को फ्लैगअट्यूटेज के रूप में कैप्चर करता है और आपको प्रतिनिधियों को बटन के विभिन्न संयोजनों को मैप करने की अनुमति देता है। अगला कदम टाइमिंग को लागू करना है। यह सब बहस सिर्फ स्टीव एच की बात को पुष्ट करती है, हालांकि, आप एक मतदान प्रणाली दे रहे हैं, और जो भी प्रतिमान आपको पसंद है, उसका समर्थन करने के लिए आप इस पर निर्माण करने के लिए स्वतंत्र हैं।
michael.bartnett


6

XNA आपको केवल अपनी स्वयं की इनपुट कक्षाएं बनाने के लिए पर्याप्त देता है - और आपको उनकी पेशकश की उपयोगिता को देखते हुए ऐसा करना चाहिए।

मैं इस ब्लॉग पोस्ट ( स्रोत कोड ) में वर्णित माउस इनपुट क्लास की सिफारिश करूंगा । यह एक बटन दबाया, आयोजित या जारी होने का पता लगाता है, और आपको वह जानकारी मतदान या घटनाओं के माध्यम से प्राप्त करने देता है।

संबंधित नोट पर, वही ब्लॉग पोस्ट कीबोर्ड और गेमपैड इनपुट डिवाइस क्लासेस भी प्रदान करता है।


3

XNA में माउस क्लिक की जाँच के लिए वास्तविक कोड कुछ इस तरह है;

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }

2

यदि आपका गेम 3 डी है, तो आप पिकिंग को लागू कर सकते हैं, जो यहां वर्णित है: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle । मूल रूप से यह कैमरे से एक किरण बनाता है जहां माउस क्लिक करता है (इसमें थोड़ा मैट्रिक्स के साथ अप्रमाणित होता है), तो आप यह देखने के लिए जांचते हैं कि क्या आपकी कोई वस्तु किरण द्वारा प्रतिच्छेद की गई थी।

यदि आपका गेम 2D है, तो आपको गेम निर्देशांक का विंडो निर्देशांक का अनुवाद आसानी से करने में सक्षम होना चाहिए। फिर देखें कि क्या चयनित निर्देशांक आपकी किसी भी वस्तु की सीमा के भीतर हैं।


1

यह देखने का सबसे सरल तरीका है कि माउस क्लिक किया गया है या नहीं

//Create this variable
MouseState mouseState;

अब अपडेट विधि में इसे जोड़ें

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

आशा है कि इससे मदद मिली

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