2011-04-11 96 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()); 
      } 
     } 
    } 
} 

我希望它能工作。