我有一个类似的问题 - 我需要一个不受重力影响的物体,但仍然可以通过将 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);
在您的动态身体上。
希望这会有所帮助。