我有一个问题,我正在努力解决。我想使用键盘以对角线的方式向左、向右、向上或向下移动图像。我在网上搜索并发现,要使用 2 个不同的键,我需要记住上一个键,因此我使用的是布尔词典。
在我的主窗体类中,这是 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
}
还有我的基础车类:
private Dictionary KeysD = new Dictionary(); // there is a method to set the W|A|S|D Keys, like: 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
您不会直接为此类事情处理关键事件。相反,您可以跟踪当前按下的键。物理计算是按某个时间间隔完成的,这可以通过计时器完成。下面的快速和肮脏的例子。但是,这不是您应该尝试使用WinForms的那种事情。
private const int ACCELERATION = 1;
private HashSet<Keys> pressed;
private int velocityX = 0;
private int velocityY = 0;
public Form1()
{
InitializeComponent();
pressed = new HashSet<Keys>();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
pressed.Add(e.KeyCode);
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
pressed.Remove(e.KeyCode);
}
private void timer1_Tick(object sender, EventArgs e)
{
car.Location = new Point(
car.Left + velocityX,
car.Top + velocityY);
if (pressed.Contains(Keys.W)) velocityY -= ACCELERATION;
if (pressed.Contains(Keys.A)) velocityX -= ACCELERATION;
if (pressed.Contains(Keys.S)) velocityY += ACCELERATION;
if (pressed.Contains(Keys.D)) velocityX += ACCELERATION;
}