2013-11-11 2 views
1

Я создаю приложение, в котором я пытаюсь присоединиться к двум телам таким образом, что, когда я перемещаю одно тело, второе тело должно быть перемещено в пределах первого тела.Присоединиться к двум блокам Box2d

Вот мой код, чтобы создать тело:

- (b2Body *)addBoxBodyForDynamicSprite:(CCSprite *)sprite { 

    b2BodyDef spriteBodyDef; 
    spriteBodyDef.type = b2_dynamicBody; 
    //spriteBodyDef.position.Set(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO); 
    CGPoint asolutePoint = [sprite.parent convertToWorldSpace:sprite.position]; 
    spriteBodyDef.position.Set(asolutePoint.x/PTM_RATIO, asolutePoint.y/PTM_RATIO); 
    spriteBodyDef.userData = (__bridge void*)sprite; 
    b2Body *spriteBody = world->CreateBody(&spriteBodyDef); 

    b2PolygonShape spriteShape; 
    spriteShape.SetAsBox(sprite.contentSize.width/PTM_RATIO/2, 
         sprite.contentSize.height/PTM_RATIO/2); 
    b2FixtureDef spriteShapeDef; 
    spriteShapeDef.shape = &spriteShape; 
    spriteShapeDef.density = 0.3; 
    spriteShapeDef.isSensor = true; 
    spriteBody->CreateFixture(&spriteShapeDef); 

    return spriteBody; 
} 

Одно тело кинематическая и другое тело Dynamic. Я двигаюсь эти тела с помощью:

theBody->SetTransform(locationWorld, theBody->GetAngle()); 

Если я применить линейную силу здесь, тела не двигаются & Объединенный, который я использовал, чтобы исправить их в b2WeldJoint.

b2JointDef jointDef; 
    jointDef.bodyA = another; 
    jointDef.bodyB = leftHandFixBody; 
    aJoint = (b2Joint *)world->CreateJoint(&jointDef); 

Он перемещает динамическое тело, но кинематическое тело остается на своем месте. Я хочу переместить оба тела вместе. Любая помощь будет действительно оценена. Благодаря!

+1

Здесь много указателей. Избегайте использования указателей и вашей жизни, поскольку программисту на C++ было бы легко. – Manu343726

+3

Кинематические тела имеют бесконечный импульс, поэтому они не реагируют на силы или импульсы. Вы можете использовать SetLinearVelocity для их перемещения. (@Manu, что абсолютно неуместно и даже не верно). – iforce2d

+0

@ iforce2d Спасибо за ваш ответ. Я уже пробовал setLinearVelocity, но он не двигал никаким телом. theBody-> SetLinearVelocity (locationWorld); –

ответ

1

Кроме того, согласно руководству, кинематические тела перемещаются путем установки их скорости, а не путем приложения сил.

Кинематическое тело движется под моделированием в соответствии с его скоростью. Кинематические тела не реагируют на силы. Они могут быть перемещены вручную пользователем, но обычно кинематическое тело перемещается путем установки его скорости . Кинематическое тело ведет себя так, как будто оно имеет бесконечную массу, но Box2D сохраняет ноль для массы и обратной массы. Кинематические тела не сталкиваются с другими кинематическими или статическими телами.

Кроме того, я обнаружил, что использование SetTransform (...) для перемещения тел менее эффективно. Я создал портал с ним, чтобы прыгать с тела из одного места в другое, и это сработало. Но если бы я обновил его каждый цикл моделирования, тело перестало сталкиваться с другими телами. Это всего лишь слово осторожности.

Было ли это полезно?

Смежные вопросы