Direct2D随笔4——GameInput

本文介绍了使用Direct2D进行2D游戏开发时的游戏输入处理,通过GetAsyncKeyState函数获取按键状态,并在GameLoop中更新游戏消息。作者选择了上下左右四个基本方向键进行处理,实测在1/60秒内占用资源极低。开发环境为VS 2013 C#,运行在Windows 8.1系统上。

继续~首先是要加载 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;
            }
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值