我会尽力解释我的情景;

在每个应用程序 tick 中,我查询键盘和鼠标的当前状态,并将它们包装在各个类和数据结构中。对于键盘,它是我的 Keys 枚举的数组(当前按下的每个键的一个项目),对于鼠标,它是一个包含按下的每个按钮的坐标delta和bool的类。

我还有一个通过状态管理器类管理的基本状态机,它维护堆栈并编组状态。

我想知道的是,如何最好地将输入(快照)传递给我的应用程序可以在任何时间进入的各个状态?

我希望尽可能多地处理远离各个状态的输入,以减少状态中的重复逻辑。

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

注意结果 这种结构类似于我想象的游戏是如何工作的,虽然这个应用程序不是游戏,但它确实需要尽快处理。

有帮助吗?

解决方案

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

其他提示

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

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

在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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top