1

XNAとfarseer物理学を使用して、ローグライクゲームを作成しています。一部の部屋には、ブロックから作られたレイアウトのような手続き的に生成された洞窟があります。

現時点では、すべてのブロックは個別のボディです。このように作成された:

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

部屋ごとに1つのボディを用意し、各ブロックのすべての長方形をボディに追加する必要がありますか?これにより、パフォーマンスが向上しますか?また、このボディにブロックシェイプを追加および削除することは可能ですか(ブロックを破棄して、その背後にある露出したブロックを「追加」できるようにするため)。

4

1 に答える 1

2

ブロックを破壊するときに衝突を管理する方がはるかに簡単なので、ブロックごとに1つのボディを保持することをお勧めします。ブロックが破壊された後、1ボディの形状を再計算する必要があることを検討してください。これはかなり負担になります。

これは私が放棄したゲームと非常によく似ています。私はもともと各ブロックにボディを持っていましたが、それは非常に遅かったです:

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

これにより、3つの方法から最速のコードが提供されました。あなたがその場で体を破壊/作成しようとしているなら、これは本当に悪い考えです。利用可能なボディをプールに保存し、それらを再利用することをお勧めします。

これにもいくつかの複雑さがあります。現在、コードは手元にありませんが、さらに質問がある場合は、コードの一部を投稿して支援することができます。

于 2013-02-12T14:07:59.833 に答える