【问题标题】:Farseer Assertion FailureFarseer 断言失败
【发布时间】:2013-04-03 14:30:27
【问题描述】:

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

Game1.cs:第 210 行是:

world.Step(0.033333f);

Program.cs:line 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 上发布了这个问题,但他们还没有太大帮助......

【问题讨论】:

  • 你可以看一下farseer的源代码并找到该行。也许这会对你有所帮助。
  • 要回应 Felix 的声明,请注意断言对话框的标题栏。 “重试”按钮映射到“调试”,它将跳转到导致断言的确切行。
  • 我试过了,但引擎没有任何线路。经过几次“重试”后,我终于得到了这个message
  • 这或多或少是相同的信息 - 只是进入游戏绘制/更新循环的不同入口点。
  • 请注意,您的解决方案中应该有 Farseer .csproj(项目)文件,并在您的游戏中添加为 项目参考(不是 DLL 参考)。然后当您点击“重试”时,调试器将转到 Farseer 中的代码行。

标签: c# xna assertion farseer


【解决方案1】:

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

我打开了相关方法 (World.SolveTOI) 的 Farseer 源代码,发现有两个对 Debug.Assert 的调用。而且,事实上,在我的代码副本中,我实际上已经遇到了这个错误并注释掉了其中一个,具体来说:

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

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

幸运的是,下面的代码实际上检查了基本相同的条件,如果是这种情况,continues 循环:

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 错误:拥有两个静态主体和一个动态主体,与两者接触,然后将动态主体设为静态。断言将触发。

断言在联系人处理循环中。通常一对静态物体不会产生接触。但是,如果一个主体一开始是动态的,则可以创建联系——当主体变为静态时,它们不会被删除。

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2021-03-16
    • 2010-09-26
    • 2018-11-09
    • 2021-01-20
    • 2014-06-10
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多