2011-10-27 11 views
5

मुझे एक्सएनए में अपने माउस निर्देशांक के साथ कुछ समस्याएं हैं - 0x0 मेरी स्क्रीन के शीर्ष बाएं कोने में मनमाने ढंग से (लेकिन नहीं) है।सी # एक्सएनए माउस स्थिति

मैं एक विंडोड मोड में खेल चला रहा हूँ अभी, लेकिन निर्देशांक स्क्रीन बंद आधारित हैं, नहीं खेल खिड़की (भले ही XNA प्रलेखन मुझसे कहता है अन्यथा यह होना चाहिए)

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

namespace TheGame 
{ 
    class Mousey 
    { 
     static public Vector2 pos; 
     static private Texture2D tex; 
     static public MouseState mouseState; 
     static public MouseState previousState; 

     //static public Mousey() 
     //{ 
     //} 

     static public void Update() 
     { 
     previousState = mouseState; 
     mouseState = Mouse.GetState(); //Needed to find the most current mouse states. 
     pos.X = mouseState.X; //Change x pos to mouseX 
     pos.Y = mouseState.Y; //Change y pos to mouseY 
     } 

     //Drawing function to be called in the main Draw function. 
     static public void LoadContent(ContentManager thecontent) 
     { 
     tex = thecontent.Load<Texture2D>("mousey"); 
     } 

     static public void Draw(SpriteBatch batch) //SpriteBatch to use. 
     { 
     batch.Draw(tex, pos, Color.White); //Draw it using the batch. 
     } 

     static public bool LBP() 
     { 
      if (mouseState.LeftButton == ButtonState.Pressed && previousState.LeftButton ==      ButtonState.Released) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
+0

आपका कोड मेरे साथ ठीक काम करता है। इसे एक नई परियोजना में कॉपी किया गया। 0x0 शीर्ष बाएं में है, जब तक कि आप 1-पिक्सेल सटीक चीज़ के बारे में बात नहीं कर रहे हों। शायद यह स्प्राइट बैच है ... केवल एक चीज मैंने बदल दी। – Pierre

उत्तर

1

आप कुछ इस तरह सरल कोशिश की:

यहाँ कोड है?

protected override void Draw(GameTime gameTime) 
{ 
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue); 

    base.Draw(gameTime); 

    MouseState current_mouse = Mouse.GetState(); 
    Vector2 pos = new Vector2(current_mouse.X, current_mouse.Y); 

    batch.Draw(tex, pos, Color.White); 
} 

ड्रा और अद्यतन के बीच कुछ समय, जिस तरह से समय XNA में काम करता है की वजह से हो सकता है, हो सकता है इस कथित पिक्सेल का कारण ऑफसेट है?

और ... क्या आप वाकई अपने स्प्राइट बैच को "कॉन्फ़िगर" करते हैं? निर्देशांक गेम विंडो के सापेक्ष हैं, इसलिए दस्तावेज कहता है।

एक और बात: आप स्थिर क्षेत्रों का उपयोग क्यों कर रहे हैं? मुझे वास्तव में यह पसंद नहीं है, एक विरोधी पैटर्न। वर्ग फ़ील्ड का प्रयोग करें, स्थिर फ़ील्ड नहीं।

भी ... मुझे लगता है कि आप माउस आइकन खींच रहे हैं, है ना? मान लें कि एक्सएनए निर्दिष्ट बिंदु से बनावट को आकर्षित करना शुरू कर देता है, क्या आप सुनिश्चित हैं कि बनावट आपके माउस तीर के अंत के रूप में शीर्ष-बाएं बिंदु के साथ अच्छी तरह से आकार में है?

मैं यहाँ एक अच्छा उदाहरण पाया आप की तरह हो सकता है: http://azerdark.wordpress.com/2009/07/08/displaying-cursor-xna/

भी विचार करें कि आप को सक्षम और IsMouseVisible साथ सामान्य विंडो ओएस माउस कर्सर को अक्षम कर सकते हैं = true

+0

मुझे पता है कि कुछ और चीजें हैं जो मैं गलत कर रहा हूं - लगातार। लेकिन मैंने बस माउस स्प्राइट पर परत नियंत्रण तय किया है (इसलिए यह दिखाई दे रहा है, मैं पहले isMouseVisible = true विकल्प का उपयोग कर रहा था।) गेम में माउस स्प्राइट गेम विंडो के भीतर स्थित है, और ऐसा लगता है कि मैं इसे कहां चाहता हूं। लेकिन यह निश्चित रूप से एक्स अक्ष के साथ विंडोज माउस से ऑफसेट है। संदर्भ के लिए धन्यवाद, मैं उनमें से कुछ पर जा रहा हूं। –

0

आपकी ड्रा कॉल बनावट को ऑफसेट नहीं कर रही है। यदि आपकी छवि का "पॉइंटर" हिस्सा आपके बनावट की 0,0 स्थिति (शीर्ष बाएं) में नहीं है, तो स्थिति दिखाई देगी।

अपनी स्थिति में Console.WriteLine(pos); जोड़ें जो इसे आकर्षित करने के लिए स्थिति में है। अपने डीबगिंग के बाद इसे हटाने के लिए याद रखें क्योंकि लेखन रेखा आपके प्रदर्शन को मार डालेगी।

ओवरलोडेड स्प्राइटबैच में से किसी एक को आज़माएं। ड्रा() कॉल "मूल" में कौन सा कारक है जो आपको यह तय करने देता है कि बनावट के किस बिंदु को स्थिति में खींचा जाना चाहिए। निम्नलिखित कोड में आपका बनावट कैसे तैयार किया जाता है, इस आधार पर वेक्टर 2 को ट्वीक करें।

batch.Draw(tex, pos, null, Color.White, 0.0f, new Vector2(10, 10), SpriteEffects.None, 0.0f); 
4

game.cs में:

//sets the windows mouse handle to client bounds handle 

Mouse.WindowHandle = Window.Handle; 
2
private IntPtr intPtr; 

    public MouseControle(int w, int h, IntPtr intPtr) 
    { 
     screenwidth = w; 
     screenheight = h; 
     this.intPtr = intPtr; 
     Mouse.WindowHandle = intPtr; 
    } 

यह मेरे लिए काम करता है;)

इस का उपयोग करने के लिए, मैं यह मेरा खेल घटक के उस वर्ग का उपयोग कर जोड़ें:

mouse = new MouseControle(((Game1)Game).setscreen.width, 
((Game1)Game).setscreen.height, 
((Game1)Game).Window.Handle); 

उम्मीद है कि यह किसी की मदद करेगा: डी