如何在XNA中处理鼠标输入?


13

我正在XNA中开发纸牌游戏。

OnClickXNA中是否有对象事件?

我试图让玩家点击卡时移动它们。在这个项目中,有一个Sprite类可以绘制卡片,但是我有点不知所措,因为我不知道如何使用OnClick事件或类似的东西。

Answers:


12

通常,使用XNA时,您必须从事件驱动的代码范例转换为循环驱动的代码范例。您的更新代码每秒循环60次。因此,每次查看鼠标的状态,如果按钮按下并且指针在矩形内,则跳转到通常会放置在OnClick事件中的代码。


2
看来这在语义上可能是正确的,但在我看来也是错误的。当您开始查看线程以及每个循环期间的当前状态时,没有事件发生。这就是为什么我们创建自己的事件并编写其相应的处理程序的原因。我想说在大型项目中使用流控制分支到每个鼠标按下实例将变得疯狂。而是注册一个事件并在需要时编写处理程序。因此,首先考虑事件。
布兰登

5
布兰登:您不会“使用流控制分支到鼠标按下的每个实例”。您可以在每帧的开始处记录一次当前和先前的鼠标状态,然后在代码对鼠标按下作出响应的每个位置中,只需执行if(MouseLeftPress()){ DoSomething(); },这MouseLeftPress()是您编写的用于比较当前和先前的左键鼠标状态的方法。我发现大多数情况下,这比实施事件要容易。
Olhovsky

4
简单的轮询在基本的街机控件之外变得非常丑陋。我有一个输入管理器类,可将游戏板状态捕获为FlagAttributes,并允许您将委托映射到按钮的不同组合。下一步是实施计时。尽管所有这些辩论都只是在加强史蒂夫·H的观点,您正在提供一个投票系统,并且您可以自由地在该系统上构建以支持您喜欢的任何范例。
michael.bartnett


6

XNA只给您足够的能力来构建自己的输入类-您应该考虑它们提供的实用程序。

我将推荐此博客文章源代码)中描述的鼠标输入类。它检测到按下,保持或释放的按钮,并让您通过轮询或事件获取该信息。

与此相关的是,同一博客文章还提供了键盘和游戏手柄输入设备类。


3

在XNA中检查鼠标单击的实际代码是这样的:

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }

2

如果您的游戏是3D游戏,则可以实现挑选,详情如下:http : //create.msdn.com/en-US/education/catalog/sample/picking_triangle。基本上,这会创建一条从相机到鼠标单击的光线(其中没有一点矩阵投影在其中),然后检查是否有任何物体与该光线相交。

如果您的游戏是2D,则应该能够轻松地将窗口坐标转换为游戏坐标。然后检查所选坐标是否在任何对象的范围内。


1

查看鼠标是否被单击的最简单方法是

//Create this variable
MouseState mouseState;

现在在更新方法中添加此

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

希望这有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.