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

例如:它应该在启动过程中绘制“准备就绪”序列,在游戏过程中绘制玩家统计数据,并且在比赛结束后应指出比赛获胜者。它也应该取决于游戏类型。例如:显示一个计时器,它将在股票比赛期间增加,但在计时比赛期间减少。

最佳答案

大问题:


您正在覆盖绘画,但仍调用super.paintComponent -这是非常危险的事情。而是使用paintComponent并调用相同的super的方法。
您正在处理由JVM给您的Graphics对象,这是另一个非常危险的事情,因为它完全破坏了图形链。不要这样做,而只能丢弃您自己创建的Graphics对象。
摆动是单线程的,因此没有理由同步paint或paintComponent,如果这样做,则有风险。


回覆:


我的问题是:如何做到这一点,以便drawHUD()方法将根据比赛中的当前进度绘制不同的内容,而不必每次在游戏循环中调用renderGame()时都要测试定义该状态的条件?有点像铁路道岔。


大多数状态检查应该不会很昂贵,但是如果有的话,您可以使用某种在状态改变时设置的布尔开关,绘画方法可以对其进行测试然后重置。

关于java - 避免不必要的检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36972002/

10-13 02:38