Box2D形状落在世界各地

时间:2012-02-05 17:40:10

标签: ios box2d

Box2D(iOS下)我遇到了这个非常奇怪的问题。我的身体停留在屏幕的底部。如果我使用body->SetType(b2_staticBody)将身体从b2_dynamicBody设置为b2_staticBody,然后稍后将其设置回b2_dynamicBody,它会在被推动之前快速下降到屏幕底部(几帧,因为我可以看到它向下移动)从地板上回来并正确地休息。

这种行为似乎只发生在屏幕的底部。与坐在一起的其他身体做同样的事情不会产生这种行为。

我按如下方式定义屏幕边缘(screenRect已经调整为世界空间):

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body* groundBody = globalWorld->CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p2.x,       screenRect.p1.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p1.x, screenRect.p2.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p2.y), b2Vec2(screenRect.p2.x, screenRect.p2.y));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(screenRect.p2.x,screenRect.p2.y), b2Vec2(screenRect.p2.x,       screenRect.p1.y));
groundBody->CreateFixture(&boxShapeDef);

这个最奇怪的部分是我将身体从动态切换到静态,在被推回之前它越来越远地穿过地板。

除了从动态到静态,我没有改变身体中的任何其他东西。如果我移动身体并将其放回地板上,开始将其从动态切换到静态,它会重置它落入地板的程度,但是当我切换的时间越多,它就会再次累积。

我无法弄清楚为什么会像这样摔倒在地,除非我错误地创造它。游戏中的其他所有内容都能完美运行。

1 个答案:

答案 0 :(得分:0)

我也有这个问题。这是我的理论:当物体是静止的时,它会停止与其他静态物体(如地面)产生接触。因此,似乎再次设置为动态时,它无法更新此联系人检查。

我的解决方案是:由于更改对象的位置正确更新这些联系人,我只是将对象移动到其当前位置。不幸的是,它被检测为零变化。所以,我需要把它移到别处,然后再把它移到以前的位置。

b2Vec2 pos = body.getPosition();
float ang = body.getAngle();
b2Vec2 off_map(-100,-100);
body.setPositionAndAngle(off_map, 0);
body.setPositionAndAngle(pos, ang);

如果您没有地图外区域,可以尝试在第一次移动时停用该对象。