我是个傻瓜。我在C#中使用Monogame和Farseer Physics Library。 (最新版本)
在我的游戏中,只要我的ball
(圆圈)点击corner of a rectangle
(或甚至是另一个圆圈),就应该只改变Y轴上的方向。
然而,它不仅改变了Y轴上的方向(按预期),而且它也向右移动了一小部分(或相应的左边),这取决于你如何到达角落(或另一个圈子)。就好像有一些力量被放在球上,使它也在X轴上移动。
这个动作很酷,而且很有意义,但在我的游戏中,它没有,因此我想摆脱它。
这怎么可能?我猜我必须改变一些默认值。
这就是我的编码:
BallBody.BodyType = BodyType.Dynamic;
BlockBody.BodyType = BodyType.Static;
Ball.LinearVelocity = new Vector(0,-1); // ball going up
BallBody.OnCollision += Ball_OnCollision;
public bool Ball_OnCollision(Fixture f1, Fixture f2, Contact contact)
{
// if the Ball (f1), collides with the Block (f2)
if (f2.Body == BlockBody)
// change the direction of the Ball on Y-Axis
Ball.LinearVelocity = new Vector(0,-1);
return true;
}
同样在高速时,会发生这种情况:
即使球永远不能通过Block(隧道),我想知道我怎么可能修复它以便球永远不会进入Block区域?
答案 0 :(得分:1)
不幸的是,这对Box2D来说非常困难。我尝试的最好的办法就是在接触开始时记录球的速度,然后当接触结束时,手动将速度设置为我想要的速度。当球仅开始和一次接触一个区块时,这种方法很好,但在某些情况下,球可以在同一时间步骤中开始接触两个区块。你必须看看它触摸的块的排列,并自己计算你期望它反弹的角度。最终我放弃了,并没有费心去掩盖这个案子。