2015-04-28 79 views
1

我有一个数组列表,应该向它添加一个对象,但是我第一次尝试向ArrayList添加一个对象时,不添加该对象。ArrayList并不总是添加对象的第一次尝试

主类:

public void keyPressed(KeyEvent e){ 
    char letter = e.getKeyChar(); 
    if(player!=null){ 
     if(letter==' ') { 
      player.dropBomb(bomb); 
     } 
    } 
} 

Player类:

private int x,y; 
    private int score; 
    private Rectangle rect; 
    private Color color; 
    private Upgrade upgrades; 
    private BufferedImage image; 
    private int bombCount, bombMax; 
    private int bombs; 
    private ArrayList<Bomb> bombList; 
    private ArrayList<Explosion> explodeList; 
    private int power; 
    private boolean dead; 
    private int lives; 



    public Player(int X, int Y,BufferedImage img) { 
     x=X; 
     y=Y; 
     rect=new Rectangle(x+4,y+3,32-4-5,29-3-4); 
     bombCount=0; 
     bombMax=6; 
     bombList=new ArrayList<Bomb>(); 
     explodeList=new ArrayList<Explosion>(); 
     power=1; 
     image=img; 
     dead=false; 
     lives=3; 
    } 

public void dropBomb(BufferedImage bomb){ 
     out.println("DROPPING "+bombCount);//bombCount is initialized as 0; bombMax is intialized as 6 
     if(bombCount<bombMax){ 
      bombCount++; 
      out.println(bombCount+ " "+bombList.size());//bombList is an Arraylist<Bomb> 
      bombList.add(new Bomb(x+16,y+16)); 
      out.println(bombList); 
     } 
     out.println("DROPPINGTest "+bombCount); 
} 

只有一个球员。

炸弹类的构造函数:

private int power; 
private int timeLeft; 
private int x,y; 
private Rectangle rect; 
private boolean canWalk; 

public Bomb(int X,int Y){ 
     x=X; 
     y=Y; 
     rect=new Rectangle(x,y,32,32); 
     timeLeft=200; 
     power=4; 
     canWalk=true; 
    } 

首次dropBomb被称为:

DROPPING0 
1 0 
[] 
DROPPINGTest 1 

第二次dropBomb被称为:

DROPPING1 
2 0 
[[email protected]] 
DROPPINGTest 2 

,我运行的唯一线程处于主类。 我正在使用主类中的线程,我试图降低并提高线程上的睡眠时间,结果并没有改变。关于这种情况发生的原因的任何线索?第一次在输出的第2行和第3行之间按下dropBomb时,也会有明显的延迟。

您可以查看我的全部代码:https://drive.google.com/folderview?id=0B7qyWqb6iazxfklTcmVBUEcxQThJNzlPNzRBcnM4Vkx1T0N1WEVfcnFUenlqOUxaWUF2V28&usp=sharing

+0

bombList在哪里构造?也许它在不同的线程中发生多次? –

+0

请告诉我们'bombList'是什么类型? – OldCurmudgeon

+0

@OldCurmudgeon我假设'ArrayList' – Divers

回答

0

我想在你的情况下,问题可能出在以列表的并发访问。方法'keyPressed'可能被不同的线程调用,所以'dropBomb'也会被不同的线程调用。 如果问题来了,你应该同步'dropBomb'或者使用一些线程安全列表实现。

0

我解决了我的问题。我在修正玩家时加入到bombList中,然后在它之后移除新的炸弹。

public Player(int X, int Y,BufferedImage img) { 
     bombList=new ArrayList<Bomb>(); 
     explodeList=new ArrayList<Explosion>(); 
     bombList.add(new Bomb());   //added this line 
     bombList.remove(0);    //added this line 
    } 

出于某种原因不明给我添加到ArrayList bombList首次将导致产生bombList一个显著延迟通过另一种方法被清除。

相关问题