Box2D碰撞问题

问题描述

Box2D的新功能,将不胜感激。

我有一个简单的函数,它包含一个b2World和b2Body *,在此该对象应该下落直到它与一个接地盒碰撞(已经在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()中实现,并且工作正常。但是,当我尝试将其移至单独的类中的自身函数时,冲突不再起作用...我不知道为什么,因为它实际上是复制/粘贴的,只是围绕变量名进行更改以适合参数...

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

谢谢。

解决方法

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

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

这意味着您正在创建一个副本,并且如果此副本被修改,则传递给该函数的原始对象将保持不变。在类型之后加上&,您现在可以按引用传递对象。

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

这意味着不会创建任何副本,而是该函数可与原始对象一起使用,因此更改也会对其产生影响。

因此,当您使用此循环之前,它可能嵌套在您的main函数或任何其他函数中,并且可以修改在该作用域中声明的原始变量world。现在,将其移至单独的函数中,您必须告诉编译器您要使用原始对象。

例如,详细了解按值传递和按引用传递herehere