Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel动画_Java_Swing_Jpanel - Fatal编程技术网

Java JPanel动画

Java JPanel动画,java,swing,jpanel,Java,Swing,Jpanel,所以我正在用Java编写一个游戏,我开始使用drawRect()方法来表示玩家、敌人和射击。一切都很好。 然后我决定试着装腔作势。 我发现自己正在创建每个对象的.png图像,并使用Graphics2D drawImage()方法。一切都开始变慢了。有没有其他方法可以加快这一进程 我的动画基于一个摆动计时器 public void paint(Graphics g){ super.paint(g); Graphics2D g2d = (Graphics2D)g; p

所以我正在用Java编写一个游戏,我开始使用drawRect()方法来表示玩家、敌人和射击。一切都很好。 然后我决定试着装腔作势。 我发现自己正在创建每个对象的.png图像,并使用Graphics2D drawImage()方法。一切都开始变慢了。有没有其他方法可以加快这一进程

我的动画基于一个摆动计时器

    public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g;
    player1.paintShips(g);
    g2d.drawImage(bGround, 14, 14, this);
    try{
        for(Shot s: liveRounds){ //liveRounds is an ArrayList of Shots
            if(!inBounds.contains(s.getRect()) || villains.collision(s)){
                if(villains.collision(s)){
                    villains.collided(s, this);
                }
                liveRounds.remove(s);
                roundCount--;
            }
            else{
                s.paintShot(g, this);                   
            }
        }
    }catch(ConcurrentModificationException e){};
    villains.paintEnemyGrid(g, this);
    g2d.setColor(Color.cyan);
    g2d.draw(hitZone1);
    g2d.setColor(Color.red);
    g.drawString("X: " + player1.getX(1) + "  Y: " + player1.getY(1), 370, 150);
    g2d.draw(inBounds);
    g.drawString(score + "", 440, 40);
    g.dispose();
} 
有关于动画的提示或教程吗?
谢谢

10毫秒的延迟是每秒100帧。这几乎肯定太快了

此外,如果要在迭代过程中从
集合中删除对象,则需要执行以下操作:

Iterator<T> itr = collection.iterator();
while(itr.hasNext()) {
    T obj = itr.next();
    if(removeObj) {
        itr.remove();
    }
}
Iterator itr=collection.Iterator();
while(itr.hasNext()){
T obj=itr.next();
如果(删除对象){
itr.remove();
}
}

ConcurrentModificationException
s会导致非确定性行为。你需要避免它们,而不是忽略它们。

你的计时器延迟了多少?为什么要捕获
ConcurrentModificationException
s并忽略它们?!如果要在迭代过程中从
集合中删除对象
,则应在while循环中手动使用其
迭代器
,并使用
迭代器#remove
。我已将其设置为10,这是否太快?10毫秒的延迟是每秒100帧。那肯定太快了。明白了,谢谢!看起来我需要做一些清理,如果可能的话,尝试重新绘制()特定区域,而不是整个面板。