Как можно исправить эту ошибку?"Java.lang.IndexOutOfBoundsException" - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь сделать игру с 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 ]

1 голос
/ 22 марта 2012

Это говорит о том, что ваш фактический размер массива равен 12, поэтому ваш последний индекс равен 11. Но вы пытаетесь получить доступ к индексу 12, который не существует.Попробуйте выяснить строку, которая выдает эту ошибку.Поставьте там условие: if size of index is >= size of array brake.

Также вы можете попробовать использовать try{}catch(IndexOutOfBondException e){} и продолжить процесс.

1 голос
/ 22 марта 2012

Вы действительно ответили на свой вопрос - Марсело прав, проблема не в том коде, который вы опубликовали, а в том, где вы делаете вызов detachChild - вам нужно вызвать его в теме обновления, как в

runOnUpdateThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
    yourScene.detachChild(yourEnemySprite);
}
});
0 голосов
/ 26 июля 2014

отсоединение объекта в onManagedUpdate сцены.

...