2012-02-06 52 views
1

我有一個遊戲,它顯示一組彩色塊。用戶可以在屏幕上移動這些塊。當發生觸摸事件時,我會注意到已觸摸的單元格(cell[i][j].isMoving = true)。如果用戶移動塊,我畫相對於偏移值的矩形。當檢測到觸摸事件時,我檢查用戶是否將塊拖動得足夠遠以表示移動塊。android updateThread draw()方法和touchEvent干擾

我的基本平局循環如下:

for(int i = 0; i < xCells, i++){ 
    for(int j = 0; j < yCells; j++){ 
     if(cell[i][j].isMoving) 
      canvas.drawRect(...) // draw with offsets 
     else 
      canvas.drawRect(..) 
     } 
} 

當用戶釋放偶爾閃爍簡要塊我遇到的問題是。

當觸摸事件發生時,必須將偏移設置爲0,塊的座標已更改(如果滿足要求)並且isMoving必須設置爲false。 因爲我有一個不斷運行的線程調用上面的繪圖代碼,看起來UI線程正在改變塊的數組,這意味着當繪圖方法發生時它處於不一致的狀態。

有沒有人有如何解決這個問題的建議?我可以使用處理程序嗎?我已經試過同步onTouchEvent方法和onDraw方法,但這似乎阻擋偶爾用戶輸入

感謝

回答

0

的安全解決方案是隻允許一個線程創建對象,添加並從列表中刪除或遊戲開始後的數組。

我曾與隨機AIOOBEs(數組索引越界異常)的錯誤問題,並沒有synchornize能妥善地解決它,再加上它被拖慢用戶的響應。

我的解決方案現在穩定且快速(從未有過AIOOBE),它使UI線程通知遊戲線程創建或操作對象,方法是將觸摸的布爾標誌和座標設置爲簡單變量。

由於遊戲線環每秒約60次事實證明這是sufficent拿起從UI線程的消息,並做一些事情。

在你的情況onTouch事件絕不會改變細胞[i] [j]直接,但只有設置爲particluar值某個整數。然後你的線程會在某個時候評估這個變量並設置cell [i] [j]然後繪製,所以onTouch永遠不會不可預測地干擾你的線程。

這是一個非常簡單的解決方案,它的效果很好...

+0

謝謝Lumis,我喜歡你的解決方案。我會放棄它 – 2012-02-07 00:27:48