2012-06-28 25 views
3

我有现场周围的反弹精灵(带体)。它必须不受重力的影响,但也能够与现场其他物体发生碰撞。这意味着我不能使用运动机构。我尝试过:如何使身体重心忽略(AndEngine)?

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

回答

8

我不知道包含在AndEngine的当前版本是什么版本的Box2D的,但你可以尝试body.setGravityScale(0);

如果不工作,你必须把这个的onUpdate:

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

更具体地说:http://stackoverflow.com/questions/11257462/how-do-i-apply-a-force-to-a-body-in-the-direction-it-is-traveling-box2d – rphello101

2

你的代码不使用运动体,它是使用动态。 “BodyType.DynamicBody”

如果应用相对重力力你应该改变的东西,如“BodyType.KinematicBody”

那行,你的代码会做unnecesary步骤,将是低效的。

2

我有一个类似的问题 - 我需要一个体在重力作用的影响,但是仍然可能冲突检测,并通过添加setGravityScale和getGravityScale到andengine箱2D扩展解决它。

如果您使用GLES1,

Steven Box2D With SetGravityScale

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

另外,如果你想自己做,这些是我采取的步骤。

我下载的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的\动力学\ 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); 

您动感的车身。

希望这会有所帮助。