2008-10-28 124 views
1

我会尽我所能地解释我的场景;将输入传递给状态机(c#)

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

我也有一个基本的状态机,通过一个状态管理器类来管理,该状态管理器维护堆栈和编组状态。

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

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

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

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

回答

2

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

+0

我目前正在沿着这些方向努力,所以我会尽快给您发布。 – 2008-10-28 16:11:05

1

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

KeyboardState state = Keyboard.GetState(); 

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

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); 
2

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

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