2D XNA游戏鼠标点击

17

我有一个只使用鼠标作为输入方式的2D游戏。

当鼠标悬停在一个Texture2D对象上时,我该如何使Texture2D和鼠标指针发生变化,并且当该纹理被点击时移动到另一个位置。

简单来说,我想知道如何在悬停或点击Texture2D时执行某些操作。


1
这应该放在http://gamedev.stackexchange.com/上。 - RQDQ
2个回答

39
在XNA中,您可以使用Mouse类来查询用户输入。最简单的方法是每帧检查一次鼠标状态并相应地做出反应。鼠标位置是否在某个特定区域内?显示不同的光标。此帧期间是否按下了右键?显示一个菜单等。
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;
}

你可以将其进一步改进并使用事件。因此,您仍将使用上面的代码片段,但是不直接包含动作代码,而是触发事件:MouseIn、MouseOver、MouseOut、ButtonPush、ButtonPressed、ButtonRelease等。


1
Rectangle.Contains需要一个点作为参数,因此我不确定您为什么要将Mouse.GetState()返回的Point转换成Vector。 - ClassicThunder
但是我如何将点击与任何位置的纹理关联起来呢?当我在任何位置左击时,而不是特定的矩形时! - Ahmed Hegazy
Texture2D类没有内置接收输入的功能,这是好的。因此,您始终需要定义一个活动区域并将其与纹理或其他对象关联起来。如果您有更多的矩形,只需循环遍历它们并使用上述方法检查每个矩形即可。 - Lucius

-1

我想补充一点,鼠标点击代码可以简化,这样就不必为它创建一个变量:

if (Mouse.GetState().LeftButton == ButtonState.Pressed)
    {
        //Write code here
    }

1
这与原问题有什么关系? - jeteon
这个回答与OP的问题关系不大,但对我很有帮助! - John Kens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接