-1

発射物シューティングゲームを開発しています。

ゲームの基本的な構造は、矢印キーを使用してユーザーが戦車を操作することです。画面の右側から敵が入り、戦車に向かって歩き始めます。戦車は発射体のロケットを発射し、敵に命中した場合、敵が戦車に到達した場合にユーザーが得点します。

-戦車の動きは、メイン関数で作成された「hero」という名前の OpenGL または C++ オブジェクトである Animated_Sprite クラスを使用して実装されます。-敵の動きも、スプライトシートを異なるフレームにスライスする同じ Animated Sprite クラスを使用して実装されます。フレームは、Update_Sprite_Animation() 関数を使用してオブジェクトのモーション中に変化します。したがって、「enemy」オブジェクトは、メイン関数で作成された Animated_Sprite クラス オブジェクトでもあります。・戦車の動きに合わせて背景も逆方向に動きます。

-主な問題(私にとって)-ロケット(タンクの位置から発射される Box2d Circle シェイプ)は Animated_Class オブジェクトではなく、次のように作成されます。

b2Body* addCircle(int x,int y,int r,bool dyn=true){...}
void drawcircle(b2Vec2 center,float r,float angle){...}
b2Body *mycircle;
float speed=6,angle=300*3.141/180;  ...

次に、box2d の「mycircle」ボディに線形速度を適用して、次のようなロケット (円) の発射体の動きを取得しました。

void mouse( int button, int state,int x,int y)
{

           if(state==GLUT_DOWN)
           {

            mycircle=addCircle((hero->x)-5,(hero->y)+3,8,true);
            b2Vec2 vector = speed * b2Vec2(cos(angle), -sin(angle));
            mycircle->SetLinearVelocity(vector);
          }

}

-私が読んだことから、Box2dでは、オブジェクト間の衝突は、さらに2つのオブジェクトを作成し、次のような連絡先リストを取得することによってチェックされます:

 for (b2Contact* contact = world->GetContactList(); contact; contact = contact->GetNext())
          contact->... //do something with the contact

-ヒーローと敵は b2body オブジェクトではなく、Animated_Sprite クラスのオブジェクトなので、どうすればよいでしょうか? Animated_Sprite クラス オブジェクトを型キャストして b2body オブジェクトを取得できますか? または、新しい b2body オブジェクトを作成して、ヒーローまたは敵オブジェクトの参照を与える必要がありますか? はいの場合は、私を案内してください。それとも、新しい b2body オブジェクトを作成して、ヒーローと敵のすべてのフィクスチャを与える必要がありますか? b2world の外にある独自のクラス オブジェクトと、box2d の円形などの b2body オブジェクトとの間の衝突を検出する方法が必要ですが、私はこれに非常に慣れておらず、何をすべきかわかりません。

-ヒーローと敵を Box2d ボディとして実装しない理由: Animated_sprite クラスのアニメーションを b2body オブジェクトに実装する方法がわからないため & 発射体のモーションに box2d を使用している理由は、実装方法がわからないためです生の OpenGL を使用します。

Box2d のコリジョンに関するマニュアルは時間がかかりすぎて読めません。

b2body オブジェクトと b2world 外のオブジェクト、つまり通常の c++ Opengl オブジェクトの間の衝突を検出できるようにするにはどうすればよいか教えてください。

4

1 に答える 1

0

[問題が解決しました]

box2d を使用して衝突を検出するには、それらを c++ オブジェクトだけでなく、box2d 本体として持つ必要があると思います。c++ オブジェクトを作成し、それを Box2d 本体にマッピングすることで、問題が解決します。Box2d は、接触リスナーを使用して衝突をリッスンできます。カスタムクラスオブジェクトを b2body オブジェクトにする方法は次のとおりです->

Animated_Sprite クラス コンストラクターに box2d 物理ボディのコードを追加し、Animated_Sprite の新しいオブジェクトがインスタンス化されるたびに、新しい物理ボディへの参照も作成されるため、基本的には Animated_Sprite クラスのオブジェクトを作成し、box2d 世界の物理オブジェクトになります。また。今、私が目指していたものを手に入れました。ありがとう -

ところで、これを達成するために iforce2d.net サイトのチュートリアルに従いました。優れたチュートリアルがあります。誰かが私がどのようにそれをしたか知りたい場合は、このリンクのチュートリアルに従ってください "DRAWING YOUR OWN OBJECTS & CREATING PHYSICS BODIES OF THEM IN THE BOX2d WORLD" > iforce2d.net/b2dtut/drawing-objects

于 2013-11-12T21:36:24.220 に答える