将输入传递到状态机(c#)

将输入传递到状态机(c#),c#,user-input,state-machine,C#,User Input,State Machine,我会尽力解释我的情况 在每个应用程序中,我查询键盘和鼠标的当前状态,并将它们封装在单独的类和数据结构中。对于键盘,它是一个my Keys enum数组(当前按下的每个键对应一个项目),对于鼠标,它是一个包含坐标增量的类,每个按下的按钮对应一个布尔值 我还有一个通过状态管理器类管理的基本状态机,该类维护堆栈并封送状态 我想知道的是,如何最好地将输入(快照)传递到我的应用程序在任何时候都可能处于的各个状态 我希望尽可能多地处理来自各个状态的输入,以减少状态内的重复逻辑 或者最好保持输入快照尽可能纯净

我会尽力解释我的情况

在每个应用程序中,我查询键盘和鼠标的当前状态,并将它们封装在单独的类和数据结构中。对于键盘,它是一个my Keys enum数组(当前按下的每个键对应一个项目),对于鼠标,它是一个包含坐标增量的类,每个按下的按钮对应一个布尔值

我还有一个通过状态管理器类管理的基本状态机,该类维护堆栈并封送状态

我想知道的是,如何最好地将输入(快照)传递到我的应用程序在任何时候都可能处于的各个状态

我希望尽可能多地处理来自各个状态的输入,以减少状态内的重复逻辑

或者最好保持输入快照尽可能纯净,并将其传递给状态,以便它们可以隐藏特定于输入的逻辑

注意

这种结构与我想象中的游戏的工作方式类似,虽然此应用程序不是游戏,但它确实需要尽快处理。

为什么每次点击都要查询键盘和鼠标的状态?一个更好的传统解决方案是捕获从键盘和鼠标触发的事件。这样,您只需在必要时更新状态。

为什么每次勾选都要查询键盘和鼠标的状态?一个更好的传统解决方案是捕获从键盘和鼠标触发的事件。这样,您只需在必要时更新状态。

在XNA中,他们通过使键盘类为静态来实现这一点

KeyboardState state = Keyboard.GetState();

然后,您可以使用上面的代码行访问当前的按键状态。

在XNA中,他们通过使键盘类为静态来实现这一点

KeyboardState state = Keyboard.GetState();

然后,您可以使用上述代码行访问当前密钥状态。

您应该触发事件并捕获参数。这将是最简单、最有效的处理方法

class YourClass
{    
    //data members ...

    public void OnKeyboardPress(object sender, EventArgs args)
    {
        //handle your logic capturing the state here
    }
}

//elsewhere
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress);

您应该触发事件并捕获参数。这将是最简单、最有效的处理方法

class YourClass
{    
    //data members ...

    public void OnKeyboardPress(object sender, EventArgs args)
    {
        //handle your logic capturing the state here
    }
}

//elsewhere
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress);

如果你只是在键盘和鼠标的每个滴答声中进行查询,我可以保证你会遇到问题。当你查询每个刻度时,你会发现你错过了快速发生的输入(在单个刻度的时域内)。设想一种情况,用户在两个滴答声之间按下并释放一个键/按钮(发生的次数比您想象的要多)——您将完全错过输入


特别是在C#中,它完全适合这样的输入事件,您应该使用事件。

如果您只需在每次滴答声中查询键盘和鼠标,我可以保证您会遇到问题。当你查询每个刻度时,你会发现你错过了快速发生的输入(在单个刻度的时域内)。设想一种情况,用户在两个滴答声之间按下并释放一个键/按钮(发生的次数比您想象的要多)——您将完全错过输入


特别是在C#中,它完全适合这样的输入事件,您应该使用事件。

我目前正在按照这些思路工作,所以我会告诉您结果如何。我最终同意将一个委托传递给我的输入类,该类仅在事件中被调用。干杯我目前正沿着这些思路工作,所以我会让你知道结果如何。我最终同意将一个委托传递给我的输入类,该类只在事件中被调用。干杯