4

我正在做一个简单的游戏,比如“太空侵略者”,我遇到了一个问题。我试图为用户提供从左到右随心所欲地移动的可能性,同时可以使用“空格键”进行拍摄。

我的问题是:当我按下超过 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();
     }
    

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

(对不起我的英语不好)

4

1 回答 1

7

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

首先,您需要一个枚举来指示飞船的运动状态,其中包含 NotMoving、MovingLeft 和 MovingRight 等值。将该类型的变量添加到您的类中。您将需要 KeyDownKeyUp 事件。当您获得 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..
    }
于 2012-04-08T15:06:00.367 回答