2011-04-11 98 views
2

我是Box2D中的新成員....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

我的應用程序有1個球,我想旋轉加速度計和一些其他對象不移動...你的代碼不適用於我的應用程序。 – Jasmit 2011-04-11 10:13:03

+0

你想旋轉球的加速度計?你的意思是你想讓它在你傾斜的時候左右滾動嗎?我給你的代碼是cocos2d示例代碼。我想你需要閱讀box2d並理解它是如何工作的。安德魯的方法會奏效,但他並沒有把所有的東西都放在盤子上;)教導一個人釣魚。 – Bongeh 2011-04-11 12:39:30

+0

只需在與球相關的b2body上施加一個力,而不是設置重力。 – placeybordeaux 2012-12-21 16:27:57

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

我希望它能工作。