i'm making android game andengine. have arraylist of sprites, , on each update want check if player sprite has collided of them. excerpt of code giving me headache:
public void onupdate(final float psecondselapsed) { sprites.addandremove(); (int i=0;i<sprites.size();i++) { if(playersprite.collideswith(sprites.get(i))) { sprites.settoremove(i); //adds sprite removal queue arraylist. //the actual sprites arraylist not touched until addandremove() fires. } } }
looks pretty basic, somehow sprites.get(i)
throws this:
e/androidruntime( 883): fatal exception: updatethread e/androidruntime( 883): java.lang.indexoutofboundsexception: invalid index 4, size 4
despite i<sprites.size()
, somehow reaching value of sprites.size()
. put log messages in each iteration spelling out size of arraylist , current value of i, , seems correct:
d/app( 883): size 4 d/app( 883): 0 d/app( 883): size 4 d/app( 883): 1 d/app( 883): size 4 d/app( 883): 2 d/app( 883): size 4 d/app( 883): 3
...followed exception.
so i'm stumped here, how can happen?
w/dalvikvm( 883): threadid=9: thread exiting uncaught exception (group=0x40015560) e/androidruntime( 883): fatal exception: updatethread e/androidruntime( 883): java.lang.indexoutofboundsexception: invalid index 4, size 4 e/androidruntime( 883): @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:257) e/androidruntime( 883): @ java.util.arraylist.get(arraylist.java:311) e/androidruntime( 883): @ org.anddev.andengine.entity.entity.onmanagedupdate(entity.java:776) e/androidruntime( 883): @ org.anddev.andengine.entity.entity.onupdate(entity.java:648) e/androidruntime( 883): @ org.anddev.andengine.entity.entity.onmanagedupdate(entity.java:776) e/androidruntime( 883): @ org.anddev.andengine.entity.scene.scene.onmanagedupdate(scene.java:261) e/androidruntime( 883): @ org.anddev.andengine.entity.entity.onupdate(entity.java:648) e/androidruntime( 883): @ org.anddev.andengine.engine.engine.onupdatescene(engine.java:494) e/androidruntime( 883): @ org.anddev.andengine.engine.engine.onupdate(engine.java:489) e/androidruntime( 883): @ org.anddev.andengine.engine.engine.ontickupdate(engine.java:465) e/androidruntime( 883): @ org.anddev.andengine.engine.engine$updatethread.run(engine.java:684)
method 1:
for(sprite sprite : sprites){ if (playersprite.collideswith(sprite)) { //-- } }
method 2:
for (iterator<sprite> = sprites.iterator(); i.hasnext();) { if (playersprite.collideswith(i.next())) { //-- } }
method 1 more preferable.
Comments
Post a Comment