怎么能修复这个错误? “java.lang.IndexOutOfBoundsException”

时间:2012-03-22 14:25:36

标签: java android andengine

我正在尝试与andengine library进行游戏。

当Sprite Enemy1Sprite到达相机的顶部并且我将其分离时,会抛出此异常:

java.lang.IndexOutOfBoundsException Invalid Index 12 size is 12

我必须分离enemy1Sprite因为它不断从镜头中创建子弹精灵。

这是代码。

类敌人1:

    package es.uah.juegomentos;

    import org.anddev.andengine.engine.handler.timer.ITimerCallback;
    import org.anddev.andengine.engine.handler.timer.TimerHandler;
    import org.anddev.andengine.entity.sprite.Sprite;
    import org.anddev.andengine.opengl.texture.region.TextureRegion;

    public class Enemy1 extends Sprite {

boolean abajo = true;

public Enemy1(TextureRegion pTextureRegion) {
    super(0, 0, pTextureRegion);

    this.setPosition(JuegoMentosActivity.RANDOM.nextInt(JuegoMentosActivity.CAMERA_WIDTH), -10);
    TimerHandler Enemy1fire = new TimerHandler(0.75f, true, enemigo1fireCallback);  
    JuegoMentosActivity.getmGameScene().registerUpdateHandler(Enemy1fire);
}

@Override
protected void onManagedUpdate(float pSecondsElapsed) {
    super.onManagedUpdate(pSecondsElapsed);

    float y = getY();

    if (y >= 275) {abajo = false;}

    if (abajo)  {y = y + pSecondsElapsed * 125.0f;}
    else {y = y - pSecondsElapsed * 125.0f;}



    this.setPosition(getX(), y);
    if (getY()<-10){this.getParent().detachChild(this);}
}

ITimerCallback enemigo1fireCallback = new ITimerCallback(){

    @Override
    public void onTimePassed(TimerHandler pTimerHandler) {

        bala1 mbala1;

        mbala1 = new bala1(getX()+(64*1/2),getY()+64,JuegoMentosActivity.getMbala1Texture().getTextureRegion(),true);
        JuegoMentosActivity.getmGameScene().attachChild(mbala1);
    }
};
    }

在场景中创建新敌人:

    //Creamos el sprite del enemigo uno
    ITimerCallback enemigo1CreatorCallback = new ITimerCallback(){

        @Override
        public void onTimePassed(TimerHandler pTimerHandler) {

            mEnemy1Sprite = new Enemy1(mEnemy1Texture.getTextureRegion());
            mGameScene.attachChild(mEnemy1Sprite);  
        }               
    };

     TimerHandler Enemy1Creator = new TimerHandler(3.0f, true, enemigo1CreatorCallback);
    mGameScene.registerUpdateHandler(Enemy1Creator); 

由于

3 个答案:

答案 0 :(得分:1)

你真的回答了你自己的问题 - 马塞洛是正确的,问题不在你发布的代码中,而是你在做的detachChild调用 - 你需要在更新线程上调用它,如

runOnUpdateThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
    yourScene.detachChild(yourEnemySprite);
}
});

答案 1 :(得分:1)

这表示您的实际数组大小为12,因此您的最后一个索引是11.但是您尝试访问不存在的索引12。尝试找出引发此错误的行。在那里if size of index is >= size of array brake

您也可以尝试使用try{}catch(IndexOutOfBondException e){}并继续此过程。

答案 2 :(得分:0)

在场景的onManagedUpdate中分离实体。