libGDX 和 Box2D - 哪个黑魔法导致了这个错误?

libGDX and Box2D - Which black sorcery causes this bug?

我使用的是最新版本的 libGDX。 我创建了一个 body,我想在名为 initialPosition 和 finalPosition 的 2 个点之间来回移动,它们是 Vector2。

我将这两个 Vector2 存储在一个名为 travel 的数组中。为了使 body 从一个点移动到另一个点,我使用了一个名为 step 的整数:当 body 到达 travel[step] 时,我将值更改为 0 或 1,具体取决于其先前的值(0 或 1)

所以基本上,在构造函数中,在构建 body 之后我有:

travel = new Vector2[2];
travel[0] = initialPosition;
travel[1] = finalPosition;

step = 1;
direction = new Vector2();
direction = new Vector2(travel[step].x - body.getPosition().x, travel[step].y - body.getPosition().y);
body.setLinearVelocity(direction.clamp(speed, speed));

在渲染中我有:

System.out.println("initialPosition = " + initialPosition.toString());

if(!new Vector2(travel[step].x - body.getPosition().x, travel[step].y - body.getPosition().y).hasSameDirection(direction)){

    if(step > 0)
        step = 0;
    else step = 1;

    direction = new Vector2(travel[step].x - body.getPosition().x, travel[step].y - body.getPosition().y);
    System.out.println("Direction change");     
}

body.setLinearVelocity(direction.clamp(speed, speed)); 

所以,问题来了:这种行为绝对不是我想要的。 body 到达 finalPosition 后,body 不会回到 initialPosition,而是在 finalPosition 附近摇晃。

因此,我做了很多控制,我注意到initialPosition在这个过程中发生了变化。我用 ligne

监控它的价值
System.out.println("initialPosition = " + initialPosition.toString());

哪里变得很奇怪: 如果我用

更改渲染代码
System.out.println("initialPosition = " + initialPosition.toString());

if(!new Vector2(travel[step].x - body.getPosition().x, travel[step].y - body.getPosition().y).hasSameDirection(direction)){

}

body.setLinearVelocity(direction.clamp(speed, speed)); 

我有完全相同的问题,而 if 语句是空的! 但是如果我删除 if(){},我有这个代码:

System.out.println("initialPosition = " + initialPosition.toString());

body.setLinearVelocity(direction.clamp(speed, speed)); 

问题消失了:initialPosition 保持其原始值。

更奇怪的地方 如果在渲染中我只放了这段代码

    System.out.println("--------------------------------------------------------");
    System.out.println("initialPosition = " + initialPosition.toString());
    System.out.println("body.getPosition() = " + body.getPosition().toString());

initialPosition又变了!虽然渲染只是在控制台打印东西! 并且感谢我在每一步打印的分隔符 ------ 我可以看到在第一步中,initialPosition 保持其值并且 body.getPosition() 发生了变化,这是正常的,因为就在创建 body 我对其应用了线速度。在下一步中,initialPosition 取 body.getPosition() 的先前值并且 body.getPosition() 再次更改,依此类推。

有人知道这里发生了什么吗?

是的,就像我之前在这一行之后的评论 initialPosition = body.getPosition(); 中所说的,它们指的是同一个对象。

查看 body.getPosition 和 javadoc 的源代码:Note that the same Vector2 instance is returned each time this method is called.

要更改此行为,请像这样初始化 initialPosition:

tempPosition = body.getPosition();
initialPosition.x = tempPosition.x;
initialPosition.y = tempPosition.y;