1

Im making a roguelike game, using XNA and farseer physics. Some rooms will have a procedurally generated cave like layout made from blocks.

At the moment every block is a seperate body. created thusly:

 _floor = BodyFactory.CreateRectangle(_world,   ConvertUnits.ToSimUnits(Globals.SmallGridSize.X), ConvertUnits.ToSimUnits(Globals.SmallGridSize.Y), 30f);
        _floor.Position = ConvertUnits.ToSimUnits(_position.X + _centerVect.X, _position.Y + _centerVect.Y);
        _floor.IsStatic = true;
        _floor.Restitution = 0.2f;
        _floor.Friction = 0.2f;

Should I Just have one body per room and add all the rectangle shapes for each block to the body? Will this give me a performance boost? Also will it be possible to add and remove block shapes to this body (in order to be able to destroy a block and then "add" the exposed one behind it)?

4

1 回答 1

2

您很可能希望保留每个块有 1 个 Body,因为在破坏块时管理碰撞会容易得多。考虑在块被破坏后必须重新计算 1 Body 的形状。这将是相当费力的。

这与我放弃的游戏非常相似。我最初对每个块都有一个 Body,这很慢:

http://www.jgallant.com/images/uranus/land2.png

我的第一个优化只是将身体设置在生成世界的边缘:

http://www.jgallant.com/images/uranus/chunk.png

这导致了更快的代码,但仍然存在屏幕上有太多主体的问题。我后来的优化根据玩家在世界上的位置将身体添加到边缘。尸体从可用尸体池中拉出,并移动到适当的位置。实体从未被破坏,只是在不使用时移动到 Vector2(Int.Min, Int.Min)。当需要使用它们时,它们被移动到位置:

http://www.jgallant.com/images/collision2.jpg

这提供了三种方法中最快的代码。如果您正在寻找动态销毁/创建身体,这是一个非常糟糕的主意。您最好将可用的尸体存储在池中,然后重新使用它们。

这也有一些复杂性。目前我手头没有我的代码,但如果您有其他问题,我可以发布我的一些代码来提供帮助。

于 2013-02-12T14:07:59.833 回答