2016-05-01 101 views
0

我有一種遊戲有兩種模式:定時限制和股票限制(有點像粉碎兄弟)。在我的遊戲循環中,名爲renderGame()的方法被稱爲更新移動對象的座標,然後調用repaint()。避免不必要的檢查

@Override 
public synchronized void paint(Graphics g) { 
    super.paintComponent(g); 

    Graphics2D g2d = (Graphics2D) g; 

//Background Image 
    g2d.drawImage(displayBackground, 0, 0, null); 

//Stage Image 
    g2d.drawImage(displayMap, 0, 0, null); 

//Players Images 
    for(Player p: players){ 
     if(p.getPlayerNumber() == 1) 
     g2d.drawImage(displayMario, p1XDisplayCoord, p1YDisplayCoord, null); 
     else 
     g2d.drawImage(displayLuigi, p2XDisplayCoord, p2YDisplayCoord, null); 
    } 

//Not implemented yet 
    drawHUD(g2d); 

    g2d.dispose(); 
} 

我的問題是:我怎樣才能讓這個在drawHUD()方法將利用基於匹配中的當前進展的不同的事情,而不必測試,每次我打電話的時間定義狀態的條件renderGame()在我的遊戲循環?有點像鐵路交換機。

例如:它應該在啓動過程中繪製一個「ready-set-go」序列,在玩法期間玩家的統計數據,並且一旦比賽結束,它應該表示比賽獲勝者。它也應該取決於遊戲類型。例如:顯示一個計時器,該計時器在庫存匹配期間遞增,但在計時匹配期間遞減。

+1

你可以提供不同的類,它有一個「繪製」方法,只需繪製特定實現所需的特徵,然後根據需要更改使用哪個實例 – MadProgrammer

+0

@MadProgrammer我想我知道它可能是這樣做,但我試圖找到一個不涉及新類的較低級別的解決方案。 – hjl

+0

然後你總是需要做一些狀態檢查:P – MadProgrammer

回答

1

大問題:

  • 你覆蓋了漆,但調用super.paintComponent - 這是一件非常危險的事情。改爲paintComponent並調用相同的super方法。
  • 您正在處置由JVM給您的Graphics對象,這是另一個非常危險的事情,因爲它完全破壞了圖形鏈。不要這樣做,而只是處理你自己創建的Graphics對象。
  • Swing是單線程的,所以沒有理由同步paint或paintComponent,並且如果你這樣做會有風險。

回覆:

我的問題是:我怎樣才能讓這個在drawHUD()方法將利用基於匹配中的當前進展的不同的事情,而不必測試的條件每次我在我的遊戲循環中調用renderGame()時,定義該狀態?有點像鐵路交換機。

大多數國家抽查不應該是昂貴的,但如果有任何,你可以使用某種被設置的布爾開關,如果狀態變化,該畫法可以測試,然後復位。

+0

感謝您指出這些問題 - 我只是進入圖形,而我不太瞭解。但只是爲了澄清你的答案 - 我無法避免某種測試? – hjl

+0

你也可以有不同的類(從一個通用的接口或類)呈現不同的狀態,作爲一個想法+1不少於 – MadProgrammer

+0

@hjl *不知何故*它必須確定。他所說的是沒有什麼可以優化的,因爲那些測試很可能比繪畫本身快得多。不要優化不需要的東西。 +++如果它很慢(測量!),您可以不時進行檢查(例如,每10種顏料)並存儲結果。或者在事件發生時存儲結果,例如遊戲開始。 – maaartinus