WinForm:按下多个键

时间:2012-04-08 14:34:46

标签: c# winforms

我正在开发像“太空入侵者”这样的简单游戏,我遇到了一个问题。 我试图给用户提供从左到右移动尽可能多的可能性,同时可以使用“空格键”拍摄。

我的问题是:当我按下多于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();
     }
    
  2. 我的问题是:什么是使这项工作的好方法?

    (对不起我的英文)

1 个答案:

答案 0 :(得分:7)

您按住键盘控制器时按住键重复按键。按下其他键时停止工作。这需要采用不同的方法。

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