Direct2D随笔4——GameInput
来源:互联网 发布:购买淘宝网店铺 编辑:程序博客网 时间:2024/05/01 03:30
继续~首先是要加载 GetAsyncKeyState函数,然后把事件搞定,最后每个GameLoop运行一次UpdateGameMessage函数。我只选择加载了上下左右四个键,如果所需要更多则要在ProcessControlKeys里添加。速度经过证实还是挺快的,在1/60s里面基本占用不到1%……
顺便注明,我开发用的是VS 2013 C# Windows8.1 Intel Core 2 i7-3610QM 8G内存
代码:
internal class KeyState { public bool keyPressDetected = false; public bool Held; public bool Pressed; public KeyState () { Held = false; Pressed = false; } internal void OnDown () { if (Held == false) keyPressDetected = true; Held = true; } internal void OnUp () { Held = false; } internal void Process () { Pressed = false; if (keyPressDetected) { Pressed = true; keyPressDetected = false; } } } public class GameInput { [DllImport("User32.dll")] public static extern short GetAsyncKeyState (int vKey); Control controlTarget; public KeyPressEventHandler keyPressEvent = null; Dictionary<Keys, KeyState> keyStates; public GameInput (Control ControlTarget) { controlTarget = ControlTarget; keyStates = new Dictionary<Keys, KeyState>(); controlTarget.KeyDown += new KeyEventHandler(OnKeyDown); controlTarget.KeyUp += new KeyEventHandler(OnKeyUp); controlTarget.KeyPress += new KeyPressEventHandler(OnKeyPress); } void OnKeyUp (object sender, KeyEventArgs e) { EnsureKeyStateExisits(e.KeyCode); keyStates[e.KeyCode].OnUp(); } void OnKeyDown (object sender, KeyEventArgs e) { EnsureKeyStateExisits(e.KeyCode); keyStates[e.KeyCode].OnDown(); } void OnKeyPress (object sender, KeyPressEventArgs e) { if (keyPressEvent != null) keyPressEvent(sender, e); } private void EnsureKeyStateExisits (Keys key) { if (!keyStates.Keys.Contains(key)) { keyStates.Add(key, new KeyState()); } } public bool IsKeyPressed (Keys key) { EnsureKeyStateExisits(key); return keyStates[key].Pressed; } public bool IsKeyHeld (Keys key) { EnsureKeyStateExisits(key); return keyStates[key].Held; } private bool PollKeyPress (Keys key) { return (GetAsyncKeyState((int)key) != 0); } private void ProcessControlKeys () { UpdateControlKey(Keys.Left); UpdateControlKey(Keys.Right); UpdateControlKey(Keys.Up); UpdateControlKey(Keys.Down); } private void UpdateControlKey (Keys key) { if (PollKeyPress(key)) OnKeyDown(this, new KeyEventArgs(key)); else OnKeyUp(this, new KeyEventArgs(key)); } protected long KeyStatu (int i, bool statu) { long result = 0; if (statu) return result; result = (long)Math.Pow(2, i); return result; } public void UpdateGameMessage (GameKeyboard gameKeyboard) { ProcessControlKeys(); foreach (KeyState state in keyStates.Values) { state.Pressed = false; state.Process(); } return; } }
0 0
- Direct2D随笔4——GameInput
- Direct2D随笔1——构建D2D环境
- Direct2D随笔3——构建游戏基础结构
- Direct2D随笔2——在C#的WinForm环境下创建Gameloop
- 高效的渲染引擎——Direct2D入门
- 寇龙威——随笔
- 随笔——梦想
- 随笔——通信
- 随笔——Shadow
- 随笔——码神
- 随笔——三省吾身
- 随笔——CSDN
- 随笔——共同富裕
- 随笔——征婚
- 随笔——想念
- 随笔——腾讯
- 随笔——新思路
- 数据结构随笔—图
- 测试一下
- 虚拟键码对照表
- Tyvj P1015 公路乘车 (DP)
- 待字闺中之兄弟数字分析
- JSP2.x自定义标签的创建
- Direct2D随笔4——GameInput
- 嘟嘟
- Linux mutex相关知识
- android 多线程
- windows下Eclipse启动tomcat提示端口已被占用 already in use
- Android O/R Mapping 框架
- Android获取屏幕分辨率及dp与 pix间的转换
- HTTP状态代码(各种错误代码集合)
- Android采用ListView实现数据列表显示