我正在用WPF写一个俄罗斯方块的克隆。如果我按住正确的箭头键,当前的部分向右移动。为了可玩性,我想让用户按下另一个键(即F键)并旋转移动的部分,而不必先松开右箭头键。目前,当我这样做,作品停止移动。
我在这方面的第一次基本尝试就是勾引
Window_PreviewKeyDown(object sender, KeyEventArgs e)然后向控制器层发送消息。
如何构造输入侦听代码以允许这样做?
我的当前代码这里
发布于 2010-04-06 15:24:33
还应该存在一个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...发布于 2010-04-06 15:39:11
你是依靠钥匙自动重复,以保持该部分的运动。这是不合适的,用户的键盘重复延迟是可变的,并将影响游戏的可玩性。正如你所发现的,当另一个键被按下时,它就停止自动重复。
通过给予每个游戏对象作为运动状态来修正这个问题。使用KeyDown事件来更改它。以及重置它的KeyUp事件,如果运动状态值仍然与键匹配。在游戏循环中,根据游戏对象的运动状态更新游戏对象的位置。这样做是以固定的速度,由计时器触发。
运动状态也应表示“跌倒”。现在你只需降低定时器率,就可以使游戏变得更加困难。碎片掉得更快。而且键盘变得更有反应能力,让用户有机会赢得一个等级。
发布于 2010-04-06 15:21:58
Windows只会为您按下的最后一个键重复事件。此外,在第一次重复键之前的延迟,以及它的重复频率,取决于通常为打字而不是为游戏而优化的设置。因此,对于游戏来说,最好完全忽略它们,并有自己的方法来实现“重复”键。
基本上,您必须保持您感兴趣的键的状态(按下或释放),并在收到KeyDown或KeyUp事件时更改它们。然后,在某种计时器中,您将必须检查状态和触发事件的每一个键是在那一刻。如果该定时器发生在控制器层或UI中,则取决于您的体系结构:-)
您可能会添加额外的检查,比如当左键和右键都按下以忽略这两个键时,否则将重复地跳到左键和右键。
https://stackoverflow.com/questions/2585981
复制相似问题