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.DynamicBody”

您应该使用“BodyType.KinematicBody”之类的内容更改该行

如果您施加与重力相反的力,您的代码将执行不必要的步骤并且效率低下。

于 2012-07-02T17:32:33.910 回答
2

我有一个类似的问题 - 我需要一个不受重力影响的身体,但仍然可以通过将 setGravityScale 和 getGravityScale 添加到 andengine box 2d 扩展来检测和解决它。

如果您使用 GLES1,

史蒂文 Box2D 与 SetGravityScale

这是我的预建版本,包含 .so 文件和 jar。

或者,如果您想自己执行此操作,这些是我采取的步骤。

我从 Box2D 站点直接下载了 Box2D v2.2.1。然后我按照必要的步骤下载了扩展的源项目并构建它,

构建示例和 box2d 扩展

我导入了 Box2D 扩展的 GLES2 分支。确保更改 jni\build.sh 文件中的路径以匹配您的工作空间和 android ndk 的位置。这一切都在上面的链接中进行了解释。

接下来对 Box2D 2.2.1 中的 GravityScale 进行顶级文本搜索(在 \Box2D\Dynamics 中)并找到包含此字符串的所有文件。对扩展中的相应文件进行等效更改。

您需要更改的文件是,

  • b2Body.cpp
  • b2Body.h
  • b2岛.cpp

虽然大部分改动是一样的,但有一个细微的差别是在 Box2D\Dynamics\b2Island.cpp 中,修改代码如下

// 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);

完成所有更改后,我们需要更改扩展名中的另外两个文件,它们位于 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 回答