较弱的断言失败

时间:2013-04-11 11:49:57

标签: c# xna assertion farseer

我们正在为学校项目创建游戏。它是2D平台游戏,它处于早期阶段。我们使用C#/ XNA,我们正在实现Farseer Physics Engine。 我目前正在努力应对地图类。在类中我们有一个DrawableGameObjects列表,我们存储地图的每个图块并绘制它们。但是当我们试图绘制它们时,我们会得到一个“断言失败”。进一步研究这个问题我得出的结论是,每当我们尝试向世界添加更多静态物体时(即使没有绘制它们),我们也会失败。 Throw message

Game1.cs:第210行是:

world.Step(0.033333f);

和Program.cs:第15行是:

game.Run();

以下是Map类的代码:

class Map
{
    private List<DrawableGameObject> ground = new List<DrawableGameObject>();

    public Map(World world, Texture2D texture)
    {
        for (int i = 0; i < 32; i++)
        {
            DrawableGameObject floor = new DrawableGameObject(world, texture, new Vector2(40, 40), 100, "ground");
            floor.Position = new Vector2(i * 40, 500);
            floor.body.BodyType = BodyType.Static;
            ground.Add(floor);
        }

    }

    public void Draw(SpriteBatch spriteBatch){
        foreach (DrawableGameObject dgo in ground)
            dgo.Draw(spriteBatch);

    }

}

有什么想法吗?我已经在Farseer's forum上发布了这个问题,但它们还不是很有用......

1 个答案:

答案 0 :(得分:0)

这是Farseer中的错误。(版本3.3.1)

我打开了有问题的方法(World.SolveTOI)的Farseer源代码,发现两次调用Debug.Assert。而且,实际上,在我的代码副本中,我实际上已经遇到过这个错误,并对其中一个进行了评论,特别是:

Debug.Assert(typeA == BodyType.Dynamic || typeB == BodyType.Dynamic);

基本上它不想尝试处理两个静态物体之间的接触。

幸运的是,下面的代码实际上检查了基本相同的条件,如果是这样的话,continue是循环:

bool awakeA = bA.Awake && typeA != BodyType.Static;
bool awakeB = bB.Awake && typeB != BodyType.Static;

// Is at least one body awake?
if (awakeA == false && awakeB == false)
{
    continue;
}

因此,简单地注释掉或删除断言是非常安全的。 (当然,您应该从源代码构建Farseer - 它会让生活变得更加轻松。)


重现Farseer bug:有两个静态物体和一个与两者接触的动态物体,然后使动态物体静止。断言将触发。

断言位于联系处理循环中。通常,一对静态物体不会产生接触。但是如果一个身体开始是动态的,那么就可以创建联系人 - 当身体变得静止时它们不会被移除。