避免不必要的检查



我有一款有两种模式的游戏:限时和限量(有点像粉碎兄弟)。在我的游戏循环中,调用了一个名为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()时测试定义该状态的条件?有点像铁路道岔。

大多数状态检查不应该很昂贵,但如果有的话,你可以使用某种布尔开关,如果状态发生变化,就会设置它,绘画方法可以测试它,然后重置它。

相关内容

  • 没有找到相关文章

最新更新