2

ゲームに Box2d を使用していますが、バグがあり、気が狂いそうです。状況を単純化して、正方形のプレイヤーが一連の正方形のタイルで構成された床の上を摩擦なく前後にスライドし、左右のキー (水平方向の力を加える) によって駆動されるようにしました。床全体を前後にスライドしてうまく機能します。

例外は... ときどき、プレーヤーは、(存在しない) 壁にぶつかるかのように、タイルの 1 つの端に突然固執します。移動していたのと同じ方向にさらに押すと失敗しますが、反対方向に一度後ろに押すとすぐに、スティッキングポイントを超えて前に押すことができます. 固着点は、タイルの端にあることを除いて、ランダムに見えます。左または右に移動中に発生します。

デバッグの目的で、前の 2 つの更新ティックの位置/速度の値を保持し、この停止が発生したときにそれらを出力します。例として、ここではプレーヤーが右に移動し、わずかに減速しています。pos2 は約 8.7 である必要がありますが、代わりに完全に停止します。

tick0:  pos= 8.4636 vel= 7.1875
tick1:  pos= 8.5816 vel= 7.0833
tick2:  pos= 8.5816 vel= 0.0000

したがって、プレーヤーは 0.8 でタイルの幅は 1.0 であるため、プレーヤーは次のタイルに渡ろうとしているときに停止します (8.5816 + 0.8/2 = 8.9816)。実際、衝突メッセージが表示されます (衝突が発生したことに注意する以外は無視します)。右に移動するときは x.5816 (または -x.4184)、左に移動するときは x.4167 (または -x.5833) でのみ発生するようです。

壁にぶつかったようなものだと言いましたが、実際に壁にぶつかると数字は次のようになります。

 tick0:  pos0= 12.4131 vel2= 8.4375
 tick1:  pos1= 12.5555 vel1= 8.5417
 tick2:  pos2= 12.5850 vel0= 0.0000

そのため、最後のティックでさらに右に移動し、壁に接触します。

このようなものを見た人はいますか?この動作をどのように引き起こしている可能性があるかについての提案はありますか?

4

2 に答える 2

3

残念ながら、これは Box2d の既知の問題です... FAQ から:

タイルベースの環境

地形に多くのボックスを使用するとうまくいかない場合があります。これは、ボックスのようなキャラクターが内側の角に引っかかる可能性があるためです。Box2D の将来の更新では、エッジ チェーン上でのスムーズなモーションが可能になるはずです。一般に、長方形のキャラクタの使用は避けてください。衝突の許容範囲が依然として望ましくないひっかかりにつながるためです。

詳細については、この投稿を参照してください: http://box2d.org/forum/viewtopic.php?f=3&t=3048

そして、Box2d の作成者である Eric Catto から (強調を追加):

エッジ チェーンの解決策に取り組んでいますが、隣接するポリゴンの解決策がありません。キャラクター対環境に 1 つ以上の円を使用する方が本当に良いです。最新の物理エンジンを使用するプロのゲームのほとんどは、カプセルのような滑らかな形状をキャラクターに使用しています。キャラクターにボックス形状を使用することは、ピクセルベースのコリジョンを整数演算で使用するシステム (つまり、古いコンソール ゲーム) でのみうまく機能します。

したがって、基本的には、タイル間でひっかからないように、体は多角形ではなく滑らかな形状にする必要があります。

于 2012-12-18T18:53:59.493 に答える