1

我会尽力解释我的情况;

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

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

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

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

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

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

4

4 回答 4

2

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

于 2008-10-28T14:25:36.333 回答
2

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

尤其是在完全适合此类输入事件的 C# 中,您应该使用事件。

于 2008-10-28T18:22:19.820 回答
1

在 XNA 中,他们通过将键盘类设为静态来做到这一点。

KeyboardState state = Keyboard.GetState();

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

于 2008-10-28T14:32:29.377 回答
0

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

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);
于 2008-10-28T17:23:08.440 回答