我正在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/

10-16 09:15