2012-06-08 1 views
0

Я работаю над игрушкой boxbox. Когда я пытаюсь удалить столкновенные тела со сцены несколько раз после ошибки. Похоже, это случайная ошибка.Andengine Collisions - исключение при обнаружении столкновений и удалении тел

Uncaught handler: thread GLThread exiting due to uncaught exception 
java.lang.IndexOutOfBoundsException: Invalid location 48, size is 48 
at java.util.ArrayList.get(ArrayList.java:341) 
at org.anddev.andengine.entity.Entity.onManagedDraw(Entity.java:835) 
at org.anddev.andengine.entity.shape.Shape.onManagedDraw(Shape.java:105) 
at org.anddev.andengine.entity.Entity.onDraw(Entity.java:719) 
at org.anddev.andengine.entity.Entity.onManagedDraw(Entity.java:835) 
at org.anddev.andengine.entity.scene.Scene.onManagedDraw(Scene.java:271) 
at org.anddev.andengine.entity.Entity.onDraw(Entity.java:719) 
at org.anddev.andengine.engine.Engine.onDrawScene(Engine.java:507) 
at org.anddev.andengine.engine.Engine.onDrawFrame(Engine.java:499) 
at org.anddev.andengine.opengl.view.RenderSurfaceView$Renderer.onDrawFrame(RenderSurfaceView.java:148) 
at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:617) 
at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.run(GLSurfaceView.java:549) 

Ниже мой Update блок кода:

