2016-06-17 2 views
0

Я проверяю .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

Используйте ContactListener и проверьте там на наличие столкновений ваших тел. – mrkernelpanic

+0

Я уже пробовал с ContactListener, но он не обнаруживает столкновений между статическими и динамическими bodys. – 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 является интерфейс и LevelGameBodyType Enum, который идентифицирует тела. Итак, в вашем определении тела установите UserData с помощью GameBody и Идентификатора.

Если это не поможет, попробуйте использовать isSensor = true в вашем FixtureDef каждого тела.

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

3. Удаление тел:

При удалении тела на текущем потоке будет выполняться в вопросах синхронизации, так что не делайте этого!

Вы действительно должны создать отдельный Java-класс для своих тел, например. MovingBall.java и т.д ..

Внутри этого класса вы должны иметь метод, как это:

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

В ваших ContactHandlerImpl сделать что-то вроде следующего, когда были столкновения тел:

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(); 
Смежные вопросы