2012-02-14 27 views
1

JPanelに問題があります。コンストラクタの末尾にある の部分を塗り直してからアニメーション(1つのスプライトが の画面上を移動しています)が表示されますが、アニメーションでスプライトが になるまでJPanelはペイントしません。画面上のポイント。私は下の 私のコードを貼り付けた。以前はカスタムグラフィックスのためにJPanelを使ったことはありません。 私は何が間違っていますか?JavaのJPanelで何が起こっていますか?私は間違って何をしていますか?

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.util.*; 
import javax.swing.*; 

class Battle extends JPanel implements KeyListener { 

    AllyParty ap; 
    boolean showMenu = false; 
    BufferedImage image; 
    EnemyParty ep; 
    Graphics screen; 
    Image allyPic[], enemyPic[]; 
    int enemyCount; 
    int mtCount = 0; 
    int turn[]; 
    MediaTracker mt; 
    Random rand; 

    public Battle(AllyParty allyparty) { 

     /*Initial JPanel subclass setup*/ 
     setSize(800, 600); 
     setBackground(Color.black); 

     /*Create our ally party*/ 
     ap = new AllyParty(); 
     ap = allyparty; 
     ap.setCallingObject(this); 

     /*Create randomizer and random number variable*/ 
     long seed = System.currentTimeMillis(); 
     rand = new Random(seed); 

     /*Use rand to select a number of enemies*/ 
     enemyCount = rand.nextInt(12) + 1; 

     enemyCount = 12; //TEMP 
     ep = new EnemyParty(enemyCount); 


     /*Create the individual enemies in ep and place them*/ 
     for (int i = 0; i < enemyCount; i++) { 
      ep.enemy[i] = new Enemy(1); 
     } 

     ep.setCallingObject(this); 

     /*Initialize images and set them to their starting values*/ 
     allyPic = new Image[4]; 
     enemyPic = new Image[enemyCount]; 

     /* for (int i = 0; i < 4; i++) 
     { 
     ap.ally[i].setCurrentImage(Ally.STAND) 
     allyPic[i] = ap.ally[i].getCurrentImage(); 
     } 

     for (int i = 0; i < enemyCount; i++) 
     { 
     enemyPic[i] = ep.enemy[i].getImage(); 
     */ 
     /*Set battle placement*/ 
     ap.setPos(0); 
     ep.setPos(0); 

     //Create the Buffered Image 
     image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); 

     //Set up the Media Tracker 
     mt = new MediaTracker(this); 
     for (int i = 0; i < 4; i++) { 
      mt.addImage(allyPic[i], mtCount++); 
     } 

     for (int i = 0; i < ep.getEnemyCount(); i++) { 
      mt.addImage(enemyPic[i], mtCount++); 
     } 

     mt.addImage(image, mtCount++); 

     try { 
      mt.waitForAll(); 
     } catch (Exception e) { 
     } 

     /*Temporary Section*/ 
     findTurns(); 

     repaint(); 
     // ap.ally[0].advance(); 
     advance(); 
    } 

    public void findTurns() { 
     int total = ep.getEnemyCount() + 4; //Enemies + allies 

     int used[] = new int[total]; 
     turn = new int[total]; 

     int next = rand.nextInt(total); 

     for (int j = 0; j < total; j++) { 
      used[j] = -1; 
     } 

     for (int j = 0; j < total; j++) { 
      for (int k = 0; k < j; k++) { 
       if (used[k] == next) { 
        k = -1; 
        next = rand.nextInt(total); 
       } 
      } 
      turn[j] = next; 
      used[j] = next; 
     } 
    } 

    public void advance() { 
     while (ap.ally[0].getXPos() > 350) { 
      ap.ally[0].moveLeft(20); 
      ap.ally[0].setCurrentImage(Ally.WALK); 
      repaint(); 
      try { 
       Thread.sleep(200); 
      } catch (Exception e) { 
      } 
      ap.ally[0].setCurrentImage(Ally.STAND); 
      repaint(); 
      try { 
       Thread.sleep(200); 
      } catch (Exception e) { 
      } 
     } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     screen = image.getGraphics(); 

     for (int i = 0; i < 4; i++) { 
      allyPic[i] = ap.ally[i].getCurrentImage(); 
     } 

     for (int i = 0; i < ep.getEnemyCount(); i++) { 
      enemyPic[i] = ep.enemy[i].getCurrentImage(); 
     } 

     for (int i = 0; i < 4; i++) { 
      screen.drawImage(allyPic[i], ap.ally[i].getXPos(), 
       ap.ally[i].getYPos(), this); 
     } 

     for (int i = 0; i < enemyCount; i++) { 
      screen.drawImage(enemyPic[i], ep.enemy[i].getXPos(), 
       ep.enemy[i].getYPos(), 100, 75, this); 
     } 

     g.drawImage(image, 0, 0, this); 
    } 

    public void keyPressed(KeyEvent k) {} 
    public void keyReleased(KeyEvent k) {} 
    public void keyTyped(KeyEvent k) {} 
} 

答えて

4

AWTスレッドの「モデル」(スプライトの位置)を変更している可能性があります。 Repaintは、AWT-EventThreadで送出されるイベントです。したがって、操作がAWTスレッド内で実行されている限り、パネルを再描画するAWTをブロックしています。

つのオプション:

1)

2)イベントを再描画できるよう、随時AWTスレッドをリリース)別のスレッドでAWTスレッド外であなたの「業務/モデル」(移動

はあなたがvolatileや​​を使用する2つのスレッド間で変数を共有している場合ていることを確認してください

6
(、1がより良いあなたのニーズに合わせなければならないあなたはどのように動作するかによって異なります)(私にとってこれは良い選択肢ではない)を行うことにします

1))イベントがSwing Timer

4を使用して遅延/アニメーション用)freeze Swing GUI

3を引き起こしあなたがIconを使用することができますので、EDT中にThread.sleep(int)を使用することはありませんKeyBindings代わりのKeyListener

2)を使用しますJPanelJLabel

0

あなたが知る限り、あなたはrの問題は、コンストラクタでadvance()を呼び出していることです。 あなたのコードは、おそらくこのようなものになります。ここでは

JFrame frame = new JFrame(); 
frame.add(new Battle()); 
frame.setVisible(true); 

を何が起こるかです:

  1. 新しいJFrameのが
  2. 新しいバトルはバトルのコンストラクタの最後に
  3. を作成しているが作成されますrepaint()は
  4. と呼ばれ、advance()は
  5. と呼ばれます。advance()自身がrepaint複数回
  6. 事前()
  7. コンストラクタを返しバトルが
  8. フレームをフレームに追加され
  9. を返すにはバトルがあなたの問題を解決するために

を塗られ

  • 可視化されますコンストラクタ内のadvance()への呼び出しを削除し、フレームが表示された後に呼び出す必要があります。

    関連する問題