※ 引述《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(...))。