Re: [問題] JPanel顯示Graphics的問題

作者: sbrhsieh (十年一夢)   2014-05-23 23:09:38
※ 引述《cicada930614 (喜加達)》之銘言:
: 各位好,初次在JAVA版發文
: 如有疏漏煩請指正,感謝
: 小弟最近在練習寫2048,我將整個遊戲切成
: Game:遊戲主體,主要判斷遊戲開始/結束和輸贏判定
: gameBoard:遊戲盤
: Tile:字板
: https://github.com/cicadandrew/JAVAfinal2048
: github
: 小弟現在遇到的問題在於,GameBoard的圖像無法顯示
: 我嘗試過將gameBoard extends JPanel並進一步覆寫paint
: 結果圖出現,但位置卻被強制置中
: 而將Tile和GameBoard的畫圖一併寫入Game之中,但我不想讓Game太肥
: 而在creatImage中置入System.out.println("check")
: 我發現該段有被執行,但圖卻不如預期出現
: 請問是我對JFrame/ JPanel 和畫圖的過程中有什麼錯誤的使用嗎?
: 我自認邏輯上沒問題,但無法解決這問題
: 謝謝各位高手解惑,感激不盡
稍微瞄過程式碼,雖沒有去了解細節,但是已可以確定 Grame::run() method 實作
是不正確的。
Game 是整個遊戲視覺上的窗口,遊戲的畫面是呈現在這個 component。而遊戲畫面
的繪製是由 Game::render() 來負責(會擴散到其他零件),如果 Game::run 的演算
法會導致 Game::render method 不被執行到,那麼你就什麼都看不到(只有一個空
視窗)。
只能建議你再仔細檢視 Game::run method 的實作,然後把你的 engine 演算法正確
做出來。(我尚不清楚 Game::run 的邏輯,但是看到 while loop 後的 if statement
就知道不對勁了,這個 if statement 內所做的事可說沒有任何意義)
試著先從讓 Game 畫布以約 30 fps 來更新,先確定 rendering 方面的實作是正確,
再慢慢配合遊戲流程修改。
把 Game::run 改成這樣:
public void run() {
while (true) {
render();
try {
Thread.sleep(30);
}
catch (InterruptedException ex) {
}
}
}
如果 rendering 部分是正確的,你應該要看到一些基本的畫面(board/背景之類)。
另外跟你目前要解決的問題無關,許多零件都會先準備 BufferedImage 來做畫,在
rendering 時再把這個畫(image)輸出,這是不必要的。假如你是為了避免 graphics
context 在多個零件中傳遞時,被零件搞亂掉,你可以在傳遞 graphics context 時
使用副本(Graphics::create(...))。

Links booklink

Contact Us: admin [ a t ] ucptt.com