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
原创粉丝点击