我正在WPF中编写俄罗斯方块克隆。如果我按住向右箭头键,则当前片段会向右移动。为了提高可玩性,我想允许用户按下另一个键(即F键)并旋转移动的棋子,而不必先松开向右箭头键。目前,当我执行此操作时,乐曲停止移动。
我对此的第一个基本尝试就是加入
Window_PreviewKeyDown(object sender, KeyEventArgs e)
然后向控制器层发送一条消息。
如何构造输入监听代码以允许这样做?
我当前的代码Here
最佳答案
还应该存在一个KeyUp事件,并且通过同时使用KeyDown和KeyUp可以达到所需的效果。可以通过几种方法来完成。
一种是让您的KeyDown事件启动一个重复动作,然后让KeyUp取消它。
另一个方法是存储是否按住某些键。保留键列表,并在KeyDown时将其打开,并在KeyUp时将其关闭。在游戏主循环中,您将触发与当前按下的所有键相对应的事件。
一个例子:
bool[] heldDown = new bool[256]; // One index for the keycode of each key
void Window_PreviewKeyDown(object sender, KeyEventArgs e) {
heldDown[e.KeyCode] = true;
}
void Window_PreviewKeyUp(object sender, KeyEventArgs e) {
heldDown[e.KeyCode] = false;
}
然后,在主循环中进行“ heldDown”操作,并为按住的每个有意义的键触发事件:
if (heldDown[Key.F])
MainController.TriggerPieceEvent(Constants.PieceEvents.RotateClockwise);
if (heldDown[Key.Left])
MainController.TriggerPieceEvent(Constants.PieceEvents.ShiftLeft);
// etc...
关于c# - 键盘C#WPF的多个输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2585981/