簡體   English   中英

使用Box2d在AndEngine中發生碰撞時該怎么辦

[英]What to do on collision in AndEngine with Box2d

在具有AndEngine和Box2d擴展名的Android中,我使用以下代碼創建子畫面並設置其屬性(物理等):

mPlayer1_Sprite = new Sprite(0, BASELINE_Y, mResourcesManager.mPlayer1_TextureRegion, mVertexManager) {
    @Override
    protected void preDraw(GLState pGLState, Camera pCamera) {
        super.preDraw(pGLState, pCamera);
        pGLState.enableDither();
    }
};
Body body = PhysicsFactory.createBoxBody(mPhysicsWorld, mPlayer1_Sprite, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(10.0f, 0.0f, 0.5f));
body.setUserData(BODY_TYPE_PLAYER_1);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(mPlayer1_Sprite, body, true, false));
mPlayer1_Sprite.setUserData(body);

(其他玩家和游戲對象的代碼相同)

現在,對於沖突,我使用以下代碼:

private boolean isCollision(final Fixture x1, final Fixture x2, final String type1, final String type2) {
    return (x1.getBody().getUserData() != null && x2.getBody().getUserData() != null) && ((x1.getBody().getUserData().equals(type1) && x2.getBody().getUserData().equals(type2)) || (x1.getBody().getUserData().equals(type2) && x2.getBody().getUserData().equals(type1)));
}

@Override
public void beginContact(Contact contact) {
    final Fixture x1 = contact.getFixtureA();
    final Fixture x2 = contact.getFixtureB();
    if (isCollision(x1, x2, BODY_TYPE_PLAYER_1, BODY_TYPE_PLAYER_2)) {
        ((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
    }
    if (isCollision(x1, x2, BODY_TYPE_PLAYER_1, BODY_TYPE_WALL)) {
        ((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
    }
    if (isCollision(x1, x2, BODY_TYPE_PLAYER_2, BODY_TYPE_WALL)) {
        ((Body) mPlayer1_Sprite.getUserData()).applyForce(3.0f, 1.0f, 0, 0);
    }
}

@Override
public void endContact(Contact contact) { }

@Override
public void preSolve(Contact contact, Manifold oldManifold) { }

@Override
public void postSolve(Contact contact, ContactImpulse impulse) { }

到目前為止應該是正確的,對嗎? 但是,如果我在這里檢測到碰撞,該怎么辦? 對身體施加力正確嗎? 如果需要,我需要使用哪些值:

  • 如果玩家彼此碰撞,它們都會反彈。
  • 撞牆的玩家也會反彈。
  • 當與地面碰撞時,玩家會停下來,但是只有一次,因為玩家隨后會站在地面上,因此您不應該持續地向玩家施加力量,對嗎?

Box2d仍在應用物理更新(碰撞,摩擦,重力等),對嗎? 那么,如果要添加自定義物理計算,該怎么辦? 您是否必須關閉Box2d的計算並將其僅用於碰撞檢測?

由於您不希望box2d物理計算碰撞(至少對於某些組合),因此應過濾這些碰撞並進行計算(就像您已經做的那樣)。 有關碰撞過濾的信息,請參閱本教程

物理計算的碰撞會起作用,物理起作用;-)->兩個物體碰撞並根據其重量/密度,碰撞點,它們的速度和表面摩擦而獲得沖量(線性+角)-這意味着您的反彈效果可能導致旋轉等。

由於我認為(並從您的其他文章中閱讀),您的世界邊界是靜態的,並且您的玩家可以移動,因此我建議您使用碰撞過濾(如上所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM