2011-10-27 22 views
5

Tengo algunos problemas con las coordenadas de mi mouse en XNA - el 0x0 está arbitrariamente cerca (pero no en) la esquina superior izquierda de mi pantalla.C# XNA Posición del mouse

estoy corriendo el juego en modo de ventana en este momento, pero las coordenadas se basan fuera de la pantalla, no la ventana de juego (aunque la documentación XNA me dice que debería ser de otra manera)

Gracias de antemano!

Aquí está el código:

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

Tu código funciona bien conmigo. Copypasted en un nuevo proyecto. El 0x0 está arriba a la izquierda, a menos que estés hablando de una precisión de 1 píxel. Tal vez es el spriteBatch ... Lo único que he cambiado. – Pierre

Respuesta

1

¿Usted intentó algo más simple como esto?

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); 
} 

Puede haber algo de tiempo entre la extracción y la actualización, debido a la forma en la sincronización trabaja en XNA, tal vez es esta la causa del píxel percibida desfase?

Y ... ¿está seguro de que "configuró" su lote de sprites correctamente? Las coordenadas son relativas a la ventana del juego, por lo que dice la documentación.

Otra cosa: ¿Por qué estás usando campos estáticos? Realmente no me gusta esta elección, un antipatrón. Use campos de clase, no campos estáticos.

Además ... supongo que está dibujando un ícono de mouse, ¿verdad? Tenga en cuenta que XNA comienza a dibujar la textura desde el punto especificado, ¿está seguro de que la textura está bien formada con el punto superior izquierdo cuando la flecha del mouse termina?

He encontrado un buen ejemplo de ello se puede gustar: http://azerdark.wordpress.com/2009/07/08/displaying-cursor-xna/

Ten en cuenta también que se puede activar y desactivar la normal de las ventanas del sistema operativo con el cursor del ratón IsMouseVisible = true;

+0

Sé que hay más de unas pocas cosas que estoy haciendo mal, constantemente. Pero simplemente arreglé el control de capa en el sprite del mouse (para que esté visible, antes estaba usando la opción isMouseVisible = true.) El sprite del mouse prestado en el juego se encuentra dentro de la ventana del juego, y parece estar donde yo quiero. Pero definitivamente se compensa con el mouse de Windows a lo largo del eje x. Gracias por la referencia, he estado revisando algunos de ellos. –

0

Su llamada al sorteo no compensa la textura en absoluto. Si la parte "puntero" de su imagen no está en la posición 0,0 (arriba a la izquierda) de su textura, la posición parecerá desactivada.

Agregue Console.WriteLine(pos); a su actualización para ver la posición a la que está apuntando. Recuerde eliminar esto después de la depuración porque writeline matará su rendimiento.

Pruebe una de las llamadas sobrecargadas de SpriteBatch.Draw() que tienen en cuenta un "origen" que le permite decidir qué punto de la textura debe dibujarse en la posición. En el siguiente código, modifique el Vector 2 en función de cómo se dibuja su textura.

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

En 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; 
    } 

Esto funciona para mí;)

Para utilizar esto, añadir esto a mi juego-componente con esa clase:

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

Hope this helps sombody: D

Cuestiones relacionadas