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;
我使用的是最新版本的 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;