2013-10-18 81 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