はかせのラボ

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

DirectX ボスの死亡時エフェクトつけてみた ~ランダムな位置にエフェクトを出す~

あいさつ

どうも、はかせです。
今回はボスの死亡時エフェクトをつけてみました。

死亡時エフェクト

まずはどういう感じのエフェクトを付けたかです。
f:id:hakase0274:20190124221421g:plain
死んだらボスを中心に小爆破エフェクトをランダムな配置で生成し、
最後に大爆破エフェクトを生成しています。

乱数生成

爆破エフェクトに関しては前回までで出来ていたので
特に書きません。

今回やったことで書くのは乱数生成です。
無作為に作るだけならrand()で済みますが
あまりに遠いところに作られても困るので
一定範囲内で乱数を出します。

float BossEnemy::GetRangeRand(float minValue, float maxValue)
{
	//シード値乱数生成器
	std::random_device rnd;
	//メルセンヌ・ツイスタ方を使って乱数を作る
	std::mt19937_64 mt64(rnd());
	//範囲内の離散分布を作る
	std::uniform_real_distribution<float> genRandFloat(minValue, maxValue);
	//分布の中から生成した乱数を使って1つだけ値を取り出す
	return genRandFloat(mt64);
}

ググったらよくみるやつですね。
std::random_deviceは予測不能な乱数を生成してくれます。
これで作った値を疑似乱数列生成クラスやメソッドの
シード値としてわたすことで
本当のランダムに限りなく近い乱数を得ることが出来るそうです。

今回疑似乱数列生成にはstd::mt19937_64を使っています。
これはメルセンヌ・ツイスタ方なるものを使って乱数を作ります。
詳しくはこちらで。

これで乱数はできました。
ただこの乱数には範囲がありません。
なのでstd::uniform_real_distributionを使います。
これは等確率の離散分布を作ってくれます。
あとはこの分布からさっき作った乱数を使って
値を取り出します。

これで指定範囲内での乱数生成完了です。

あとがき

今回は爆破エフェクト作成で使った乱数周りをまとめました。
(多分これは今後色んな所でもお世話になると思ったので)

そして明日1/25からは以前書いたGGJです。
hakase0274.hatenablog.com

今回何やら参加人数がとても多いらしいです。
全力で楽しんできます!
まぁ私用で初日はちょっと遅刻しちゃうんですけどねw

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

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