2012-03-22 5 views
0

Я пытаюсь сделать игру с andengine library.Как устранить эту ошибку? "java.lang.IndexOutOfBoundsException"

Когда Sprite Enemy1Sprite достигает верхнюю часть камеры, и я отрывать его, это исключение:

java.lang.IndexOutOfBoundsException Invalid Index 12 size is 12 

Я должен отделить enemy1Sprite, потому что продолжать создавать спрайты пуль из камеры.

Это код.

Класс enemy1:

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

Вы считали, что вы отправляете часть кода, которая на самом деле * выдает исключение? И пока вы на нем, * полный * стек исключений? – Marcelo

+2

Кстати, быстрый поиск в Google показал бы, что последний индекс массива размера 12 на самом деле равен 11, так как индексы массива основаны на 0 на Java. – Marcelo

ответ

1

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

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

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

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

+0

Этот ответ кажется правильным. Но также - есть функция, которая вам может понравиться: detachSelf(); вместо this.getParent(). detachChild (this); –

0

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

+0

Возможно, вы захотите немного разобраться. Это похоже на комментарий, а не на ответ. – Korem

Смежные вопросы