2012-03-22 9 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); 
    } 
}; 
    } 

シーンに新たな敵を作成します:あなたはあなた自身の質問のRに答えました

//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検索すると、配列インデックスはJavaベースで0ベースなので、サイズ12の配列の最後のインデックスは実際には11であることがわかります。 – 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

関連する問題