2012-06-28 1 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에 대한 값은 다르지만 아무것도 작동하지 않는 것 같았다. 내 몸은 여전히 ​​장면의 바닥으로 떨어지고 거기에 앉습니다. 나는 평등하고 반대되는 힘을 적용하는 것에 대해 봤다. 내 중력이 지구의 기본값이고 이것이 실행 가능한 옵션이라면 어떻게 할 것인가? 아니면 중력장에서이 시체를 제거하고 다른 동적 시체와 상호 작용하는 더 나은 방법이 있습니까? 당신의 onUpdate에 넣고해야합니다,

답변

8

나는 AndEngine의 현재 버전에 포함되어 Box2D의 어떤 버전 잘 모르겠지만, 그래도 문제가 해결되지 않으면 당신은 body.setGravityScale(0);

을 시도 할 수 :

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

귀하의 코드는 키네마 틱 몸체를 사용하고 있지 않으며 동적입니다. 당신은 중력에 반대 힘을 적용하면 코드가 unnecesary 단계를 수행 할 것 "BodyType.KinematicBody"

같은 뭔가 그 라인을 변경해야하고 비효율적 인 것

"BodyType.DynamicBody".

2

비슷한 문제가있었습니다. 중력에 영향을받지 않는 바디가 필요했지만 충돌 감지 및 해결 방법은 setGravityScale 및 getGravityScale을 andengine 상자 2d 확장에 추가하여 해결했습니다.

당신이 GLES1를 사용하는 경우

,

Steven Box2D With SetGravityScale

이 내 사전 구축 된 버전의 .so를 파일과 단지를 포함합니다.

또는 직접하고 싶다면 다음 단계를 거쳐야합니다.

Box2D 사이트에서 직접 Box2D를 다운로드했습니다. 그때

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.

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

    에 다음과 같이 가장 변화가 동일하지만, 하나 개의 작은 차이 Box2D의 \ 동성 \ b2Island.cpp에

CPP는 일단 모든

// 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의 코드는 (다시는 AngularVelocity GET 및 setter를 복사 할 수 있습니다 적절히 변경),

 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에 대해 동일한 작업을 수행 나타납니다.

마지막으로 jni \ build.bat를 실행하고 생성 된 .so 파일을 프로젝트에 복사하십시오. 그런 다음 확장 src 폴더를 항아리로 내 보낸 다음이를 프로젝트에 추가했습니다. 동적 몸에

이제 전화를 할 수 있어야한다,

Body.setGravityScale(0.0f); 

.

희망이 도움이됩니다.