C#XNA鼠标位置

时间:2011-10-27 02:29:48

标签: c# xna

我在XNA中遇到鼠标坐标问题 - 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; 
          }
      }   
   }
}

4 个答案:

答案 0 :(得分:4)

在game.cs中:

//sets the windows mouse handle to client bounds handle

Mouse.WindowHandle = Window.Handle;

答案 1 :(得分: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);

希望这有助于sombody:D

答案 2 :(得分: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中的时序工作方式,这可能是感知像素偏移的原因吗?

并且......你确定你正确地“配置”了你的精灵批次吗?坐标是相对于游戏窗口的,所以文档说。

另一件事:你为什么使用静态字段?我真的不喜欢这个选择,反模式。使用类字段,而不是静态字段。

另外......我猜你正在画一个鼠标图标,对吧?考虑到XNA开始从指定点绘制纹理,你确定纹理是否形状良好,左上角为鼠标箭头?

我在这里找到了一个很好的例子:http://azerdark.wordpress.com/2009/07/08/displaying-cursor-xna/

另请注意,您可以使用IsMouseVisible = true启用和禁用正常的Windows操作系统鼠标光标;

答案 3 :(得分:0)

您的绘制调用根本不会抵消纹理。如果图像的“指针”部分不在纹理的0,0位置(左上角),则定位将显示为关闭。

在您的更新中添加Console.WriteLine(pos);以查看其正在绘制的位置。请记住在调试后删除它,因为writeline会破坏你的性能。

尝试其中一个重载的SpriteBatch.Draw()调用,这些调用会在“原点”中生成因素,让您决定应该在该位置绘制纹理的哪个点。在下面的代码中,根据纹理的绘制方式调整Vector 2。

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