首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Farseer断言失败

Farseer断言失败
EN

Stack Overflow用户
提问于 2013-04-11 19:49:57
回答 1查看 215关注 0票数 2

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

Game1.cs:第210行是:

world.Step(0.033333f);

而Program.cs:line 15是:

代码语言:javascript
复制
game.Run();

以下是Map类的代码:

代码语言:javascript
复制
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上发布了这个问题,但他们还没有很大的帮助……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 20:52:54

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

我打开了有问题的方法(World.SolveTOI)的Farseer源代码,发现了两个对Debug.Assert的调用。事实上,在我的代码副本中,我实际上已经遇到了这个bug,并特别注释掉了其中的一个:

代码语言:javascript
复制
Debug.Assert(typeA == BodyType.Dynamic || typeB == BodyType.Dynamic);

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

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

代码语言:javascript
复制
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:有两个静态主体和一个与之接触的动态主体,然后将动态主体设为静态。断言将被触发。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15948043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档