难处理 多按键“同时响应” 总结

 
情景引入

 

 

一.  处理对象八个方向的移动(左上,右下,等)
二.  功能按键加组合键(Ctrl + A,等)该处理类似是与情景一
三.  双人对弈的游戏(如格斗类)

四.  同时响应多按键.(如音乐类游戏,同时按下F和J按键才算击中)(注意是同时相应,而不是拿个什么标识来处理那个按下了!那个未按下

 

 
相关解决方案

 

 

1》 对于处理情景一,网上有比较多的解决方案,主要实现方式为,数组矩阵,也有少量的使用布尔标识来处理

代码就不贴了:博客园的 作者 nowpaper 就已经写了 Silverlight C# 游戏开发:方向键的组合,八方向实现

http://www.cnblogs.com/nowpaper/archive/2010/03/09/1680172.html

2》 对于第二种功能组合,大部分是标识处理,或者 执行相应的 异域 运算,前提是 该枚举 支持 Flag

举个例子:Winform的,但是大部分处理都类似

C# winform的窗体类有KeyPreview属性,可以接收窗体内控件的键盘事件注册。
窗体和控件都有KeyDown,KeyUp,KeyPress三个事件,每个事件都会有KeyEventArgs参数传入,只要判断传入参数的KeyChar就可以了,Framework提供了Keys枚举来表示键盘上的各个键。

核心判断的代码如下:
1.单键判断
if (e.KeyCode == Keys.Delete)
{
//处理逻辑
}
2.组合建判断:
if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.Delete)
{
//处理逻辑
}

3》 这个需要建立2个逻辑区域,后面的实现基本和情景一相同

4》 惭愧!啊!暂时没有找到任何的解决方案!基本不能在同一时刻处理多按键响应

我想了很久,自己觉得一般的解决方案大概就2种:(可能是自己操作系统知识了解太少的缘故)

1.用第三个按键,取代双按键响应问题,但是这样会带来较差的按键体验。

2.使用按键线程池,在某一个时刻,把有效的按键放入这个池中,(当然这个要多线程)
然后延迟大概100毫秒,取出当前所以已经按下的按键,这样就可以组合了。但是这100毫秒
的延迟是个问题,有时候100毫秒就来不及按下2个按键。

 

 

 

 

该随笔意在总结C/S程序中常见按键处理问题!最终只有 情景四 无好的结果,不知道有人是否知道如何处理

posted @ 2012-03-08 11:05  JasNature  阅读(4083)  评论(7编辑  收藏  举报
我要赞个
我要评论
我要收藏