【问题标题】:C# Monogame & Farseer Physics: CollisionsC# Monogame & Farseer Physics:碰撞
【发布时间】:2015-03-12 22:03:15
【问题描述】:

我是一个初学者。我在 C# 中使用 Monogame 和 Farseer 物理库。 (最新版本)

在我的游戏中,每当我的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;
}

在高速情况下也会出现这种情况:

即使球永远无法穿过街区(隧道),我想知道我怎样才能解决这个问题,让球永远不会进入街区?

【问题讨论】:

    标签: c# box2d monogame farseer


    【解决方案1】:

    不幸的是,使用 Box2D 很难做到这一点。当我尝试时,我能做到的最好的方法是在接触开始时记录球的速度,然后在接触结束时,手动将速度设置为我想要的速度。当球一次只开始和结束接触一个积木时,这很好用,但在某些情况下,球可以在同一时间步开始接触两个积木。您必须查看它接触的块的排列,并自己计算您希望它反弹的角度。最终我只是放弃了,没有费心去报道那个案子。

    【讨论】:

    • 对于球来说,应该不可能同时接触两个矩形,因为一个圆接触矩形底边的精度正好为 1 个像素,而 2 个矩形永远不会在同一个像素中同时,真的吗?
    • 我想知道碰撞发生之前的时间(前一帧),所以我需要一个OneFrameBeforeCollision 函数,而不是OnCollision,我猜?我怎样才能实现这样的事情?有一些 Body.CollisionCategories 属性(Categorie.Cat1、Categorie.Cat2、...、Categorie.Cat31)你知道这 31 个中的一些是否更容易实现我想要的吗?我找不到这些的任何文档。我什至不知道他们在做什么,也不知道他们是否对我的案子有任何帮助。
    • 球很容易同时接触到两个方块,如果它碰到两个方块互相接触的地方,并且两个方块重叠。不幸的是,Box2D 无法进行事先检查,因为这没有任何意义 - 物理引擎如何知道您是否会在下一个时间步之前施加力并改变某物的方向...
    • “两个块相互接触”我的块从不相互接触,是吗?我认为每个块都从另一个块的末尾开始
    • 好吧,即使它们之间有间隙,你仍然可以放置一个圆圈,使其同时重叠两个块,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多