我正在使用 box2d 为移动设备开发游戏。我通过这些代码创建了一个世界:
b2Vec2 gravity(0.0f, 9.8f);
bool doSleep = false;
b2World* g_World = new b2World(gravity, doSleep);
它工作得很好。我有播放器对象。播放器像这样摔倒:
y轴:0、10、30、70..等。我的意思是它每秒钟下降得更快。但我希望它以相同的速度下降。比如:y轴:0、10、20、30..等
我正在使用 box2d 为移动设备开发游戏。我通过这些代码创建了一个世界:
b2Vec2 gravity(0.0f, 9.8f);
bool doSleep = false;
b2World* g_World = new b2World(gravity, doSleep);
它工作得很好。我有播放器对象。播放器像这样摔倒:
y轴:0、10、30、70..等。我的意思是它每秒钟下降得更快。但我希望它以相同的速度下降。比如:y轴:0、10、20、30..等
身体在重力的作用下下落,所以顺理成章地加速下落。
如果在您的世界中不应该是重力,则将重力矢量设置为零并为身体设置线速度:
b2Vec2 gravity(0.0f, 0f);
bool doSleep = false;
b2World* g_World = new b2World(gravity, doSleep);
b2Body* body;
<.. creating body ..>
body->setLinearVelocity(0, 10);
如果在你的世界中重力应该是,那么在 b2BodyDef 中将重力比例设置为零:
b2Vec2 gravity(0.0f, 9.8f);
bool doSleep = false;
b2World* g_World = new b2World(gravity, doSleep);
b2BodyDef bodyDef;
bodyDef.gravityScale = 0;
< .. set other body parameters ..>
b2Body* body;
<.. creating body ..>
body->setLinearVelocity(0, 10);
如果您使用旧版本的 Box2D,并且 b2BodyDef 中没有该字段,那么您有两种解决方案:
像上面的代码一样设置一次线速度,并在每个更新步骤中施加与重力相反的力:
// Update cycle
g_World->Step(elapsed, 7, 4);
body->ApplyForceToCenter(-gravity);
如菲利普所说,在每个更新步骤应用线速度:
// Update cycle
g_World->Step(elapsed, 7, 4);
body->ApplyLinearVelocity(0, 10);