2013-04-20 52 views
0

我目前正在嘗試編寫經典的蛇類遊戲,其中用戶使用鍵盤的箭頭鍵將蛇引導到屏幕周圍。到目前爲止,我已經成功地整理了指示移動和鍵盤控制的代碼,但在嘗試合併這些代碼段時遇到了問題。Visual Basic C#窗體窗體背景工作人員對象運動循環無法按預期運行

要移動的蛇,我使用單獨的後臺工作循環的每個箭頭鍵這樣:

public void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 

      for (int i = 0; i < 1000; i++) 
      { 
       if (abortloop == true) 
       { 
        worker2 = null; 
        worker3 = null; 
        worker4 = null; 
        break; 
       } 
       while (Snake1.Top - 5 >= 8) 
       { 
        { 
         this.Invoke((MethodInvoker)delegate() 
         { 
          Snake1.Top = Snake1.Top - 5; 
           Refresh(); 
         }); 
         System.Threading.Thread.Sleep(500); 



        } 
       } 
      } 
     } 

在後臺工作,從鍵盤輸入稱爲:

else if (e.KeyCode == Keys.W) 
     { 
      abortloop2 = true; 
      abortloop3 = true; 
      abortloop4 = true; 
      if (worker == null && abortloop == true) 
      { 
       abortloop = false; 
       worker = new BackgroundWorker(); 
       worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
       worker.RunWorkerAsync(); 
      } 
     } 

所有這段代碼不會給程序帶來致命的錯誤,但是,在命令蛇向另一個方向移動時(在這種情況下,假設它正在向下移動,並且按下右箭頭鍵),蛇會開始移動在適當的方向,但也carr y與以前相同的方向移動(按下右箭頭鍵,蛇然後開始對角線移動,而不是像我想要的那樣向右移動)。這個問題根本不在於存在4個獨立的後臺工作者,因爲如果我只爲所有關鍵輸入使用1個後臺工作者,就會出現同樣的問題。

如果有人在這裏可以幫忙,那太棒了。

在此先感謝!

+0

您的代碼有*許多*問題。共享像* abortloop *這樣的變量需要同步,因爲它可以被多個線程讀取和寫入。您無法同步正在休眠的線程。通過放棄線程並實現遊戲循環來取得成功。你會從「winforms遊戲循環」中獲得體面的谷歌搜索結果。 – 2013-04-21 13:17:38

回答

0

用,如果更換,而...

if (Snake1.Top - 5 >= 8) 

的循環應該留給外界的,而你只是要檢查的空間,而不是守在內環減少頂部。 ;-)

+0

哇,我花了這麼多時間試圖解決它,我所要做的就是......哈哈。通過C.B.的建議,爲現場歡呼! :) – user2302118 2013-04-21 16:18:20