2016-06-17 19 views
0

異なるボディタイプの2つのスプライトが衝突している場合は、.collidesWithとチェックしています。AndEngine/Box2d/Java - 静的ボディと動的ボディの衝突検出

以下のコードでは、動的および静的なボディとの衝突は検出されません。私はまた、衝突後に遺体を削除したいと思います。

現在のコード:

ContactListener cl = new ContactListener() { 

      @Override 
      public void preSolve(Contact contact, Manifold oldManifold) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void postSolve(Contact contact, ContactImpulse impulse) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void endContact(Contact contact) { 
       final Fixture x1 = contact.getFixtureA(); 
       final Fixture x2 = contact.getFixtureB(); 
      } 

      @Override 
      public void beginContact(Contact contact) { 
       final Fixture x1 = contact.getFixtureA(); 
       final Fixture x2 = contact.getFixtureB(); 
       if (x1 != null && x1.getBody() != null 
         && x1.getBody().getUserData() != null) { 
        if (x2 != null && x2.getBody() != null 
          && x2.getBody().getUserData() != null) { 
         Log.d("TEST", "x1: " 
           + x1.getBody().getUserData().toString()); 
         Log.d("TEST", "x2: " 
           + x2.getBody().getUserData().toString()); 

         if (x2.getBody().getUserData().equals("Ball") 
           && x1.getBody().getUserData().equals("Dynamic")) { 
          destroy(); 
         } else if (x2.getBody().getUserData().equals("Ball") 
           && x1.getBody().getUserData().equals("Static")) { 
//       ballSP.destroy(); 
          // Toast.makeText(
          // ResourcesManager.getInstance().activity, 
          // "touched static", Toast.LENGTH_LONG).show(); 
         } else if (x2.getBody().getUserData().equals("Ball") 
           && x1.getBody().getUserData().equals("Figur")) { 
//       figSP.destroy(); 
         } 
        } 
       } 
      } 
     }; 

これはプラットフォームです:

public void createPhysics() { 
     if (bodyType != null) { 
      FixtureDef FIXTURE = PhysicsFactory.createFixtureDef(0.0f, 0.0f, 
        1.0f); 
      platformBody = PhysicsFactory.createBoxBody(physicsWorld, this, 
        bodyType, FIXTURE); 
      physcConnector = new PhysicsConnector(this, platformBody, true, 
        true); 
      physicsWorld.registerPhysicsConnector(physcConnector); 
      physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, 
        platformBody, true, true)); 
      this.setUserData(platformBody); 
      platformBody.setLinearVelocity(physicsWorld.getGravity().x, 0); 

      if (bodyType == BodyType.StaticBody) { 
       platformBody.setUserData("Static"); 
       platformBody.setAwake(true); 
      } else if (bodyType == BodyType.DynamicBody) { 
       platformBody.setUserData("Dynamic"); 
//    platformBody.setAwake(true); 
      } 
     } 

そして、これが移動するボールです:

FixtureDef FIXTURE = PhysicsFactory.createFixtureDef(0.0f, 0, 1.0f); 
     ballBody = PhysicsFactory.createBoxBody(physicsWorld, this, 
       BodyType.DynamicBody, FIXTURE); 
     physicsConnector = new PhysicsConnector(this, ballBody, true, true); 
     physicsWorld.registerPhysicsConnector(physicsConnector); 
     Vector2 shoot = new Vector2((6.78125f - 0.625f), (15.4375f - 0.625f)); 
     // shoot.nor().mul(4); 

     scene.attachChild(this); 

     // ResourcesManager.getInstance().camera.setChaseEntity(ballSP); 

     ballBody.setLinearVelocity(shoot); 
     ballBody.setAngularVelocity(0.5f); 
     ballBody.setUserData("Ball"); 
     ballBody.setAwake(true); 

静的間の衝突を検出することが可能であり、どのようにして衝突後に身体とスプライトを除去する必要がありますか?

+0

使用A:あなたのContactHandlerImplで

@Override public void removeFromPhysicsWorld() { isWaitingForDestruction = true; GameManager.get().getEngine().runOnUpdateThread(new Runnable() { @Override public void run() { body.setActive(false); physicsWorld.destroyBody(body); } }); } 

は体が衝突したときは、次のような何かをContactListenerとあなたの体の衝突をチェックしてください。 – mrkernelpanic

+0

私はすでにContactListenerで試しましたが、静的ボディと動的ボディの衝突を検出しません。 – ninjaxelite

+0

コードを表示できますか? – mrkernelpanic

答えて

1

OKいくつかのこと:

1.Enableボールの移動:

PhysicsHandler physicsHandler = new PhysicsHandler(ballBody); 
ballBody.registerUpdateHandler(physicsHandler); 

2.サンプルContactHandler私から

@Override 
public void beginContact(Contact contact) { 
    final Fixture fixtureA = contact.getFixtureA(); 
    final Body bodyA = fixtureA.getBody(); 
    final Object userDataA = bodyA.getUserData(); 

    final Fixture fixtureB = contact.getFixtureB(); 
    final Body bodyB = fixtureB.getBody(); 
    final Object userDataB = bodyB.getUserData(); 

    GameBody givenGameBodyA = (GameBody) userDataA; 
    GameBody givenGameBodyB = (GameBody) userDataB; 

    LevelGameBodyType bodyTypeA = givenGameBodyA.getBodyType(); 
    LevelGameBodyType bodyTypeB = givenGameBodyB.getBodyType(); 

    if(areBodiesCollided(bodyTypeA, bodyTypeB, LevelGameBodyType.PLAYER, LevelGameBodyType.OBSTACLE)){ 
     Debug.v(TAG, "Player hit an obstacle!"); 

    } 

private boolean areBodiesCollided(LevelGameBodyType givenGameBodyA, LevelGameBodyType givenGameBodyB, LevelGameBodyType wantedGameBodyA, LevelGameBodyType wantedGameBodyB) { 
    return (givenGameBodyA.equals(wantedGameBodyA) || givenGameBodyA.equals(wantedGameBodyB)) 
      && (givenGameBodyB.equals(wantedGameBodyA) || givenGameBodyB.equals(wantedGameBodyB)); 

} 

} 

GameBodyがありますinterfaceとLevelGameBodyTypeはボディを識別するEnumです。 したがって、あなたの体の定義では、UserDataをGameBodyとIdentifier Enumで設定します。

これで問題が解決しない場合は、各ボディのFixtureDefでisSensor = trueを使用してみてください。

FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0.0f, 0.0f, true); 

3.削除機関は:あなたは、タイミングの問題に実行される現在のスレッドにあなたの体を削除し、その

はそれを行ういけません!

本当にあなたのBodies用に別のJavaクラスを作成する必要があります。 MovingBall.javaなど。あなたは、このような方法が必要です。このクラス内

if(body.isWaitingForDestruction()){ 
      Debug.v(TAG, "Body waiting for destruction is " + body.getObjectId()); 
      return; 
     } 
     Debug.v(TAG, "Player collides with collectable! " + body.getObjectId()); 
     body.removeFromPhysicsWorld(); 
関連する問題