2013-10-18 52 views
0

我想制作一个移动的图片盒(带有我的'玩家'的图像),这一切都很好,但我得到了Windows字符延迟的麻烦。
对于你不知道这是什么:如果你按住一个键将打印它,等待一秒钟,然后发送垃圾邮件。字符延迟c#

所以会发生什么是我的播放器移动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; 
    } 
} 

回答

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当你有很多的条件

+0

谢谢!非常有帮助 – EpicKip

0

我想你想创造一些类型的游戏。如果你希望它的运动平滑,你不应该更新你的播放器图像的位置,或者在键盘/鼠标事件处理程序中重新绘制它的图像。相反,您应该实现某种主循环(在单独的线程,定时器回调函数中,或者可能在主窗口循环中),根据当前按下的键和自上次更新之后的时间更新玩家的屏幕位置,以及重新绘制它。

+0

嗯,这使得有很大的意义。将在未来尝试执行此操作:) – EpicKip