はかせのラボ

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

DirectX コンボ実装

あいさつ

どうも、はかせです。
今回はコンボ実装と細かな修正追加です。

コンボ

弾幕シューティングには大体連続で敵を倒すとスコアにボーナスがつくものが多いと思います。
そんなわけで実装したいと思います。

実装

今回は一定時間内に敵を撃破するとコンボが加算され、
途切れた際にコンボ中に倒した敵のスコアがそのまま上乗せされるという
よくある感じのものを作ります。

コンボのトリガーですが、
スコア加算をトリガーとしています。
(今現状では敵を倒す以外にスコア変動がないため)

void AddScore(double score)
{ 
	if(mIsCombo)
	{
		mComboScore += score;
		mComboCountFrame = 0;
	}
	else mIsCombo = true;
	*mScoreRP + score; 
}

スコア加算メソッドの中でコンボ中か判定し
コンボ中であればコンボボーナスにスコアを加算し経過フレームをリセット、
コンボ中でなければコンボフラグを立てます。

コンボ中の処理ですが、
①経過フレームをカウント
②経過フレーム数が一定値いないか判定
 (コンボ継続判定)
③コンボ終了時にボーナススコアをスコアに加算

という処理をしています。

void PlayScene::ComboAction()
{
	//コンボ中でなければ処理をしない
	if (!mIsCombo) return;
	//経過フレームカウント
	mComboCountFrame++;
	//一定フレーム以上経過したら
	if(mComboCountFrame > COMBO_LIMIT_FRAME)
	{
		mIsCombo = false;
		*mScoreRP + mComboScore;
		mComboCountFrame = 0;
	}
}

アイテム移動

今までアイテムは出現した位置に固定されていました。
固定されているアイテムもあると思いますが、
動くアイテムもあると思います。

なのでアイテムを動かすコンポーネントを作りました。
やってることはほとんど弾と同じで
移動するベクトルが下方向に固定されています。

void ItemMover::Initialize(DXGameObject * gameObject)
{
	mGameObject = gameObject;
	mDXCamera = mGameObject->GetDXCamera();
	mId = mGameObject->GetID();
	mTag = mGameObject->GetTag();
	mMoveSpeed = 0.02f;
}

void ItemMover::Update()
{
	auto transform = mGameObject->GetTransform();
	transform->Position.y -= mMoveSpeed;
	//スクリーン座標取得
	auto screenPos = mDXCamera->WorldToScreenPoint(transform);
	//返ってきた行列の中から座標を取得
	auto screenPosX = screenPos.m128_f32[0];
	auto screenPosY = screenPos.m128_f32[1];
	//画面中央はcHeight / 2
	//画面外に出たら
	if (screenPosY < -cHeight / 2)
	{
		mGameObject->SetEnable(false);
	}
	if (screenPosY > cHeight + cHeight / 2)
	{
		mGameObject->SetEnable(false);
	}
	if (screenPosX < -cWidth / 2)
	{
		mGameObject->SetEnable(false);
	}
	if (screenPosX > cWidth + cWidth / 2)
	{
		mGameObject->SetEnable(false);
	}
}

実行結果

アイテム移動とコンボです。
f:id:hakase0274:20190115233710g:plain

デストラクタが呼ばれない問題

前回のあとがきの後でデストラクタが呼ばれない原因が
わからないという話をしました。

結果としては
呼ばれていたがVisualStudioのブレークポイントで止まらなかった
ということでした。

これはVisualStudioに昔からあるバグらしくデバッグ情報の形式を変更することで解決できました。
f:id:hakase0274:20190115232301p:plain

変更して実行したら無事止まってデストラクタが呼ばれていること、
ちゃんとメモリが解放されていることが確認できました。

あとがき

今回はコンボ実装+αでした。
徐々に良くなってはいるんですが
やっぱりエフェクトとか欲しくなりますね。

パーティクルとかポストプロセスとか入るだけで
ゲームのクオリティってぐっと上がりますからね。

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

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