WinForm:按下多个键
本文关键字:WinForm | 更新日期: 2023-09-27 18:30:28
我正在开发像"太空侵略者"这样的简单游戏,我遇到了一个问题。我试图让用户有可能从左到右移动尽可能多的内容,同时有可能使用"空格键"进行拍摄。
我的问题是:当我按下超过 1 个键时,只有 1 个功能运行。
这里有一些我尝试的东西:
-
将密钥存储在
List<Keys>
中(但我没有找到任何好方法来执行这些功能,一切都变得混乱)2.key_down事件的正常处理如下:
protected void Form1_keysDown(object obj, KeyEventArgs e) { (e.KeyData == Keys.Space) spaceShip.FireBullets(); if (e.KeyCode == Keys.Left) spaceShip.MoveLeft(); if (e.KeyCode == Keys.Right) spaceShip.MoveRight(); }
我的问题是:什么是使这项工作的好方法?
(对不起我的英语)
您依靠键盘控制器在按住键盘时重复该键。 当您按下另一个键时,这将停止工作。 这需要一种不同的方法。
首先,您需要一个枚举来指示宇宙飞船的运动状态,其值为NotMoving,MovingLeft和MovingRight。 将该类型的变量添加到类中。 您将需要 KeyDown 和 KeyUp 事件。 当你得到一个KeyDown时,比如说,Keys.Left,然后将变量设置为MovingLeft。 当您获得 Keys.Left 的 KeyUp 事件时,首先检查状态变量是否仍为 MovingLeft,如果是,请将其更改为 NotMoving。
在游戏循环中,使用变量值移动宇宙飞船。 一些示例代码:
private enum ShipMotionState { NotMoving, MovingLeft, MovingRight };
private ShipMotionState shipMotion = ShipMotionState.NotMoving;
protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyData == Keys.Left) shipMotion = ShipMotionState.MovingLeft;
if (e.KeyData == Keys.Right) shipMotion = ShipMotionState.MovingRight;
base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e) {
if ((e.KeyData == Keys.Left && shipMotion == ShipMotionState.MovingLeft) ||
(e.KeyData == Keys.Right && shipMotion == ShipMotionState.MovingRight) {
shipMotion = ShipMotionState.NotMoving;
}
base.OnKeyUp(e);
}
private void GameLoop_Tick(object sender, EventArgs e) {
if (shipMotion == ShipMotionState.MovingLeft) spaceShip.MoveLeft();
if (shipMotion == ShipMotionState.MovingRight) spaceShip.MoveRight();
// etc..
}