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

4245

被折叠的 条评论
为什么被折叠?



