2012-04-08 59 views
2

所以我正在用Java寫一個遊戲,並且我開始使用drawRect()方法來表示玩家,敵人和鏡頭。一切都很好。 然後我決定試着去想。 我發現自己創建每個對象的.png圖像,並使用Graphics2D drawImage()方法。一切都開始放緩。有沒有其他方法可以加快這個過程?Java JPanel動畫

我的動畫是基於Swing的計時器

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(); 
} 

動漫任何提示或教程? 謝謝

+0

你的計時器有什麼延遲?爲什麼要捕捉ConcurrentModificationException並忽略它們?如果要在迭代時從「集合」中刪除對象,則應該在while循環中手動使用它的'Iterator'並使用'Iterator#remove'。 – Jeffrey 2012-04-08 20:04:26

+0

我把它設置爲10,會不會太快? – user1320716 2012-04-08 20:06:04

+2

10毫秒的延遲是每秒100幀。這幾乎肯定是太快了。 – Jeffrey 2012-04-08 20:07:31

回答

1

10毫秒的延遲是每秒100幀。這幾乎肯定是太快了。

另外,如果你想在你迭代它從Collection刪除對象,你需要這樣做:

Iterator<T> itr = collection.iterator(); 
while(itr.hasNext()) { 
    T obj = itr.next(); 
    if(removeObj) { 
     itr.remove(); 
    } 
} 

ConcurrentModificationException的領先優勢,以不確定性的行爲。你需要避開它們,不要忽視它們。