如何让身体忽略重力(AndEngine)?

时间:2012-06-28 07:01:45

标签: android physics andengine gravity

我有一个精灵(有一个身体)在场景周围反弹。它需要不受重力的影响,但也能够与场景中的其他物体发生碰撞。这意味着我不能使用运动体。我试过了:

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具有不同的值,但似乎没有任何效果。我的身体仍然落在场景的底部并坐在那里。我看到了一些关于施加相等和相反力量的东西。如果我的引力是地球默认值,这是一个可行的选择,我究竟会怎样做?或者有没有更好的方法从引力场中移除这个物体并仍然与其他动态物体相互作用?

3 个答案:

答案 0 :(得分:8)

我不确定当前版本的AndEngine中包含哪个版本的Box2D,但您可以尝试body.setGravityScale(0);

如果这不起作用,你必须把它放在onUpdate:

body.applyForce(new Vector2(0,-SensorManager.GRAVITY_EARTH), new Vector2(body.getWorldCenter()));

答案 1 :(得分:2)

您的代码未使用Kinematic正文,它正在使用Dynamic。 “BodyType.DynamicBody”

您应该使用类似“BodyType.KinematicBody”

的内容更改该行

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

答案 2 :(得分:2)

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

如果你使用GLES1,

Steven Box2D With SetGravityScale

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

或者如果您想自己这样做,这些是我采取的步骤。

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

build-the-examples-and-box2d-extension

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

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

您需要更改的文件是,

  • b2Body.cpp
  • b2Body.h
  • b2Island.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);

在你的动态身体上。

希望这有帮助。