【发布时间】:2012-03-15 01:50:04
【问题描述】:
我有一个 2D 游戏,我只使用鼠标作为输入。 我怎样才能让它当鼠标悬停在 Texture2D 对象上时,Texture2D 和鼠标光标会发生变化,并且当纹理被点击时它会移动到另一个地方。
简单地说,当我将鼠标悬停在或单击 Texture2D 时,我想知道如何做某事。
【问题讨论】:
我有一个 2D 游戏,我只使用鼠标作为输入。 我怎样才能让它当鼠标悬停在 Texture2D 对象上时,Texture2D 和鼠标光标会发生变化,并且当纹理被点击时它会移动到另一个地方。
简单地说,当我将鼠标悬停在或单击 Texture2D 时,我想知道如何做某事。
【问题讨论】:
在 XNA 中,您可以使用 Mouse class 来查询用户输入。
最简单的方法是检查每一帧的鼠标状态并做出相应的反应。鼠标位置是否在某个区域内?显示不同的光标。在此帧期间是否按下了右键?显示菜单。等等
var mouseState = Mouse.GetState();
获取鼠标在屏幕坐标中的位置(相对于左上角):
var mousePosition = new Point(mouseState.X, mouseState.Y);
当鼠标在特定区域内时更改纹理:
Rectangle area = someRectangle;
// Check if the mouse position is inside the rectangle
if (area.Contains(mousePosition))
{
backgroundTexture = hoverTexture;
}
else
{
backgroundTexture = defaultTexture;
}
单击鼠标左键时执行某些操作:
if (mouseState.LeftButton == ButtonState.Pressed)
{
// Do cool stuff here
}
请记住,您将始终拥有 当前 框架的信息。因此,虽然在单击按钮期间可能会发生一些很酷的事情,但它会在释放后立即停止。
要检查单击,您必须存储最后一帧的鼠标状态并比较更改的内容:
// The active state from the last frame is now old
lastMouseState = currentMouseState;
// Get the mouse state relevant for this frame
currentMouseState = Mouse.GetState();
// Recognize a single click of the left mouse button
if (lastMouseState.LeftButton == ButtonState.Released && currentMouseState.LeftButton == ButtonState.Pressed)
{
// React to the click
// ...
clickOccurred = true;
}
您可以使其更高级并处理事件。因此,您仍将使用上面的 sn-ps,但不是直接包含您将触发事件的操作代码:MouseIn、MouseOver、MouseOut。 ButtonPush、ButtonPressed、ButtonRelease 等
【讨论】:
我想补充一点,鼠标点击代码可以简化,这样您就不必为它创建变量:
if (Mouse.GetState().LeftButton == ButtonState.Pressed)
{
//Write code here
}
【讨论】: