2013-04-11 94 views
2

我们正在为一个学校项目创建一个游戏。这是一款2D平台游戏,并且处于非常早期的阶段。我们使用C#/ XNA,我们正在实现Farseer物理引擎。 我目前正在努力与地图级。在课堂上,我们有一个DrawableGameObjects列表,我们存储地图的每个图块并绘制它们。但是当我们试图绘制它们时,我们会得到一个“断言失败”。进一步研究这个问题,我得出结论:只要我们试图向世界添加更多的静态物体(即使没有绘制它们),我们也会失败。 Throw messageFarseer Assertion Failure

Game1.cs:行210:

world.Step(0.033333f);

而且Program.cs的:第15行是:

game.Run(); 

下面是地图类的代码:

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上,但它们还没有得到很大帮助......

+0

您可以查看farseer的源代码并找到该行。也许这会帮助你。 – 2013-04-11 11:56:18

+0

要回显Felix的说法,请注意断言对话框的标题栏。 “重试”按钮映射到“调试”,它将跳转到导致断言的精确线路。 – 2013-04-11 12:03:17

+0

我试过了,但我没有收到引擎的任何代码。经过几次“重试”之后,我终于得到了这个[消息](http://imgur.com/BiCJDcZ) – elsgard 2013-04-11 12:21:07

回答

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

所以它是相当安全的简单注释或删除断言。 (你应该从源头,当然要建立先知 - 它使生活变得更加容易。)


要重现先知错误:有两个静态机构和一个动感的车身是与两个接触,然后进行动态的身体静态。断言将触发。

声明在联系人处理循环中。通常一对静态物体不会创建联系人。但是,如果一个物体以动态的形式出现,可以创建联系人 - 当物体变为静态时,它们不会被删除。

+0

谢谢!那样做了! – elsgard 2013-04-11 15:04:34

+0

@elsgard不要忘记upvote并接受:) – 2013-04-11 15:24:05