注意:由于API限制(SFML),我必须轮询而不是回调。对于缺少“体面”的头衔,我也表示歉意。
我想我有两个问题。如何注册我收到的输入,以及如何处理。
处理输入
我在说的是您已经注册了例如已经按下“ A”键的事实,以及如何从那里开始操作。
我看过整个键盘的排列,例如:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
但这似乎效率很低。例如,您不仅将键“ A”耦合到“玩家向左移动”,而且还会每秒检查30-60次每个键。
然后,我尝试了另一个仅查找所需密钥的系统。
std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'.
input->BindKey(Keys::PlayerLeft, KeyCode::A); //so now you can check if PlayerLeft, rather than if A.
但是,与此有关的问题是,例如,现在我不必绑定每个键就无法键入名称。
然后,我有第二个问题,我真的不能想到一个好的解决方案:
发送输入
我现在知道按下了A键,或者playerLeft为true。但是我怎么从这里走?
我考虑过只检查一下,
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
这将输入与实体紧密结合在一起,我发现它很混乱。我希望玩家在更新时处理自己的动作。我以为某种事件系统可以工作,但是我不知道如何使用它。(我听说信号和插槽对这种工作很有用,但是它看起来非常慢,我看不出它的适合程度)。
谢谢。