避免不必要的检查

Avoiding unnecessary checks

我有一款游戏有两种模式:限时和存货有限(有点像粉碎兄弟)。在我的游戏循环中,调用了一个名为 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' 序列,在游戏过程中绘制玩家统计数据,并在比赛结束后显示比赛获胜者。它也应该取决于游戏类型。例如:显示一个计时器,该计时器将在股票比赛期间递增,但在定时比赛期间递减。

大问题:

  • 您正在重写 paint 并调用 super.paintComponent -- 这是一件非常危险的事情。取而代之的是 paintComponent 并调用相同的 super 方法。
  • 您正在处置 JVM 提供给您的 Graphics 对象,这是另一件非常危险的事情,因为它会完全破坏图形链。不要这样做,而是只处理您自己创建的 Graphics 对象。
  • Swing 是单线程的,因此没有理由同步 paint 或 paintComponent,如果这样做会有风险。

回复:

My question is: how can I make it so that the drawHUD() method will draw different things based on the current progression within the match without having to test for the conditions that define that state every time I call renderGame() in my game loop? Kinda like a railway switch.

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