Box2D 碰撞问题

Box2D Collision Issues

刚接触 Box2D,希望得到帮助。

我有一个接受 b2World 和 b2Body* 的简单函数,其中 body 应该下降直到它与地面盒(已在 main() 中创建)发生碰撞

代码大致如下:

void snake::update(b2World world, b2Body* snake)
{
    bool running = true;
    Clock deltaClock;
    Time deltaTime;

    while (running)
    {
        deltaTime = deltaClock.getElapsedTime();
        deltaClock.restart();
        world.Step(deltaTime.asSeconds(), 6, 2);

        position = snake->GetPosition();

        char ch;
        if (_kbhit())
        {
            ch = _getch();
            if (ch == 'x')
            {
                running = false;
            }
        }
    }
}

这段代码最初是在main()中实现的,运行良好。然而,当我试图将它移动到单独的 class 中它自己的函数时,碰撞不再有效......我不知道为什么,因为它确实是 copy/pasted,只是更改变量名称以适应参数...

我不知道出了什么问题,如果您需要任何其他信息,我很乐意提供。

提前致谢。

基本上是您在原始函数头中按值传递 b2World 对象之前设置参数的方式。

void snake::update(b2World world, b2Body* snake)

这意味着您正在创建一个副本,如果这个副本被修改,传递给函数的原始对象保持不变。使用类型后面的 &,您现在通过引用传递对象。

void snake::update(b2World& world, b2Body* snake)

这意味着没有创建副本,而是函数与原始对象一起工作,因此,更改也会影响它。

所以当你使用这个循环之前它可能嵌套在你的 main 函数或其他任何东西中并且可以修改在该范围内声明的原始变量 world 。现在您已将它移动到一个单独的函数中,您必须告诉编译器您想要使用原始对象。

详细了解按值传递和按引用传递 here and here 例如