Box2D のマニュアルを読み、マスキングが一般的にどのように機能するかを理解しました。しかし、私が得ている結果は、マニュアルに記載されているものに従っていません。
プレイヤー、障害物、トリガーの 3 つのカテゴリがあります。
プレイヤーと障害物は互いに衝突しますが、それ自体には衝突しません。私はこれを設定することで機能させました:
プレーヤー
circleDef.filter.categoryBits = 0x2;
circleDef.filter.maskBits = 0x4;
障害
shapeDef.filter.categoryBits = 0x4;
shapeDef.filter.maskBits = 0x2;
トリガータイプも必要です...これらは、プレーヤーを検出してイベントをトリガーするためだけに使用していますが、何かと衝突するべきではありません。論理的には、これは maskBits を 0x0 に設定することで可能になるはずです。JBox2D 衝突コードは次のとおりです。
DefaultContactFilter.java
boolean collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
return collide;
したがって、maskBits = 0 の場合、collide はtrue を返すことはありません。カテゴリ ビットを次のフリー カテゴリ (0x8) に設定します。
引き金
shapeDef.filter.categoryBits = 0x8;
shapeDef.filter.maskBits = 0x0;
これは、Java の int が予想とは異なる動作をしていることが原因である可能性があると考えましたが、テストしたところ、次の結果が見つかりました。
0x2 & 0x2 = 2
0x2 & 0x0 = 0
トリガーは、イベントをトリガーするために使用することを意図しています。これは、CollisionListener を実装し、トリガーを使用してプレーヤーの衝突をテストし、ブール値のフラグを設定することによって行われます。しかし、シミュレーションを実行すると、プレイヤーがトリガーと衝突し、障害物も衝突します。
また、カテゴリ ビットとマスク ビットを次のそれぞれの値に設定しようとしました。
0x0 0x0
0x8 0x8
0x2 0x4
0x4 0x2
そして、プレイヤーは常にトリガー オブジェクトと衝突します。プレイヤーと障害物がトリガー オブジェクトと衝突しないようにするにはどうすればよいですか?