开发者

Accelerometer in Box2D

开发者 https://www.devze.com 2023-02-23 05:59 出处:网络
I am new in Box2D.... I have ball image in CCSprite. I want to move ball in whole screen using accelerometer...

I am new in Box2D....

I have ball image in CCSprite. I want to move ball in whole screen using accelerometer... tell me How to use accelerometer in box2d??

Thanks...i开发者_StackOverflow社区n advance


The standard cocos2d-box2d template file moves boxes using the accelerometer by applying gravity relative to the accelerometer value.

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

You need to be more specific on what you want the ball to do dependent on how you move the phone. Your question is difficult to answer in its current form.


Get the accelerometer measurements and say Force = coefficient*measurements. The apply this force to your b2Body


Let your Ball Sprite having tag is 1.

Replace this code with your Accelerometer delegate,

I test it on device, its working.

and your ball will move with 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());
            }
        }
    }
}

I hope it'll work.

0

精彩评论

暂无评论...
验证码 换一张
取 消