std::shared_ptrにポインタを置き換える
std::shared_ptr が使えるようになったので、今まで普通にポインタを使っていた箇所をstd::shared_ptrに置き換える事にします。
CollisionAreaクラスの場合
std::shared_ptr<CollisionArea> area = std::shared_ptr<CollisionArea>(new CollisionArea(x, y, w, h));
と書くのは読みづらいので
CollisionArea::Ptr area = CollisionArea::newSharedPtr(x, y, w, h);
と書けるようにクラスに型の定義と生成用のstatic関数を追加しました。
この newSharedPtr 関数は Effective Java の "Static Factory Method" パターンを参考にしています。
今後は std::shared_ptr を使用するクラスは、全てこの書き方が出来るように対応するつもりです。
そして、設計からかなり時間が空いてしまいましたが、ようやく衝突処理の実装に手をつけていきます。
まずはコリジョン同士が衝突した場合に、その衝突の通知を受け取るテストコードを書きます。
設計では、CollisionAreaからCharacterが衝突の通知を受け取るとしましたが
Characterは後に大きくなる可能性の高いクラスですので、通知を受け取るための CollisionEventListener クラスを用意しました。
これは GoF の "Observer" パターンですが、自分は Listener という名前の方が好きなので CollisionEventListener という名前にしています。
まだ、空のクラスのみで処理は未実装なので、テストコードには DISABLED_ を付けています。
TEST(Collision, DISABLED_Collide) { CollisionDetection collisionDitection; bool isCollide1 = false; bool isCollide2 = false; CollisionArea::Ptr area1 = CollisionArea::newSharedPtr(0.0f, 0.0f, 10.0f, 10.0f); CollisionArea::Ptr area2 = CollisionArea::newSharedPtr(5.0f, 5.0f, 10.0f, 10.0f); area1->addEventListener(CollisionEventListener::newSharedPtr()); area2->addEventListener(CollisionEventListener::newSharedPtr()); collisionDitection.add(area1); collisionDitection.add(area2); // 衝突判定を行う collisionDitection.ditect(); ASSERT_TRUE(isCollide1); ASSERT_TRUE(isCollide2); }
最終的にはラムダ関数を使用して、衝突が発生したら CollisionEventListener が isCollide 変数に true を入れる処理をイメージしています。
今回のタグは以下になります。
blog_20140414