我正在尝试制作一个移动的图片框(带有我的'播放器'的图像),这一切都运行正常,但我遇到了Windows字符延迟问题。
对于那些不知道这是什么的人:如果按住一个键,窗口将打印出来,等待一秒钟,然后发送垃圾邮件。
所以会发生什么,我的播放器移动10px等待,然后按原样移动。
移动代码:
if (e.KeyCode == Keys.Left)
{
if (shipBox.Left >= 7)
{
shipBox.Left -= 10;
}
}
if (e.KeyCode == Keys.Right)
{
if (shipBox.Left <= 375)
{
shipBox.Left += 10;
}
}
if (e.KeyCode == Keys.Up)
{
if (shipBox.Top >= 120)
{
shipBox.Top -= 10;
}
}
if (e.KeyCode == Keys.Down)
{
if (shipBox.Top <= 520)
{
shipBox.Top += 10;
}
}
答案 0 :(得分:1)
有一种解决方法
基本上你有一个定时器,它会按照你选择的固定间隔移动图片
打开计时器以继续OnKeyDown
并在OnKeyUp
上将其关闭。确保OnKeyDown
您提供可以移动的X / Y坐标。并在OnKeyUp
事件上重置该值。
public class MyForm : Form
{
private int deltaX;
private int deltaY;
private const int movementAmount = 10;
private Timer movementTimer = new Timer();
public MyForm()
{
movementTimer.Interval = 100; // make this whatever interval you'd like there to be in between movements
movementTimer.Tick += new EventHandler(movementTimer_Tick);
}
void movementTimer_Tick(object sender, EventArgs e)
{
myMonster.Location = new Point(myMonster.X + deltaX, myMonster.Y + deltaY);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
switch (e.KeyCode)
{
case Keys.Left:
{
deltaX -=movementAmount;
} break;
case Keys.Right:
{
deltaX += movementAmount;
} break;
case Keys.Up:
{
deltaY -= movementAmount;
} break;
case Keys.Down:
{
deltaY += movementAmount;
} break;
}
UpdateTimer();
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
switch (e.KeyCode)
{
case Keys.Left:
{
deltaX += movementAmount;
} break;
case Keys.Right:
{
deltaX -= movementAmount;
} break;
case Keys.Up:
{
deltaY += movementAmount;
} break;
case Keys.Down:
{
deltaY -= movementAmount;
} break;
}
UpdateTimer();
}
private void UpdateTimer()
{
movementTimer.Enabled = deltaX != 0 || deltaY != 0;
}
}
注意:如果条件很多,请尝试Switch..Case
答案 1 :(得分:0)
我想你正试图创造某种游戏。如果你想让它的动作平滑,你不应该更新你的玩家图像的位置,或者在键盘/鼠标事件处理程序中重绘它的图像。相反,你应该实现某种主循环(在一个单独的线程,定时器回调函数,或者可能在主窗口循环中),它将根据当前按下的键和自上次更新后经过的时间更新播放器的屏幕位置。重绘它。