2015-08-13 83 views
0

我非常需要幫助,我正在製作的遊戲。對於一些情況,我正在製作一款記憶遊戲,並且我有下面這段很麻煩的代碼。我在表單上有一堆標籤,確切地說是16個,每個標籤中隨機生成一個符號。每個符號在標籤中出現兩次。再次啓動代碼之前等待1秒 - VB.NET

 ------------------------------Continued---------------------------------------- 
       'MsgBox("hello") 'used to check if the second inccorect press shows up - it does show but instantly changes colour 
       '''''''''''''''''NEED SOME CODE THAT PAUSES IT HERE''''''''''''''' 
       labels(0).ForeColor = Color.DarkRed 
       sender.ForeColor = Color.DarkRed 
      End If 
      flips = 1 
     End If 
    End If 
    tmrmemory.Enabled = True ' starts the timer after the user clicks the first label 
End Sub 

什麼是應該發生的是,當標籤點擊不匹配,就應該改變他們兩個回「暗紅色」,這是窗體的背景顏色之前同時顯示在短期內點擊的標籤。

我嘗試過使用計時器,但後來我不能使用sender.forecolor=color.darkred,因爲它沒有全局聲明。

我也試過使用命令Threading.Thread.Sleep(500),但它仍然沒有顯示第二次錯誤的點擊。我知道我使用的代碼是有效的,因爲當我使用消息框時,我可以看到兩個符號,當兩次點擊都正確時,它仍然保留。

回答

1

Threading.Thread.Sleep(500)實際上將暫停你的代碼半秒。但在此期間,它不會執行任何操作,甚至不會刷新控件。要獲得所需的效果,需要在調用Threading.Thread.Sleep之前調用YourControl.Refresh方法強制控件立即重繪。

在附註中,我建議您不要在UI線程上調用Threading.Thread.Sleep。它會給人一種程序懸念的感覺。而是在一個單獨的線程上做你的工作。你可以自己做所有的工作,從創建一個單獨的線程到銷燬它,或者使用BackgroundWorker控件,它具有內置的所有功能。

這裏是我很久以前寫過的關於BackgroundWorker的文章的鏈接這可能對您有用:

http://www.vbforums.com/showthread.php?680130-Correct-way-to-use-the-BackgroundWorker

+1

非常感謝你,我結束了使用'Threading.Thread.Sleep'之前使用'Me.Refresh'這固定我的問題。但是,是的,我確實注意到這個表單在這段時間內沒有響應。我讀了你的文章,但似乎無法讓我的頭,我仍然是相當新的VB和編碼的事情。我現在可能會堅持使用線程函數,除非我知道它。謝謝! –

+0

有沒有替代'me.refresh'命令,不會使窗體看起來像閃爍或更好的詞「刷新?」這只是一個美學的東西 –

+1

將窗體的DoubleBuffered屬性設置爲True。這應該照顧閃爍的問題。另外,如果要刷新的控件數量不大,則調用每個控件的Refresh方法,而不是刷新整個表單。 –

0

聲明一個變量的外部,該變量存儲了定時器結束時應該翻轉哪些標籤。

標籤上單擊設置 storedLabel = sender 計時器滴答設置storedLabel.ForeColor = Color.DarkRed

相關問題