我目前正在嘗試編寫經典的蛇類遊戲,其中用戶使用鍵盤的箭頭鍵將蛇引導到屏幕周圍。到目前爲止,我已經成功地整理了指示移動和鍵盤控制的代碼,但在嘗試合併這些代碼段時遇到了問題。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個後臺工作者,就會出現同樣的問題。
如果有人在這裏可以幫忙,那太棒了。
在此先感謝!
您的代碼有*許多*問題。共享像* abortloop *這樣的變量需要同步,因爲它可以被多個線程讀取和寫入。您無法同步正在休眠的線程。通過放棄線程並實現遊戲循環來取得成功。你會從「winforms遊戲循環」中獲得體面的谷歌搜索結果。 – 2013-04-21 13:17:38