我之前在XNA做了几场比赛,我即将开始一个新项目。我想做的一件事就是让鼠标移动。
只是为了澄清(因为我看到一些类似的问题导致混乱)我想得到鼠标的动作。不是光标的位置或从一帧到下一帧的位置变化。我只想了解鼠标移动方式的数据。
在我之前的游戏中,我只需将(隐藏)光标重置到视口中间并查看位置的变化。然而,这似乎有点作弊,并导致我的代码中的一些混乱的计算。
那么有没有办法让鼠标移动回到程序中?
谢谢, 马特
编辑:
回应第一条评论。在这种情况下,我所指的光标位置是鼠标指针的屏幕位置。我所指的鼠标的移动是在物理上移动鼠标。
XNA似乎将鼠标一词与指针(或光标)同义。
我遇到的问题是,尽管鼠标向左移动,但由于光标位于屏幕边缘,我无法在程序中获得该移动。
答案 0 :(得分:3)
MouseState类仅包括鼠标光标的位置等。如您所述,此位置将剪切到屏幕边缘。除了通过MouseState类之外,无法确定用户是否移动了鼠标。特别是,没有MouseDirection,MouseTangent或MouseAngle属性指示鼠标移动的方向。
作为一种变通方法,您可以调用SetPosition强制光标位于屏幕中间,这样您就可以随时知道鼠标移动的方向。事实上,SetPosition甚至推荐这种方法:
使用此方法进行相对输入时,例如a 第一人称游戏,将鼠标的位置设置为你的中心 游戏窗口每一帧。这将允许您阅读鼠标移动 两个轴都具有最大的粒度。
答案 1 :(得分:0)
我对XNA的理解非常有限,因为游戏开发不是我的主要开发方式。
话虽如此,根据我对XNA的好处的理解,你真的需要计算帧之间位置的变化,看看鼠标移动了多少。
通过X-Y坐标的变化,您可以根据这个简单的度量获得所有类型的数据。
答案 2 :(得分:-3)
如果你想要鼠标的实际移动,你可以创建一个数组或鼠标最后一次移动列表,重置给定的事件,例如。 elapsedtime > 1f
或IsMouseReleased
。
它看起来像这样:
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);
}