2011-04-11 4 views
2

상자 2D의 새로운 기능입니다 ....Box2D의 가속도계

나는 CCSprite에 볼 이미지가 있습니다. 내가 가속계를 사용하여 전체 화면에서 공을 이동하고 싶습니다 ... box2d에서 가속도계를 사용하는 방법 ??

감사합니다 ... 사전

답변

3

표준 cocos2d-box2d 템플릿 파일은 가속도계 값을 기준으로 중력을 적용하여 가속도계를 사용하여 상자를 이동합니다.

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{ 
static float prevX=0, prevY=0; 

//#define kFilterFactor 0.05f 
    #define kFilterFactor 1.0f // don't use filter. the code is here just as an example 

float accelX = (float) acceleration.x * kFilterFactor + (1- kFilterFactor)*prevX; 
float accelY = (float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY; 

prevX = accelX; 
prevY = accelY; 

// accelerometer values are in "Portrait" mode. Change them to Landscape left 
// multiply the gravity by 10 
b2Vec2 gravity(-accelY * 10, accelX * 10); 

world->SetGravity(gravity); 
    } 

휴대 전화 이동 방법에 따라 공이 원하는 것을 구체적으로 지정해야합니다. 귀하의 질문은 현재의 형태로 대답하기가 어렵습니다.

+0

내 응용 프로그램에는 내가 가속도계 및 일부 다른 객체를 회전 시키길 원하지만 ... 내 응용 프로그램에서 코드가 작동하지 않습니다. – Jasmit

+0

공을 가속도계 바로 회전시키고 싶습니까? 당신이 기울이면 좌우로 움직이기를 원하십니까? 내가 준 코드는 cocos2d 샘플 코드입니다. box2d를 읽고 어떻게 작동하는지 이해해야한다고 생각합니다. 앤드류의 방법은 효과가 있지만 그는 접시에 모든 것을 제공하지는 않습니다.) 남자에게 고기를 가르쳐주세요. – Bongeh

+0

중력을 설정하는 대신 공과 관련된 b2body에 힘을가하십시오. – placeybordeaux

1

에 가속도계 측정을 얻고 힘 = 계수 * 측정을 말한다. 이 힘을 b2Body에 적용

0

내가, 장치의 작동을 테스트

, 당신의 공 스프라이트 가진 태그가 당신의 가속도계 위임이 코드를 바꾸기 1.

입니다 보자.

공이 가속도계로 이동합니다.

-(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{ 
    #define kFilterFactor 0.75 
    accelerometer.updateInterval = 1.0f/60.0f; 
    static UIAccelerationValue rollingX = 0, rollingY = 0; 
    for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) 
    { 
     if (b->GetUserData() != NULL) 
     { 
      CCSprite *sprite = (CCSprite*)b->GetUserData(); 
      if (sprite.tag == 1) { 

       rollingX = (acceleration.x * kFilterFactor) + (rollingX * 0.25); 
       rollingY = (acceleration.y * kFilterFactor) + (rollingY * 0.25); 
       float accelX = rollingX; 
       float accelY = rollingY; 


       CGPoint moveNewPosition = sprite.position; 
       if (accelX > 0.1) { 
        moveNewPosition.y += 2; 
       } if (accelX < 0.1) { 
        moveNewPosition.y -= 2; 
       } 
       if (accelY > 0.1) { 
        moveNewPosition.x -= 2; 
       } if (accelY < -0.1) { 
        moveNewPosition.x += 2; 
       } 

       b->SetLinearVelocity(b2Vec2(2,2)); 

       sprite.position = ccp(moveNewPosition.x , moveNewPosition.y); 
       sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 
      } 
     } 
    } 
} 

잘 진행되기를 바랍니다.