2012-03-04 10 views
2

私は学校で大きなモノポリーゲームを企画していて、かなり大きなパフォーマンスの問題に遭遇しました。今は私が呼び出されるたびにボード全体を描くペイント方法があります...これは大きな問題です。なぜなら、ボードは一度しか描かれておらず、誰かが家や何かを購入するたびにしか描かれていないからです。私がたくさん絵を描いて欲しいのは、プレイヤーだけです。なぜなら、彼らは最も移動してペイントする必要があるからです。ここでJava Swing Game Board

は私のボードの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ロール1秒かかるタイマーを作成しました(例えば:あなたが5ロールする場合は5秒かかる)。問題は、スタート地点から終了地点までのプレイヤー作品のゆっくりとした動きを見せてもらうための良いアイデアはありません。私は正しい方向に向けることができるように、私に基本的な考えを与えるために誰かが必要です。

+0

+1、Awesome。私はちょうど私を始めるためのアイデアを探していた。独占ゲ​​ームは私の新しいプロジェクトには優れている。 – ApprenticeHacker

+0

ありがとう!それは間違いなくすべてが一緒に来るように開発して見て楽しいゲームです。 – mbreen

答えて

4

BufferedImageにボードをペイントします。ペイント方法では、ボードのイメージを描画し、上にピースを描画します。

BTW - スウィングを使用する場合は、最上位コンテナにペイントしないでください。JComponentまたはJPanelを使用してください。後者の2つの場合は、paint(Graphics)ではなく、paintComponent(Graphics)を上書きします。

+0

それでも、すべての再描画呼び出しでボードを描画しますが、イメージなのでボードがより効率的ですか?現在、私は、プレーヤーが動いたときに目に見える遅れを見ることができます。これはBufferedImageで目立たないでしょうか? – mbreen

+1

@mbreen:試してみましょう:-)。はい、それは速くなり、Javaウィンドウが他のウィンドウによって隠されている場合に備えて、いつでもボード全体を描画する必要があります。 –

+0

BGを描くのに本当に時間がかかる場合は、はい。しかし、1回の呼び出しにつき数百のオブジェクトを描画メソッドに描画することが可能でなければなりません。おそらく、[SSCCE](http://sscce.org/)の投稿を見て、使用されているプロセス全体をより詳しく見ることができます。また、toto2が見つけたチュートリアルのレンダリングの例を追うことを強くお勧めします。ボールを描くことからボールを​​伸ばしてみてください。 –

1

jComponent.repaint(someRectangle)を使用すると、サーフェス全体を再描画することを避けることができます。このexampleも参照してください。

しかし、移動ごとに更新する必要がある長方形(または長方形)を自分自身で把握する必要があります。新しいものが現れる矩形だけでなく、物が消える場所も必要です。

スイングのアニメーションは、tutorialをご覧ください。この投稿にリンクしている両方の例が、公式Swing tutorialからのものであることがわかります。