【问题标题】:How do I make a body ignore gravity (AndEngine)?如何让身体忽略重力(AndEngine)?
【发布时间】:2012-06-28 07:01:44
【问题描述】:

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

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

【问题讨论】:

    标签: android physics andengine gravity


    【解决方案1】:

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

    如果这不起作用,则必须将其放入 onUpdate:

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

    【讨论】:

    【解决方案2】:

    您的代码没有使用 Kinematic body,它使用的是 Dynamic。 "BodyType.DynamicBody"

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

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

    【讨论】:

      【解决方案3】:

      我有一个类似的问题 - 我需要一个不受重力影响的物体,但仍然可以通过将 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);
      

      在您的动态身体上。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多