¿Cómo hago que un cuerpo ignore la gravedad (AndEngine)?

Tengo un sprite (con un cuerpo) que rebota alrededor de la escena. No debe ser afectado por la gravedad, sino también capaz de chocar con otros cuerpos en la escena. Esto significa que no puedo usar un cuerpo cinemático. Lo intenté:

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

con diferentes valores para mi FixtureDef, pero nada parecía funcionar. Mi cuerpo todavía cae al fondo de la escena y se sienta allí. Vi algo acerca de aplicar una fuerza igual y opuesta. Si mi fuerza gravitatoria es el defecto de la tierra y ésta es una opción viable, ¿cómo exactamente lo haría yo? ¿O hay una mejor manera de quitar este cuerpo del campo gravitacional y todavía tenerlo interactuar con otros cuerpos dinámicos?

No estoy seguro de qué versión de Box2D está incluida en la versión actual de AndEngine, pero puedes intentar body.setGravityScale(0);

Si eso no funciona, tendrás que poner esto en onUpdate:

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

Su código no está utilizando el cuerpo cinemático, está utilizando Dinámica. "BodyType.DynamicBody"

Usted debe cambiar esa línea con algo como "BodyType.KinematicBody"

Si aplica una fuerza opuesta a la gravedad, su código hará pasos innecesarios y será ineficiente.

Yo tenía un problema similar – Necesitaba un cuerpo no afectado por la gravedad, pero todavía podría colisión detectar y resolverlo mediante la adición de la setGravityScale y getGravityScale a la extensión andengine caja 2d.

Si utiliza GLES1,

Steven Box2D con SetGravityScale

Esta es mi versión preconfigurada, contiene los archivos .so y el tarro.

Alternativamente, si usted quiere hacer esto usted mismo, estos son los pasos que tomé.

Descargé el Box2D directamente v2.2.1 desde el sitio Box2D. A continuación, seguí los pasos necesarios para descargar el proyecto de origen para la extensión y llegar a construir,

build-the-examples-and-box2d-extension

Importé la rama GLES2 de la extensión Box2D. Asegúrese de cambiar las rutas en el archivo jni \ build.sh para que coincida con su espacio de trabajo y la ubicación del ndk android. Todo esto se explica en el enlace anterior.

A continuación, realice una búsqueda de texto de nivel superior (en \ Box2D \ Dynamics) para GravityScale en Box2D 2.2.1 y localice todos los archivos que contengan esta cadena. Haga cambios equivalentes a los archivos correspondientes en su extensión.

Los archivos que necesita cambiar son,

  • b2Body.cpp
  • b2Body.h
  • b2Island.cpp

Aunque la mayoría de los cambios son idénticos, una diferencia menor está en Box2D \ Dynamics \ b2Island.cpp, cambie el código como sigue

 // Integrate velocities. b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); 

a,

 // Integrate velocities. b->m_linearVelocity += step.dt * (b->m_gravityScale * gravity + b->m_invMass * b->m_force); 

Una vez que todos los cambios están en, tenemos que alterar dos archivos más en la extensión, estos se encuentran en jni \ Box2D.

Alteré Body.cpp y Body.h y añadí las rutinas jniSetGravityScale y jniGetGravityScale. Para ello, simplemente copie la jniSetAngularVelocity y jniGetAngularVelocity y cambie apropiadamente. Por lo tanto, el código en Body.cpp aparecerá como sigue, por ejemplo,

  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(); } 

Hacer lo mismo para src \ Body.java, (de nuevo se puede copiar AngularVelocity obtener y setters y cambiar adecuadamente).

Finalmente ejecute el jni \ build.bat y copie los archivos .so producidos en su proyecto. Luego exporté la extensión src carpeta como un tarro y agregó esto a mi proyecto también.

Ahora debería ser capaz de llamar,

 Body.setGravityScale(0.0f); 

en su cuerpo dinámico.

Espero que esto ayude.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.