C#多键按下

时间:2018-04-03 09:22:23

标签: c# winforms

所以我正在开发一款游戏/应用程序 - 2D赛车游戏,我正在尽我所能,但我已经研究过C#1年了。 我的问题是我有两个图像(简单的汽车),我可以通过KeyData移动它们的位置。它起作用,除非我希望它们两个一次移动。 这就是我用=>

移动它的原因
protected override bool Move(ref Message msg, Keys KeyData)
{
    if (KeyData == Keys.Up)
    {
        bluePoint.Y -= normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.Down)
    {
        bluePoint.Y += normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.Left)
    {
        bluePoint.X -= normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.Right)
    {
        bluePoint.X += normalSpeed;
        Refresh();
        return true;
    }

    if (KeyData == Keys.W)
    {
        redPoint.Y -= normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.S)
    {
        redPoint.Y += normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.A)
    {
        redPoint.X -= normalSpeed;
        Refresh();
        return true;
    }
    if (KeyData == Keys.D)
    {
        redPoint.X += normalSpeed;
        Refresh();
        return true;
    }

    return true;

}

1 个答案:

答案 0 :(得分:1)

键是flags enum,因此所有信息都在那里,您可能应该重写if语句。为方便起见,Enum有HasFlag方法:

if( keyData.HasFlag( Keys.Up ) )

在处理你的一把钥匙之后你也可能不应该return true

有关旗帜的更多信息:What does the [Flags] Enum Attribute mean in C#?

protected override bool Move(ref Message msg, Keys KeyData)
{
    if (KeyData.HasFlag(Keys.Up))
    {
        bluePoint.Y -= normalSpeed;
    }
    if (KeyData.HasFlag(Keys.Down))
    {
        bluePoint.Y += normalSpeed;
    }
    if (KeyData.HasFlag(Keys.Left))
    {
        bluePoint.X -= normalSpeed;
    }
    if (KeyData.HasFlag(Keys.Right))
    {
        bluePoint.X += normalSpeed;
    }

    if (KeyData.HasFlag(Keys.W))
    {
        redPoint.Y -= normalSpeed;
    }
    if (KeyData.HasFlag(Keys.S))
    {
        redPoint.Y += normalSpeed;
    }
    if (KeyData.HasFlag(Keys.A))
    {
        redPoint.X -= normalSpeed;
    }
    if (KeyData.HasFlag(Keys.D))
    {
        redPoint.X += normalSpeed;
    }

    Refresh();
    return true;

}