0

所以在我的游戏中我集成了 Cocos2D + Box2D。我知道不建议这样做,但我让我的 b2Bodys 跟随我的 CCSprites,因为我只需要 Box2D 的碰撞部分。无论如何,使用 PhysicsEditor,我已经创建了最有效的身体形状,并且我的游戏通常以 60FPS 运行良好。我唯一的问题是,我想在这里为最坏的情况做准备。假设在非常罕见的情况下(例如万分之一),游戏会延迟 5 秒,因此 FPS 约为 10FPS。这将导致我的主角不会与它下面的平台发生碰撞。反过来,它会使角色跌落平台,游戏会意外结束。所以总的来说,我只想在发生这种情况时制定一个后备计划。

所以这就是我调用 Box2D 步骤的方式:

world->Step(1/60.0f ,8, 8);

然后在我的更新方法中,我这样做是为了检测碰撞:

std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin();
    pos != _contactListener->_contacts.end(); ++pos) {
    MyContact contact = *pos;

    b2Body *bodyA = contact.fixtureA->GetBody();
    b2Body *bodyB = contact.fixtureB->GetBody();
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
        CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
        CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();

        if (spriteA.tag == 1 && spriteB.tag == 2) {
            toDestroy.push_back(bodyA);
        } else if (spriteA.tag == 2 && spriteB.tag == 1) {
            toDestroy.push_back(bodyB);
        }
    }
}

那么我将如何调整我现在正在做的事情来处理我上面解释的可能情况呢?谢谢!

4

2 回答 2

0

不会遇到此问题,因为您的 Box2D 步长间隔是固定的。当帧速率降低时,您的模拟只会减慢速度。

如果时间步长乘以帧的增量时间,则可能会发生这种情况。但即便如此,您也应该首先通过在进行任何代码更改之前强制游戏以 10 fps 运行来验证您是否会遇到这些问题。

于 2013-04-15T23:14:09.913 回答
0

Box2D 可以选择将对象定义为项目符号。这是为了处理快速移动的物体不会穿过固体物体。

语法是这样的:

bodyDef.bullet = true;

这使得 Box2D 从旧位置扫描到新位置,并且会捕捉到由于低帧率而没有碰到的那些障碍物。

于 2013-04-15T23:08:53.637 回答