如何使用2键使用KeyBoard移动图像?

时间:2013-01-22 12:58:15

标签: c# forms class events

我有一个问题,我正在努力.. 我想用键盘向左,向右,向上或向下以对角线方式移动图像。 我在网上搜索并发现,要使用2个不同的密钥,我需要记住以前的密钥,所以我正在使用bool字典。

在我的主要Form类中,这就是KeyDown事件的样子:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    baseCar.carAccelerate(e.KeyCode.ToString().ToLower());
    carBox.Refresh(); //carbox is a picturebox in my form that store the image I want to move.
}

我的KeyUp事件:

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    baseCar.carBreak(e.KeyCode.ToString().ToLower());
}

我的油漆事件:

private void carBox_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(Car, baseCar.CharPosX, baseCar.CharPosY); // Car is just an image
}

我的baseCar类:

私人词典KeysD = new Dictionary(); //有一种设置W | A | S | D键的方法,如:KeysD.Add(“w”,false)

    public void carAccelerate(string moveDir)
    {       
        KeysD[moveDir] = true;
        moveBeta();
    }
    public void moveBeta()
    {
        if (KeysD["w"])
        {
            this.CharPosY -= this.carMoveYSpeed;
        }
        if (KeysD["s"])
        {
            CharPosY += carMoveYSpeed;
        }
        if (KeysD["a"])
        {
            CharPosX -= carMoveXSpeed;
        }
        if (KeysD["d"])
        {
            CharPosX += carMoveXSpeed;
        }
    }
    public void carBreak(string str)
    {
        KeysD[str] = false;
    }

无论如何它可行,但我的问题是我无法回到第一个按下的键,例如:

我按W向上移动,然后D键向对角线移动,当我释放D键时,它不会再次上升,因为KeyDown事件是“死”并且不会再次调用carAccelerate()方法。 我无法弄清楚如何解决它..

任何人都能帮帮我吗? 也许有更好的方法来处理密钥?我愿意接受任何想法! 我希望你能理解它,我的英语不是最好的:S

1 个答案:

答案 0 :(得分:1)

存储所有密钥状态,不要在按键上设置动画,但例如使用计时器。

然后:

KeyDown(key)
{
   KeyState[key] = true;
}

KeyUp(key)
{
   KeyState[key] = false;
}

Timer_Tick()
{
    Animate();
}    

Animate()
{
    if (KeyState["W"])
    {
        // Accelerate
    }
    if (KeyState["S"])
    {
        // Decelerate
    }

}

然后在KeyDown方法中,您可以检查是否存在冲突键(如果同时按下加速+减速,等等)。

相关问题