Переместить объект на экран без гравитации в box2d в iPhone - PullRequest
0 голосов
/ 10 марта 2011

Я использую следующий код, чтобы переместить мой объект Box2D на экран, но из-за гравитации моего мира или чего-то еще, я не знаю, почему мои объекты вынуждены двигаться вниз, я новичок в box2d.

Я хочу перемещать свой объект по всему миру без гравитации.

-(void) tick:(NSTimer *)timer {

    int32 velocityIterations = 8;
    int32 positionIterations = 1;
    world->Step(1.0f/60.0f, velocityIterations, positionIterations);

    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
    {
        if (b->GetUserData() != NULL)
        {
            UIView *oneView = (UIView *)b->GetUserData();
            CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO,self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO);
            oneView.center = newCenter;
            CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle());
            oneView.transform = transform;
        }
    }
}

мой код акселерометра следующий.

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    b2Vec2 gravity;
    gravity.Set( acceleration.x * 1.81,  acceleration.y * 1.81 );
    world->SetGravity(gravity);
}

пожалуйста, если кто-нибудь обойти.

Спасибо.

1 Ответ

2 голосов
/ 10 марта 2011

Насколько я понимаю, вы хотите переместить объект, установив его положение. Это плохая идея, потому что она обеспечивает нефизическое поведение тел, сталкивающихся с вашим объектом. Это потому, что если вы измените только положение своего тела, его скорость для физического движка будет по-прежнему равна нулю, а столкновение будет обрабатываться в соответствии с нулевой скоростью вашего объекта.

Лучшее решение - использовать тип b2_kinematicBody для вашего объекта. Тогда вы сможете управлять его движением, указав вектор скорости, и физика будет вести себя как положено. Также гравитация (и никакие другие силы) не будут применены к вашему объекту из-за его типа.

EDIT

//creation
b2BodyDef bDef;
bDef.type = b2_kinematicBody;
bDef.position.Set(5, 6);

b2Body *body  = physWorld->CreateBody(&bDef);


//control
body->SetLinearVelocity(b2Vec2(3, 4));
...