我们正在为学校项目创建游戏。这是一个2D平台游戏,尚处于起步阶段。我们使用C#/ XNA,并且正在实现Farseer物理引擎。
我目前在与地图类斗争。在该类中,我们有一个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上发布了问题,但是它们还没有帮助很大...
最佳答案
这是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错误:让两个静态物体和一个与两者接触的动态物体,然后使动态物体静态。断言将触发。
断言在联系人处理循环中。通常,一对静态实体不会创建接触。但是,如果某个实体开始时是动态的,则可以创建联系人-将其设为静态时不会删除它们。
关于c# - 先知断言失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15948043/