我的游戏有两种模式:限时和限时(有点像粉碎兄弟)。在我的游戏循环中,调用了一个称为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/