首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自键盘C# WPF的多个输入

来自键盘C# WPF的多个输入
EN

Stack Overflow用户
提问于 2010-04-06 15:14:25
回答 4查看 3K关注 0票数 2

我正在用WPF写一个俄罗斯方块的克隆。如果我按住正确的箭头键,当前的部分向右移动。为了可玩性,我想让用户按下另一个键(即F键)并旋转移动的部分,而不必先松开右箭头键。目前,当我这样做,作品停止移动。

我在这方面的第一次基本尝试就是勾引

代码语言:javascript
复制
Window_PreviewKeyDown(object sender, KeyEventArgs e)

然后向控制器层发送消息。

如何构造输入侦听代码以允许这样做?

我的当前代码这里

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-06 15:24:33

还应该存在一个KeyUp事件,通过使用KeyDown和KeyUp,您可以实现您想要的效果。可以做的有几种方法。

一种方法是让您的KeyDown事件启动一个重复操作,并让KeyUp取消它。

另一种方法是存储某些钥匙是否被按住。保存一个键列表,并在KeyDown和KeyUp上切换它们。在游戏主循环中,您将触发与当前所有按键相对应的事件。

举个例子:

代码语言:javascript
复制
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“,并为正在按住的每个有意义的键触发事件:

代码语言:javascript
复制
if (heldDown[Key.F])
    MainController.TriggerPieceEvent(Constants.PieceEvents.RotateClockwise);
if (heldDown[Key.Left])
    MainController.TriggerPieceEvent(Constants.PieceEvents.ShiftLeft);
// etc...
票数 2
EN

Stack Overflow用户

发布于 2010-04-06 15:39:11

你是依靠钥匙自动重复,以保持该部分的运动。这是不合适的,用户的键盘重复延迟是可变的,并将影响游戏的可玩性。正如你所发现的,当另一个键被按下时,它就停止自动重复。

通过给予每个游戏对象作为运动状态来修正这个问题。使用KeyDown事件来更改它。以及重置它的KeyUp事件,如果运动状态值仍然与键匹配。在游戏循环中,根据游戏对象的运动状态更新游戏对象的位置。这样做是以固定的速度,由计时器触发。

运动状态也应表示“跌倒”。现在你只需降低定时器率,就可以使游戏变得更加困难。碎片掉得更快。而且键盘变得更有反应能力,让用户有机会赢得一个等级。

票数 3
EN

Stack Overflow用户

发布于 2010-04-06 15:21:58

Windows只会为您按下的最后一个键重复事件。此外,在第一次重复键之前的延迟,以及它的重复频率,取决于通常为打字而不是为游戏而优化的设置。因此,对于游戏来说,最好完全忽略它们,并有自己的方法来实现“重复”键。

基本上,您必须保持您感兴趣的键的状态(按下或释放),并在收到KeyDown或KeyUp事件时更改它们。然后,在某种计时器中,您将必须检查状态和触发事件的每一个键是在那一刻。如果该定时器发生在控制器层或UI中,则取决于您的体系结构:-)

您可能会添加额外的检查,比如当左键和右键都按下以忽略这两个键时,否则将重复地跳到左键和右键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2585981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档