0

这是我上一篇Java 的续篇:GridLayout 上的动画精灵。感谢回复,它让我知道我只需在触发条件中插入一个循环并在其中调用 pi[i].repaint() 。到目前为止它有效。虽然我试图将它集成到我的由多个精灵组成的游戏中,但它没有任何改进。如果没有动画,精灵会毫无问题地显示在网格上。我在 GridFile 类中插入了动画循环,但它没有显示。我还尝试在 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();

}

}

网格文件类

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 回答