【问题标题】:box2d gravity not being applied未应用 box2d 重力
【发布时间】:2012-11-17 14:24:50
【问题描述】:

我有一个 box2d 世界,其视图锁定在 LandscapeLeft 中。我正在尝试通过向左或向右倾斜手机来移动身体,目前正在工作。当手机倾斜在 LandscapeRight 中启动关卡时,我遇到了问题。在这种情况下,重力不再被施加,我应该移动的身体静止不动。我相信这是一个摩擦问题(即使我要移动的身体和要移动的平台都是 0 摩擦),因为当我将平台的恢复设置为 1.0 时(所以我的身体现在正在很少到位)重力始终正确应用。这不是 box2d 问题,因为我的身体只有 1 个平台可以让我的身体继续移动,而且无论它在平台上的哪个位置,它都不会移动,因为我的身体会卡在瓷砖的角落。这是我的加速代码。

   - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate (UIAcceleration*)acceleration
{
    if (acceleration.x < 0) {
        b2Vec2 gravity(-acceleration.y * 15, -8);
        world->SetGravity(gravity);
    }
}

这是我的初始化代码

// Define the gravity vector.
    b2Vec2 gravity;
    gravity.Set(0.0f, -10.0f);

    // Do we want to let bodies sleep?
    // This will speed up the physics simulation
    bool doSleep = true;

    // Construct a world object, which will hold and simulate the rigid bodies.
    world = new b2World(gravity, doSleep);

    world->SetContinuousPhysics(true);

【问题讨论】:

  • 在创建 b2World() 时将重力初始化为什么?
  • 身体睡着了吗?改变重力不会唤醒它,你需要 SetAwake(true)。
  • 身体睡着了! SetAwake(true) 解决了我的问题,用它来回答我的问题,我会接受它。这里有一些关于其他用户睡觉身体的信息。当 Box2D 确定一个物体(或一组物体)已经静止时,该物体进入睡眠状态,CPU 开销非常小。如果一个物体醒着并与一个睡着的物体发生碰撞,那么这个睡着的物体就会醒来。如果与身体相连的关节或触点被破坏,身体也会醒来。您也可以手动唤醒身体。

标签: iphone cocos2d-iphone box2d


【解决方案1】:

在这篇文章中查看答案 - Accelerometer based movement in Cocos2D game

只需使用 cocos2D sprite 进行移动,并将 sprite 位置的值用于 box2D body。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多