はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX スコア機能実装

あいさつ

どうも、はかせです。
今回は今まで作ってきたタスクシステムという名の
オブザーバーパターンを使ってスコア機能を作りました。

実装方法

まずは久しぶりの動画です。
画面左上に注目です。
youtu.be

SCOREという文字の下の数字が敵を倒すたびに
増加しているのがわかると思います。

実装は至って単純で
スコアを管理するReactivePropertyを作って操作することで実装しています。

ReactiveProperty

// Score表示に使うReactiveProperty
mScoreRP =
	std::unique_ptr<Property, Deleter>
	(new Property(), Deleter());

//変数に変化があった時に表示する処理を登録
mScoreRP->Subscribe
(
[&](double value)->void
{
	std::wstringstream score;
	score.precision(6);
	score << value;
	auto scoret = score.str();
	auto scoreptr = scoret.c_str();
	mScoreText->UpdateText(scoreptr);
	score.clear();
}
);

スコア追加メソッド
今はシーンそのものに持たせてます。

void AddScore(double score){ *mScoreRP + score; }

スコア追加
敵のOnDisableで実行

void EnemyBase::OnDisable()
{
	auto scene = mGameObject->GetScene();
	auto playScene = dynamic_cast<PlayScene*>(scene);
	playScene->AddScore(mScore);
}

あとがき

今回はスコア機能実装でした。
正直今までやってきたことの組み合わせだけで実装できたので
珍しく詰まってないです( ・`ω・´)キリッ
(今までの私がんばってた!えらい!)

スコアの減算もReactivePropertyの値を減算するだけで自動的に反映されます。

ただシーン情報をdynamic_castで取得していたり、
スコア管理をシーンが持っているのは
設計的にどうなのかと思ってはいます( ´・ω・`)

ただここ数週間ずっとあーでもないこーでもないと悩んだ結果

どうせ後で作り直すんだしまずは実装しようぜ!

という考えに至り、設計が甘いままですが実装しました。
(悩み続けてもいい設計なんてできないし
未熟者の自分は考えながら手を動かさないとね)

それでは今回はこの辺でノシ

今回作ったものはgithubに上げました。
github.com