2016-05-01 75 views
0

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

+1

你可以提供不同的类,它有一个“绘制”方法,只需绘制特定实现所需的特征,然后根据需要更改使用哪个实例 – MadProgrammer

+0

@MadProgrammer我想我知道它可能是这样做,但我试图找到一个不涉及新类的较低级别的解决方案。 – hjl

+0

然后你总是需要做一些状态检查:P – MadProgrammer

回答

1

大问题:

  • 你覆盖了漆,但调用super.paintComponent - 这是一件非常危险的事情。改为paintComponent并调用相同的super方法。
  • 您正在处置由JVM给您的Graphics对象,这是另一个非常危险的事情,因为它完全破坏了图形链。不要这样做,而只是处理你自己创建的Graphics对象。
  • Swing是单线程的,所以没有理由同步paint或paintComponent,并且如果你这样做会有风险。

回复:

我的问题是:我怎样才能让这个在drawHUD()方法将利用基于匹配中的当前进展的不同的事情,而不必测试的条件每次我在我的游戏循环中调用renderGame()时,定义该状态?有点像铁路交换机。

大多数国家抽查不应该是昂贵的,但如果有任何,你可以使用某种被设置的布尔开关,如果状态变化,该画法可以测试,然后复位。

+0

感谢您指出这些问题 - 我只是进入图形,而我不太了解。但只是为了澄清你的答案 - 我无法避免某种测试? – hjl

+0

你也可以有不同的类(从一个通用的接口或类)呈现不同的状态,作为一个想法+1不少于 – MadProgrammer

+0

@hjl *不知何故*它必须确定。他所说的是没有什么可以优化的,因为那些测试很可能比绘画本身快得多。不要优化不需要的东西。 +++如果它很慢(测量!),您可以不时进行检查(例如,每10种颜料)并存储结果。或者在事件发生时存储结果,例如游戏开始。 – maaartinus