C#Monogame& Farseer Physics:碰撞

时间:2014-11-28 04:23:09

标签: c# box2d monogame farseer

我是个傻瓜。我在C#中使用Monogame和Farseer Physics Library。 (最新版本)

在我的游戏中,只要我的ball(圆圈)点击corner of a rectangle(或甚至是另一个圆圈),就应该只改变Y轴上的方向。

然而,它不仅改变了Y轴上的方向(按预期),而且它也向右移动了一小部分(或相应的左边),这取决于你如何到达角落(或另一个圈子)。就好像有一些力量被放在球上,使它也在X轴上移动。

http://i.imgur.com/rEbNTua.png?1

这个动作很酷,而且很有意义,但在我的游戏中,它没有,因此我想摆脱它。

这怎么可能?我猜我必须改变一些默认值。

这就是我的编码:

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

同样在高速时,会发生这种情况:

enter image description here

即使球永远不能通过Block(隧道),我想知道我怎么可能修复它以便球永远不会进入Block区域?

1 个答案:

答案 0 :(得分:1)

不幸的是,这对Box2D来说非常困难。我尝试的最好的办法就是在接触开始时记录球的速度,然后当接触结束时,手动将速度设置为我想要的速度。当球仅开始和一次接触一个区块时,这种方法很好,但在某些情况下,球可以在同一时间步骤中开始接触两个区块。你必须看看它触摸的块的排列,并自己计算你期望它反弹的角度。最终我放弃了,并没有费心去掩盖这个案子。