Andengine Collisions - 检测碰撞和删除物体时的例外情况

时间:2012-06-08 09:15:36

标签: android box2d andengine

我正在开发一款动力驱动的box2d游戏。当我尝试从场景中删除碰撞的物体时,有时会发生错误。好像这是一个随机错误。

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)

以下是我的更新代码块:

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;
    }

请帮忙。

1 个答案:

答案 0 :(得分:2)

您正在删除UI线程上的正文。这意味着当绘制场景时,它正在尝试绘制一些未附加到场景的东西,并且您得到了ArrayIndexOutOfBoundsException。如果使用runOnUpdateThread而不是runOnUiThread,则不应该出现问题。