libGDX和Box2D - 哪个黑色巫术会导致这个错误?

时间:2015-12-22 08:24:43

标签: java debugging libgdx box2d

我使用的是最新版本的libGDX。 我创建了一个体,我想在两个点之间来回传播,称为initialPosition和finalPosition,它们是Vector2。

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

所以基本上,在构造函数中,在构建了我的主体之后:

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)); 

所以,问题出在这里:行为绝对不是我想要的。一旦身体到达finalPosition,而不是回到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()发生了变化,这是正常的,因为在创建之后我给它施加了一个线性速度的身体。在下一步中,initialPosition采用body.getPosition()的先前值,并再次更改body.getPosition(),依此类推。

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

1 个答案:

答案 0 :(得分:0)

是的,就像我之前在评论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;