【问题标题】:2D XNA game mouse clicking2D XNA 游戏鼠标点击
【发布时间】:2012-03-15 01:50:04
【问题描述】:

我有一个 2D 游戏,我只使用鼠标作为输入。 我怎样才能让它当鼠标悬停在 Texture2D 对象上时,Texture2D 和鼠标光标会发生变化,并且当纹理被点击时它会移动到另一个地方。

简单地说,当我将鼠标悬停在或单击 Texture2D 时,我想知道如何做某事。

【问题讨论】:

标签: c# xna


【解决方案1】:

在 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 等

【讨论】:

  • Rectangle.Contains 需要一个点,所以我不确定您为什么将 Mouse.GetState() 返回的 Point 转换为 Vector。
  • 但是如何将点击与任何位置的纹理关联起来。当我在任何位置而不是特定矩形左键单击它时!
  • Texture2D 类没有用于接收输入的内置功能,这很好。因此,您将始终必须定义一个活动区域并将其与纹理或其他对象相关联。如果您有更多矩形,请简单循环它们并使用上述方法检查每个矩形。
【解决方案2】:

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

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

【讨论】:

  • 这和原问题有什么关系?
  • 这个答案与OP的问题不太相关,但对我有帮助!
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多