2010-02-26 51 views
1

嘿,我正在做一個青蛙類型的遊戲,我正在使用計時器使圖像在屏幕上移動。我也使用keydown事件來處理用戶何時移動'青蛙'。所以,w向上移動,s向下移動等。keydown凍結計時器c#

我遇到的問題是,只要用戶按下任何移動按鈕,計時器就會凍結。這意味着,如果用戶只是按住'w'或向上,所有的汽車停止移動。

有沒有辦法將計時器放在後臺工作人員中,或者即使用戶正在移動時,也可以使計時器繼續打勾?

感謝您的幫助!

這是我目前有:

public string i; 
    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 68) 
     { 
      i = "right"; 
      backgroundWorker1.RunWorkerAsync(); 
     } 
    } 


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (i == "right") 
     { 
      pictureBox1.Location = new Point((pictureBox1.Location.X + 17), pictureBox1.Location.Y); 
     } 
    } 

回答

2

使用調試器運行程序時,請查看輸出窗口。你會看到很多IllegalOperationException消息。後臺工作者方法正在死於異常,您不會注意到它,因爲您沒有檢查DoWorkCompleted事件處理程序中的e.Error屬性。這就是爲什麼它沒有移動。

您不允許在後臺線程中設置控件的屬性。這是例外情況試圖告訴你的。您需要放棄使用線程來實現UI邏輯的想法。遊戲通常通過game loop來實現。

+0

感謝您的幫助! – Crazyd22 2010-02-26 17:52:59

3

後臺線程或工人是解決方案。這是一個簡單的後臺工作者。

 BackgroundWorker bw = new BackgroundWorker(); 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerAsync(); 
    } 


    static Timer _t; 
    static void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     _t = new Timer(); 
     _t.Start(); 
    } 
+0

感謝您的幫助,我會給這個去 – Crazyd22 2010-02-26 17:24:40

+0

希望它有幫助。如果你正在處理可能阻塞的ui線程上的keydown事件,那麼它可能取決於你的繪圖和處理代碼被處理的線程。 – 2010-02-26 17:28:07

+0

確保不要使用WinForms事件驅動的定時器組件... – t0mm13b 2010-02-26 17:30:52

1

您需要實現一個線程以在後臺運行,以跟蹤計時器或使用Backgroundworker類爲您執行此操作。如果你想要精確的Timer,使用System.Threading.Timer類。

希望這會有所幫助, 最好的問候, 湯姆。