我有一款有两种模式的游戏:限时和限量(有点像粉碎兄弟)。在我的游戏循环中,调用了一个名为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()时测试定义该状态的条件?有点像铁路道岔。
例如:它应该在启动过程中绘制一个"准备就绪"序列,在游戏过程中绘制玩家统计数据,并在比赛结束后指示比赛获胜者。它还应该依赖于游戏类型。例如:显示一个计时器,该计时器在股票比赛中递增,但在计时比赛中递减。
大问题:
- 您正在重写paint,但却调用
super.paintComponent
——这是一件非常危险的事情。请改用paintComponent并调用同一个super的方法 - 您正在处理JVM给您的Graphics对象,这是另一件非常危险的事情,因为它完全破坏了图形链。不要这样做,而是只处理您自己创建的Graphics对象
- Swing是单线程的,因此没有理由同步paint或paintComponent,如果这样做会有风险
回复:
我的问题是:我如何才能让drawHUD()方法根据比赛中的当前进展绘制不同的东西,而不必在每次我在游戏循环中调用renderGame()时测试定义该状态的条件?有点像铁路道岔。
大多数状态检查不应该很昂贵,但如果有的话,你可以使用某种布尔开关,如果状态发生变化,就会设置它,绘画方法可以测试它,然后重置它。