Box2D形状通过世界
问题描述:
我有Box2D这个非常奇怪的问题(在iOS下)。我有一个搁在屏幕底部的身体。如果我使用body->SetType(b2_staticBody)
将body从b2_dynamicBody设置为b2_staticBody,然后将其设置回b2_dynamicBody,它会在屏幕底部快速移动(在看到它向下移动的几帧内),然后再通过地板,并正确地休息。Box2D形状通过世界
这种行为似乎只发生在屏幕的底部。与其他坐在一起的身体做同样的事情不会产生这种行为。
我定义屏幕边缘如下(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);
这样做的最奇怪的部分是多个I切换体从动态到静态,越远和在被推回去之前,它落在地板上更远。
除了从动态到静态,我没有改变体内的其他任何东西。如果我移动身体并将其放回地板上,开始将它从动态切换到静态,它将重置掉落到地板上的多少,但是它会在我切换时再次累积。
我不明白为什么会像这样掉下地板,除非我错误地创建它。游戏中的其他一切都很完美。
答
我也有这个问题。这是我的理论:当对象是静态的时,它会停止与其他静态东西(如地面)产生联系。所以,似乎再次设置为动态时,它无法更新此联系人检查。
我的解决方案是这样的:由于更改对象的位置正确更新这些联系人,我只是将对象移动到当前位置。不幸的是,它被检测为零变化。所以,我需要将它移动到其他地方,然后再移动到之前的位置。
b2Vec2 pos = body.getPosition();
float ang = body.getAngle();
b2Vec2 off_map(-100,-100);
body.setPositionAndAngle(off_map, 0);
body.setPositionAndAngle(pos, ang);
如果您还没有关闭,地图区域,可以尝试先动期间停用的对象。