Box2D中的加速度计

时间:2011-04-11 06:53:01

标签: iphone cocos2d-iphone

我是Box2D的新手......

我在CCSprite中有球形图像。我想用加速度计在整个屏幕上移动球...... 告诉我 如何在box2d中使用加速度计?

先谢谢...

3 个答案:

答案 0 :(得分: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 );
  }

您需要根据移动手机的方式更具体地了解您想要球做什么。你的问题很难以目前的形式回答。

答案 1 :(得分:1)

获取加速度计测量并说出Force =系数*测量值。将此力量应用于你的b2Body

答案 2 :(得分:0)

让你的Ball Sprite标记为1。

将此代码替换为Accelerometer委托,

我在设备上测试它,它正在工作。

你的球会随着加速度计移动。

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

我希望它能奏效。