2012-03-22 2 views
0

andengine library으로 게임을하려고합니다.어떻게이 오류를 복구 할 수 있습니까? "java.lang.IndexOutOfBoundsException"

는 스프라이트 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

예외를 실제로 throw하는 코드 부분을 게시하는 것이 고려 되었습니까? 그리고 여러분이 그곳에있는 동안, 완전한 * 예외 스택을? – Marcelo

+2

덧붙여서, 빠른 Google 검색은 배열 인덱스가 자바 기반의 0이기 때문에 실제로 크기가 12 인 배열의 마지막 인덱스가 11임을 보여줍니다. – Marcelo

답변

1

당신은 당신의 자신의 질문에 r에 대답했습니다 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

scene의 onManagedUpdate에서 분리 엔터티.

+0

조금 더 자세히 설명하고 싶을 수도 있습니다. 이것은 답이 아닌 주석처럼 보입니다. – Korem

관련 문제