はかせのラボ

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

DirectX アニメーション実装

あいさつ

今日も今日とて凍えながら作業をしているはかせです。
今回はアニメーションとちょっとした演出っぽいものを実装したお話です。

アニメーション

まずはいつも通り動画です。
今回は自機の後ろのほうと画面上部に注目です。
youtu.be

まずはアニメーションのほうから。
自機の後ろらへんに炎が出てて動いています。
これはパラパラアニメで動かしています。

あらかじめ複数の画像を順番通りに配列に格納し、
一定間隔ごとに画像を切り替えています。

//フレーム計測
mWaitFrameCount++;
//一定間隔ごとに処理
if(mWaitFrameCount % mTextureChangeCount == 0)
{
	mWaitFrameCount = 0;
   //いつぞや小ネタでやったループ
	mFileNumber = (++mFileNumber) % (int)mFileNameList.size();
   //表示画像を切り替える
	mAnimationTexture->SetTexture(mFileNameList[mFileNumber]);
}

こんな感じの実装です。
画像のセットさえちゃんとできれば大体パラパラアニメさせてくれます。
(一番むずかしいのは画像の用意なんですけどね・・・そこはできる人にお願いしましょうw)

ボス演出

今度は動画の上部でやっていた演出っぽいものの説明です。

switch (mState)
{
//ボス登場ステートの処理
case Entry:
	//ボスの体力バーが動く演出のため体力を増加させる
	if(mHitPoint + mDefaultHitPoint / 100.0 <= mDefaultHitPoint)
	{
		mHitPoint = mHitPoint + mDefaultHitPoint / 100.0;
	}
	else if(mHitPoint + mDefaultHitPoint / 100.0 > mDefaultHitPoint)
	{
		mHitPoint = mDefaultHitPoint;
	}
	//設定した開始位置に到達したら弾幕展開を開始する
	if(abs(mTransform->Position.x - mBattleStartPos.x) <= EPSILON)
	{
		if(abs(mTransform->Position.y - mBattleStartPos.y) <= EPSILON)
		{
			mCollider->SetEnable(true);
			mState = Battle;
			break;
		}
	}
	//画面外から開始位置へ移動
	mTransform->Position.x += mMoveVecX;
	mTransform->Position.y += mMoveVecY;
	break;
case Battle:
	//毎フレームカウントを行う
	mWaitCount++;
	//弾幕の発射間隔ごとに
	if (mBarrage->IsCoolTime(mWaitCount))
	{
		mWaitCount = 0;
		//弾幕を生成する
		mBarrage->CreateBarrage(mBulletPool, mPlayer, mGameObject);
		if (IsBarrageEnd())
		{
			ChangeBarrageName();
			mBarrage = mBarrageManager->GetBarrage(mBarrageName);
		}
	}
	break;
case BossDie:
	break;
default:
	break;
}

ボスのステートをつくりswitch文で処理を分岐させています。
演出っぽいものはcase Entryの部分です。

別にアニメーションとかそんな変わったことはせずに、
素直に体力を操作して体力バーを、座標を指定して移動をそれぞれ実装しています。

多分これもしっかり作ったアニメーション機構があればできるのでしょうが、
私の作った機構はパラパラアニメ専用なので無理なのです。
まぁそこまで苦労するものでもないですしいいかなと。

あとがき

一応予定では今週末の土日でこの開発は一区切りつけようと考えています。
なので金土日のあと3日で一体どこまで仕上げられるか、本当にラストスパートです。

来月からの予定は未定ですw
ただ少なくとも何かの開発はすると思います。

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

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