3

シーンの周りを跳ね回るスプライト(ボディ付き)があります。重力の影響を受けないだけでなく、シーン上の他のボディと衝突できる必要があります。これは、キネマティックボディを使用できないことを意味します。私は試した:

body = PhysicsFactory.createCircleBody(mPhysicsWorld, this, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(.5f, .5f, .5f));
        MassData md = new MassData();
        md.mass=0;
        body.setMassData(md);
        mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true));

FixtureDefの値は異なりますが、何も機能していないようです。私の体はまだシーンの一番下に落ちてそこに座っています。等しく反対の力を加えることについて何かを見ました。私の重力が地球のデフォルトであり、これが実行可能なオプションである場合、どのように正確にそれを行うでしょうか?または、この物体を重力場から取り除き、それでも他の動的物体と相互作用させるためのより良い方法はありますか?

4

3 に答える 3

8

現在のバージョンの AndEngine に含まれている Box2D のバージョンはわかりませんが、試してみてください。body.setGravityScale(0);

それでもうまくいかない場合は、これを onUpdate に入れる必要があります。

body.applyForce(new Vector2(0,-SensorManager.GRAVITY_EARTH), new Vector2(body.getWorldCenter()));
于 2012-06-28T07:51:40.150 に答える
2

コードはキネマティック ボディを使用しておらず、ダイナミックを使用しています。「ボディタイプ.ダイナミックボディ」

その行を「BodyType.KinematicBody」のようなものに変更する必要があります

重力に反する力を適用すると、コードは不要なステップを実行し、非効率になります。

于 2012-07-02T17:32:33.910 に答える
2

同様の問題がありました。重力の影響を受けないボディが必要でしたが、setGravityScale と getGravityScale を andengine ボックスの 2d エクステンションに追加することで衝突を検出して解決できました。

GLES1を使用している場合、

SetGravityScale を使用した Steven Box2D

これはビルド済みのバージョンで、.so ファイルと jar が含まれています。

または、これを自分でやりたい場合は、これらが私が取った手順です。

Box2D サイトから Box2D v2.2.1 を直接ダウンロードしました。次に、拡張機能のソース プロジェクトをダウンロードしてビルドするために必要な手順に従いました。

build-the-examples-and-box2d-extension

Box2D 拡張機能の GLES2 ブランチをインポートしました。ワークスペースと Android ndk の場所に一致するように jni\build.sh ファイルのパスを変更してください。これはすべて、上記のリンクで説明されています。

次に、Box2D 2.2.1 の GravityScale について最上位のテキスト検索 (\Box2D\Dynamics 内) を実行し、この文字列を含むすべてのファイルを見つけます。拡張機能の対応するファイルに同等の変更を加えます。

変更する必要があるファイルは、

  • b2Body.cpp
  • b2Body.h
  • b2Island.cpp

ほとんどの変更は同じですが、Box2D\Dynamics\b2Island.cpp に小さな違いが 1 つあります。コードを次のように変更します。

// Integrate velocities.
    b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force);

に、

// Integrate velocities.
    b->m_linearVelocity += step.dt * (b->m_gravityScale * gravity + b->m_invMass * b->m_force);

すべての変更が完了したら、拡張子内のさらに 2 つのファイルを変更する必要があります。これらは jni\Box2D にあります。

Body.cpp と Body.h を変更し、jniSetGravityScale と jniGetGravityScale ルーチンを追加しました。このためには、単に jniSetAngularVelocity と jniGetAngularVelocity をコピーして、適切に変更します。したがって、Body.cpp のコードは、たとえば次のようになります。

     JNIEXPORT void JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniSetGravityScale
(JNIEnv *, jobject, jlong addr, jfloat Scale)
        {
            b2Body* body = (b2Body*)addr;
            body->SetGravityScale(Scale);
        }

        JNIEXPORT jfloat JNICALL Java_com_badlogic_gdx_physics_box2d_Body_jniGetGravityScale
(JNIEnv *, jobject, jlong addr)
    {
        b2Body* body = (b2Body*)addr;
        return body->GetGravityScale();
    }

src\Body.java についても同じことを行います (ここでも、AngularVelocity の get および setter をコピーして、適切に変更できます)。

最後に jni\build.bat を実行し、生成された .so ファイルをプロジェクトにコピーします。次に、拡張機能の src フォルダーを jar としてエクスポートし、これもプロジェクトに追加しました。

これで、電話をかけることができるはずです。

Body.setGravityScale(0.0f);

あなたのダイナミックボディに。

お役に立てれば。

于 2012-10-07T16:38:25.883 に答える