XNA鼠标移动

本文关键字:移动 鼠标 XNA | 更新日期: 2023-09-27 18:04:52

我之前已经在XNA上制作了一些游戏,我即将开始一个新项目。我想做的一件事是让鼠标移动。

只是为了澄清(因为我看到一些类似的问题导致混淆),我想得到鼠标的运动。而不是光标的位置或从一帧到下一帧的位置变化。我只想要鼠标如何移动的数据。

在我之前的游戏中,我只是将(隐藏的)光标重置到视口的中间,并观察位置的变化。然而,这似乎有点欺骗,并导致一些混乱的计算在我的代码。

那么是否有任何方法可以将鼠标移动返回到程序中?

谢谢,马特

编辑:

回复第一条评论。在本例中,我所指的光标位置是鼠标指针在屏幕上的位置。我所指的鼠标移动是指鼠标的物理移动。

XNA似乎将鼠标一词与指针(或光标)同义。

我遇到的问题是,尽管鼠标向左移动,但我无法在程序中获得该移动,因为光标位于屏幕边缘。

XNA鼠标移动

MouseState类只包含鼠标光标的位置等信息。正如你所提到的,这个位置将被剪辑到屏幕的边缘。除了通过MouseState类,没有办法确定用户是否移动了鼠标。特别是,没有MouseDirection、mouseangent或MouseAngle属性来指示鼠标移动的方向。

作为一种变通方法,您可以调用SetPosition来强制光标位于屏幕中间,这样您就可以始终知道鼠标移动的方向。事实上,SetPosition甚至推荐这种方法:

当使用此方法获取相对输入时,例如在a第一人称游戏,设置鼠标的位置到你的中心游戏窗口每帧。这将允许您读取鼠标移动两个轴都有最大的粒度。

我对XNA的理解非常有限,因为游戏开发不是我的主线。

话虽如此,根据我对XNA行为的理解,你确实需要计算帧之间的位置变化,以查看鼠标移动了多少。

随着X-Y坐标的变化,您可以根据这个简单的度量获得各种数据。

如果您想要鼠标的实际移动,您可以创建一个数组或列表,其中包含在给定事件(例如elapsedtime > 1fIsMouseReleased)上重置的鼠标最后移动。它看起来像这样:

List<Vector2> Movement = new List<Vector2>();    
public override void Update(GameTime gameTime)
{
    MouseState pms;
    MouseState ms = Mouse.GetState();
    pms = ms;
    Movement.Add(pms.X - ms.X, pms.Y - ms.Y);
    if(ms.LeftButton == ButtonState.Released){ Movement.Clear(); }
    base.Update(gameTime);
}