テスト駆動でゲーム開発はできるのか?

ゲームの開発にテスト駆動開発を取り入れてみる検証のブログです

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