0

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 の計算をオフにして、衝突検出のみに使用する必要がありますか?

4

1 に答える 1

1

box2d で衝突を物理的に計算したくないので (少なくともいくつかの組み合わせでは)、これらの衝突をフィルタリングして計算する必要があります (既に行っているように)。コリジョン フィルタリングについては、このチュートリアルを参照してください。

物理的に計算された衝突はうまく機能します;-) -> 2つのオブジェクトが衝突し、重量/密度、衝突点、速度、および表面摩擦に応じてインパルス(線形+角度)を取得します-つまり、跳ね返り効果を意味します回転などの原因となります。

私が思う(そしてあなたの他の投稿から読んだ)ので、あなたの世界の境界は静的であり、プレイヤーは動くことができるので、衝突フィルタリングを使用することをお勧めします(上記のように)。

于 2013-07-08T14:15:01.263 に答える