以前にも同様の質問をいくつかしたと思いますが、私は茂みの周りを叩いていました。これは、私が完全に休むことができない本当の問題だと思います。
サード パーティのライブラリを扱っていますが、それ自体を作成できないオブジェクトがありますb2Body
。インスタンス化する必要がb2World
あります。個人的には、このデザイン パターンはあまり好きではありません。は世界から独立して存在し、必要に応じて世界に追加できるようにすべきだと思います。とにかく、何か余分なものを追加する必要があるため、独自のクラス class でラップしました。同様に、ラッパーがあります。今、私には3つのオプションがあると思います:b2Body
b2Body
Body
World
- Haveのコンストラクターは、完全にインスタンス化できる (内部のどこかを呼び出す) ため
Body
のポインターを受け取ります。つまり、次のようなコンストラクターがあります。World
b2World::CreateBody
Body *b = new Body(world_ptr)
- ライブラリがすでに行っているように、
Body
いくつかのメソッドに渡します-つまりWorld::CreateBody
Body *b = world.CreateBody(params);
- すべてのデータを複製して、
b2Body
必要に応じて使用できるようにします。ワールドに追加した後、データを使用するように「切り替え」b2Body
ます。Body b
world.addBody(b)
Body
(1) と (2) は、 aなしでは a を持てないことを意味しますがWorld
、これはおそらく必要ないでしょうが、そのオプションがあるといいかもしれません [他のオブジェクトなどのテンプレートとして使用できるように] ]。他にどんな長所と短所があるのか わかりません。(3) の方が優れているように見えますが、実装するのに手間がかかります。これは、既に に含まれているほとんどのデータを複製する必要があることを意味しb2Body
ます。
あなたの考えは何ですか?CW
誰も心配しないように、私はこれをします。
私はまだこれを休ませることができません。各オプションは次のようになります。
オプション 1: (私が好むもの)
World w;
Body b;
Fixture f;
b.addFixture(f);
w.addBody(b);
オプション 2: (中間のどこか)
World w;
Body b(w);
Fixture f(b);
オプション 3: (Box2D の方法)
World *w = new World;
Body *b = w->CreateBody(args);
Fixture *f = b->CreateFixture(args);
オプション 2 と 3 はそれほど違いはありませんが、オブジェクトの作成を制御できる人が変わります。
オプション3を実際に実装するにはどうすればよいですか?World::CreateBody()
whichをb2World::CreateBody(args)
呼び出しb2Body::b2Body()
て返す必要b2Body
がありますが、Body::Body(args)
これは問題です。はb2Body
完全に初期化されますが、ラッパーにはそれを行う場所がありません...より具体的には、どのように記述しWorld::CreateBody(const BodyDef &bd)
ますか? BodyDef は b2BodyDef から、Body は b2Body から、World は b2World から、などと仮定します。