2012-03-04 85 views
2

我正在做一个大型的垄断游戏作为一个项目在学校,并遇到了一个相当大的性能问题。现在我有一种绘制方法,每次它被调用时就绘制整个板子......这是一个大问题,因为板子只需要在开始时绘制一次,并且只有在某人买房子或什么时才需要绘制。我想要绘制的唯一组件是玩家,因为它们是最左右移动并需要绘制的组件。Java秋千游戏板

这里是我的板的paint方法:

public void paint(Graphics g){ 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     //Draw all the spots 
     for(int i = 0; i < spots.length; i++){ 
      g2d.setColor(Color.white); 
      g2d.fill(spots[i].getRect()); 
      if(spots[i] instanceof Property){ 
       if(i < 10){ 
        g2d.setColor(spots[i].getColor()); 
        Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y,spots[i].getRect().width,spots[i].getRect().height/3); 
        g2d.fill(temp); 
        g2d.setColor(Color.black); 
        g2d.drawString(((Property)spots[i]).getName(), spots[i].getRect().x, spots[i].getRect().height); 
       }else if(i >= 10 && i < 20){ 
        g2d.setColor(spots[i].getColor()); 
        Rectangle temp = new Rectangle(spots[i].getRect().x+spots[i].getRect().width-spots[i].getRect().width/3,spots[i].getRect().y,spots[i].getRect().width/3,spots[i].getRect().height); 
        g2d.fill(temp); 
       }else if(i >= 20 && i < 30){ 
        g2d.setColor(spots[i].getColor()); 
        Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y+spots[i].getRect().height-spots[i].getRect().height/3,spots[i].getRect().width,spots[i].getRect().height/3); 
        g2d.fill(temp); 
        g2d.setColor(Color.black); 
        g2d.drawString(((Property)spots[i]).getName(), spots[i].getRect().x, spots[i].getRect().y); 
       }else if(i >= 30 && i < 40){ 
        g2d.setColor(spots[i].getColor()); 
        Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y,spots[i].getRect().width/3,spots[i].getRect().height); 
        g2d.fill(temp); 
       } 
      }else if(spots[i] instanceof Railroad){ 
       if(i == 5) 
        g2d.drawImage(imgTrain3, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/4, null); 
       else if(i == 15) 
        g2d.drawImage(imgTrain4, spots[i].getRect().x+spots[i].getRect().width/4, spots[i].getRect().y, null); 
       else if(i == 25) 
        g2d.drawImage(imgTrain1, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/4, null); 
       else if(i == 35) 
        g2d.drawImage(imgTrain2, spots[i].getRect().x+spots[i].getRect().width/4, spots[i].getRect().y, null); 
      }else if(spots[i] instanceof Chance){ 
       if(i == 7) 
        g2d.drawImage(imgChance2, spots[i].getRect().x, spots[i].getRect().y, null); 
       else if(i == 22) 
        g2d.drawImage(imgChance2, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/3, null); 
       else if(i == 36) 
        g2d.drawImage(imgChance3, spots[i].getRect().x, spots[i].getRect().y, null); 
      }else if(spots[i] instanceof Community){ 
       if(i == 2) 
        g2d.drawImage(imgComm1, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/3, null); 
       else if(i == 17) 
        g2d.drawImage(imgComm2, spots[i].getRect().x, spots[i].getRect().y, null); 
       else if(i == 33) 
        g2d.drawImage(imgComm3, spots[i].getRect().x+spots[i].getRect().width/3, spots[i].getRect().y, null); 
      }else{ 
       g2d.setColor(spots[i].getColor()); 
       g2d.fill(spots[i].getRect()); 
      } 
     } 
     //Draw the outline of every spot 
     g2d.setColor(Color.black); 
     for(Spot index : spots) 
      g2d.draw(index.getRect()); 
     //Draw the outline of the whole board 
     g2d.drawRect(newX, newY, boardSize, boardSize); 
     //Draw the Players location 
     for(Player index : players) 
      g2d.drawImage(index.getImage(), index.getLoc().x, index.getLoc().y, null); 
    } 

基本上一吨的文本,用于代表董事会的,而这个正在做,每次董事会重绘。有什么建议?

奖励问题:我也刚刚开始为玩家在移动之后开始制作移动动画(目前只是跳到目的地)。我创造了一个计时器,每次掷出1秒(例如:如果掷出5秒,需要5秒钟移动)。唯一的问题是,我不确定如何显示玩家片从开始位置到结束位置的缓慢移动。只需要有人给我一个基本的想法,这样我就可以朝正确的方向前进。

+0

+1,太棒了。我只是在寻找一个让我开始的想法..垄断游戏对我的新项目非常出色。 – ApprenticeHacker 2012-03-04 14:03:46

+0

谢谢!这绝对是一个有趣的游戏开发和观看,因为它们都汇集在一起​​。 – mbreen 2012-03-04 14:15:10

回答

4

将电路板漆成BufferedImage。在绘画方法中,画出棋盘的图像,然后将棋子画在上面。

顺便说一句 - 使用Swing时,不要在顶层容器中绘制,而应使用JComponentJPanel。对于后两者,请覆盖paintComponent(Graphics)而不是paint(Graphics)

+0

因此,它仍然会在每次重新绘制调用时绘制板,但是因为它是一张图像,所以效率更高?目前,当玩家移动时,我可以看到可见的延迟,这对于BufferedImage来说会不太明显? – mbreen 2012-03-04 14:29:01

+1

@mbreen:试试看:-)。是的,它会更快,并且您的Java窗口被其他窗口遮挡时,您将需要偶尔绘制整个板子。 – 2012-03-04 14:40:56

+0

如果抽真空需要很长时间,是的。但是,每次调用paint方法时都应该可以绘制数百个对象,而不会显着延迟。也许最好看一下发布[SSCCE](http://sscce.org/),这样我们就可以更仔细地看待使用的整个过程。此外,强烈建议追踪toto2找到的教程中的任何渲染示例。尝试增加他们从绘画1 ..球(线,..任何)绘画他们的分数 - 并看看他们如何执行。 – 2012-03-04 14:41:25

1

您可以避免重新绘制整个表面:jComponent.repaint(someRectangle)。另请参阅此example

但是,您必须自己画出需要在每次移动之间更新的矩形(或矩形)。你不仅需要新东西出现的矩形,还需要消失的地方。

对于Swing中的动画,看看这个tutorial。你会注意到我在这篇文章中链接的例子都来自官方Swing tutorial