WinForm:按下多个键

本文关键字:WinForm | 更新日期: 2023-09-27 18:30:28

我正在开发像"太空侵略者"这样的简单游戏,我遇到了一个问题。我试图让用户有可能从左到右移动尽可能多的内容,同时有可能使用"空格键"进行拍摄。

我的问题是:当我按下超过 1 个键时,只有 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();
     }
    

我的问题是:什么是使这项工作的好方法?

(对不起我的英语)

WinForm:按下多个键

您依靠键盘控制器在按住键盘时重复该键。 当您按下另一个键时,这将停止工作。 这需要一种不同的方法。

首先,您需要一个枚举来指示宇宙飞船的运动状态,其值为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..
    }