Акселерометр в Box2D - PullRequest
       4

Акселерометр в Box2D

2 голосов
/ 11 апреля 2011

Я новичок в Box2D ....

У меня есть изображение шара в CCSprite.Я хочу перемещать мяч по всему экрану с помощью акселерометра ... подскажите, как использовать акселерометр в box2d ??

Спасибо ... заранее

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Стандартный файл шаблона 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 голос
/ 11 апреля 2011

Получите измерения акселерометра и скажите Force = коэффициент * измерения. Примените эту силу к вашему b2Body

0 голосов

Пусть ваш Ball Sprite с тегом равен 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());
            }
        }
    }
}

Я надеюсь, что это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...