我在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;
}
}
}
}
答案 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);