scene.registerUpdateHandler(new IUpdateHandler(){ 

      public void onUpdate(float pSecondsElapsed) { 
       // TODO Auto-generated method stub 
       try{ 
       scoreA = "SCORE : "+p1score; 
       hudTxtScoreA.setText(scoreA); 
       scoreB = "SCORE : "+p2score; 
       hudTxtScoreB.setText(scoreB); 
       if(p1score==900) 
       { 
        hudTxtScoreA.setText("won"); 
        runOnUiThread(new Runnable() { 
         public void run() { 



          AlertDialog.Builder builder = new AlertDialog.Builder(GmailGame.this); 
          builder.setMessage(playerA+" won the game !!!") 
            .setCancelable(false) 
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, int id) { 
              startActivity(new Intent(GmailGame.this, JoinGame.class)); 
              GlobalClass.setPartner(""); 

             } 
            }); 
          AlertDialog alert = builder.create(); 

          alert.show(); 
         } 
        }); 

        //mEngine.stop(); 
       } 
       else if(p2score==900) 
       { 
        hudTxtScoreB.setText("won"); 

        runOnUiThread(new Runnable() { 
         public void run() { 



          AlertDialog.Builder builder = new AlertDialog.Builder(GmailGame.this); 
          builder.setMessage(playerB+" won the game !!!") 
            .setCancelable(false) 
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, int id) { 
              startActivity(new Intent(GmailGame.this, JoinGame.class)); 
              GlobalClass.setPartner(""); 

             } 
            }); 
          AlertDialog alert = builder.create(); 

          alert.show(); 
         } 
        }); 

        //mEngine.stop(); 
       } 

       if(x1!=null) 
       { 
        if(status.equals("1")){ 
         isMyTurn=true; 
         status="0"; 
        } 



       if((x1.getBody().getUserData().toString().equals("cat1"))||(x2.getBody().getUserData().toString().equals("cat1"))){ 
        if(icat1==0){ 
         icat1=1; 
       Log.e("suchith", x1.getBody().getUserData().toString()); 

       String x1String = x1.getBody().getUserData().toString(); 
       String x2String = x2.getBody().getUserData().toString(); 

       mPhysicsWorld.destroyBody(bcat1); 
       scene.getLastChild().detachChild(scat1); 


       p1score=p1score+100; 
       //scene.detachChild(scat1); 

       if(isMyTurn) 
       sendMessage1(x1String,x2String,"body"); 

        } 

       } 
       else if((x1.getBody().getUserData().toString().equals("cat2"))||x2.getBody().getUserData().toString().equals("cat2")){ 
        if(icat2==0){ 
         icat2=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bcat2); 
        scene.getLastChild().detachChild(scat2); 
        p1score=p1score+100; 
        p1win=p1win+1; 
        //scene.detachChild(scat2); 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 

        } 
        } 
       else if((x1.getBody().getUserData().toString().equals("dog1"))||(x2.getBody().getUserData().toString().equals("dog1"))){ 
        if(idog1==0) 
        { 
         idog1=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bdog1); 
        scene.getLastChild().detachChild(sdog1); 
        //scene.detachChild(sdog1); 
        p1score=p1score+200; 
        p1win=p1win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 

        } 
        } 
       else if((x1.getBody().getUserData().toString().equals("dog2"))||x2.getBody().getUserData().toString().equals("dog2")){ 
        if(idog2==0){ 
         idog2=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bdog2); 
        scene.getLastChild().detachChild(sdog2); 
        //scene.detachChild(sdog2); 
        p1score=p1score+200; 
        p1win=p1win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 
       } 
        } 
       else if((x1.getBody().getUserData().toString().equals("dog3"))||x2.getBody().getUserData().toString().equals("dog3")){ 
        if(idog3==0){ 
         idog3=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bdog3); 
        scene.getLastChild().detachChild(sdog3); 
        //scene.detachChild(sdog2); 
        p1score=p1score+300; 
        p1win=p1win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 
       } 
        } 
       if((x1.getBody().getUserData().toString().equals("ecat1"))||(x2.getBody().getUserData().toString().equals("ecat1"))){ 
        if(iecat1==0){ 
         iecat1=1; 
       Log.e("suchith", x1.getBody().getUserData().toString()); 

       String x1String = x1.getBody().getUserData().toString(); 
       String x2String = x2.getBody().getUserData().toString(); 

       mPhysicsWorld.destroyBody(becat1); 
       scene.getLastChild().detachChild(secat1); 
       p2score=p2score+100; 
       p2win=p2win+1; 
       //scene.detachChild(scat1); 

       if(isMyTurn) 
       sendMessage1(x1String,x2String,"body"); 

        } 

       } 
       else if((x1.getBody().getUserData().toString().equals("ecat2"))||x2.getBody().getUserData().toString().equals("ecat2")){ 
        if(iecat2==0){ 
         iecat2=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(becat2); 
        scene.getLastChild().detachChild(secat2); 
        p2score=p2score+100; 
        p2win=p2win+1; 
        //scene.detachChild(scat2); 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 

        } 
        } 
       else if((x1.getBody().getUserData().toString().equals("edog1"))||(x2.getBody().getUserData().toString().equals("edog1"))){ 
        if(iedog1==0) 
        { 
         iedog1=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bedog1); 
        scene.getLastChild().detachChild(sedog1); 
        //scene.detachChild(sdog1); 
        p2score=p2score+200; 
        p2win=p2win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 

        } 
        } 
       else if((x1.getBody().getUserData().toString().equals("edog2"))||x2.getBody().getUserData().toString().equals("edog2")){ 
        if(iedog2==0){ 
         iedog2=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bedog2); 
        scene.getLastChild().detachChild(sedog2); 
        //scene.detachChild(sdog2); 
        p2score=p2score+200; 
        p2win=p2win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 
       } 
        } 
       else if((x1.getBody().getUserData().toString().equals("edog3"))||x2.getBody().getUserData().toString().equals("edog3")){ 
        if(iedog3==0){ 
         iedog3=1; 
        Log.e("suchith", x1.getBody().getUserData().toString()); 

        String x1String = x1.getBody().getUserData().toString(); 
        String x2String = x2.getBody().getUserData().toString(); 

        mPhysicsWorld.destroyBody(bedog3); 
        scene.getLastChild().detachChild(sedog3); 
        //scene.detachChild(sdog2); 
        p2score=p2score+300; 
        p2win=p2win+1; 

        if(isMyTurn) 
        sendMessage1(x1String,x2String,"body"); 
       } 
        }     

       }   
       } 
       catch(NullPointerException e) 
       { 
        Log.e("Update","Null"); 
       } 
       catch(Exception e){ 
              Log.e("Udate","Error"); 
       } 
      } 
      public void reset() { 
       // TODO Auto-generated method stub 

      } 
     }); 
     return scene; 
    } 

Пожалуйста, помогите.

+0

где вы удаляете все, вы должны быть уверены, что это делается в потоке обновлений - используйте runOnUpdateThread() – jmroyalty

ответ

2

Вы удаляете корпус в потоке пользовательского интерфейса. Это означает, что когда сцена рисуется, она пытается нарисовать то, что больше не привязано к сцене, и вы получаете исключение ArrayIndexOutOfBoundsException. Если вместо runOnUiThread вы используете runOnUpdateThread, у вас не должно быть проблем.

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