2012-03-15 120 views
11

我有一个2D游戏,其中只使用鼠标作为输入。 我该如何做到这一点,以便当鼠标悬停在Texture2D对象上,Texture2D和鼠标光标发生变化时,以及当纹理被点击时,它会移动到另一个位置。2D XNA游戏鼠标点击

简而言之,我想知道当我将鼠标悬停或点击一个Texture2D时如何做某些事情。

+0

这属于在http ://gamedev.stackexchange.com/ – RQDQ 2012-03-15 12:09:06

回答

30

在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; 
} 

你可以使其更加先进以及使用事件。因此,您仍然可以使用上面的代码片段,而不是直接包含要触发事件的代码:MouseIn,MouseOver,MouseOut。 ButtonPush,ButtonPressed,ButtonRelease等

+0

Rectangle.Contains需要一个点,所以我不知道为什么你将Mouse.GetState()返回的Point转换为Vector。 – ClassicThunder 2012-03-15 15:32:42

+0

非常感谢,lucius – 2012-03-16 21:46:52

+0

但是我怎么能在任何位置关联点击和纹理。 当我离开的时候点击了它的任何位置都不是特定的矩形! – 2012-03-16 22:01:09

-1

我只想补充一点,鼠标单击代码可以简化,使您不必为此做出一个变量:

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

这与原始问题有什么关系? – jeteon 2016-03-04 14:32:18