私が取り組んでいる中規模の Flash ゲームで、初めて Box2D を真剣に使用しています。Box2D に関する私の現在の経験は、ワールド、ボディを作成し、それらのボディを機能的な方法でワールドに追加することに限定されています。
Box2D を自分のゲーム環境に統合するのは十分に簡単だと思います。適切に記述されたコードを維持し、衝突の処理を説明するいくつかのチュートリアルを完了しました。私が今直面している問題は、私のゲームには多くの本体があり、それぞれがさまざまな方法で他の本体と相互作用することですb2ContactListener
。非常に面倒になることなく、独自のサブクラスを作成するのは難しいと感じています。
私が使用したチュートリアルに基づいて、独自のサブクラスを作成b2ContactListener
し、メソッドのオーバーライドを追加しましたBeginContact()
。BeginContact()
呼び出されたときに受け取る引数は、 のインスタンスを参照します。これにより、2 つのインスタンス (衝突した 2 つのインスタンス) にb2Contact
アクセスできます。その後、これらの各 に関連付けられb2Fixture
たインスタンスにアクセスできます。b2Body
b2Fixture
問題:現在、2 つのものが衝突したもの (つまり、壁とミサイルなのか、プレイヤーと木なのかなど) を見つける回り道があります。
GetUserData()
これは、例として次のように使用します。var f1Player:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Player var f2Player:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Player var f1Tree:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Tree var f2Tree:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Tree // ... continutes with all possible combinations. // Example of managing a collision: if(f1Player && f2Tree) { // Player (FixtureA) and Tree (FixtureB) } if(f2Player && f1Tree) { // Player (FixtureB) and Tree (FixtureA) }
ご覧のとおり、これは非常に長くなり、管理不能になります。また、FixtureA または FixtureB、またはその逆の特定の要素に対応するために 2 回実行するアクションの各セットを作成する必要があります (明らかに、文字通り書き直すのではなく、パラメータを入れ替えた関数呼び出しの形式で)。
これは明らかに正しいアプローチではありませんが、衝突検出の管理について詳しく説明しているリソースを見つけることができませんでした。
共有できる Box2D を使用した衝突検出管理の経験がある人はいますか? また、SetUserData( entityThatOwnsTheBody );
その方法を使用する正しい方法を使用していますか?