0

これは、前回の投稿Java: Animated Sprites on GridLayoutからの続きです。返信のおかげで、トリガー条件にループを挿入して pi[i].repaint() を呼び出す必要がある場所についてのアイデアが得られました。これまでのところ、動作します。複数のスプライトで構成されたゲームに統合しようとしましたが、改善されませんでした。アニメーションがなければ、スプライトは問題なくグリッドに表示されます。GridFile クラスにアニメーション ループを挿入しましたが、表示されませんでした。また、MainFile にアニメーション ループを挿入しようとしましたが、グリッチのような不規則なアニメーションが表示されました。誰かが私がどこで間違ったのか教えてもらえますか? アイデアは大歓迎です。

MainFile クラス

public class MainFile {

JFrame mainWindow = new JFrame();

public JPanel gridPanel;

public MainFile() { 
    gridPanel= new GridFile();

    mainWindow.add(gridPanel,BorderLayout.CENTER);

    mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainWindow.setSize(700,700);
    mainWindow.setResizable(false);
    mainWindow.setVisible(true);

}

public static void main(String[]args){

    new MainFile();

}

}

GridFile クラス

public class GridFile extends JPanel{   

ImageIcon gameBackground = new ImageIcon(getClass().getResource("Assets\\GridBackground.png"));
Image gameImage; 
int[] pkmArray = new int[12];
int random = 0;
Pokemon[] pkm = new Pokemon[36];
JPanel[] pokeball = new JPanel[36];
int j = 0;

public GridFile(){

    setLayout(new GridLayout(6,6,6,6));
    setBorder(BorderFactory.createEmptyBorder(12,12,12,12));
    gameImage = gameBackground.getImage();      


    for(int i = 0;i < 36;i++){  
        do{
            random = (int)(Math.random() * 12 + 0);

            if(pkmArray[random] <= 3){      
                pokeball[i] = new Pokemon(random);
                pokeball[i].setOpaque(false);
                pokeball[i].setLayout(new BorderLayout());
                pkmArray[random]++;
            }
        }while(pkmArray[random] >= 4);

        add(pokeball[i],BorderLayout.CENTER);
    } 

    while(true){
        for(int i = 0; i < 36; i++){
            pokeball[i].repaint();
        }
    }

}



public void paintComponent(Graphics g){

    if(gameImage != null){
        g.drawImage(gameImage,0,0,getWidth(),getHeight(),this);   
    }   
}

}

4

1 に答える 1

3
  1. 塗り直しにはスイングタイマーを使い、フレームとフレームの間に少し時間を空けてスイングを行います。とにかく表示できるものよりも速く描画しようとしても意味がありません。にアニメーション ループがある場合main()、再描画マネージャは、互いに近くに表示される再描画要求のいくつかを破棄しようとします。これが、表示される不規則なアニメーションの原因になる可能性があります。
  2. イベント ディスパッチ スレッドでのみ、swing コンポーネントを作成してアクセスする必要があります。あなたの現在のアプローチは、スレッド化ルールを破っています。

追加: アニメーション ループが現在の場所にある場合、GridFileコンストラクターは決して戻りません。これは、コードがウィンドウを表示するのに十分な距離まで到達しないため、何も表示されないことを説明しています。

于 2013-09-19T13:55:31.637 に答える