はかせのラボ

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

DirectX 弾幕の初めの一歩を踏み出しました

あいさつ

最近少しずつ物が出来てきててモチベが上がってるはかせです。
今回は全方向へ弾を飛ばすという弾幕作りの最初の一歩ができたので
それについて書きます。

ベクトルのお話

弾幕実装の前にベクトルについて軽く書きたいと思います。
(備忘録もかねて)

簡単に言うとある点からある点までの向きと大きさを表すものです。
例えば自機を狙う敵の弾のベクトルは下図のようになります。
f:id:hakase0274:20181114193530p:plain

あとはこのベクトルを弾に渡してやれば次のフレームには
プレイヤーに当たる必殺弾の出来上がりですw

・・・

さすがにそれじゃゲームにならないので弾を弱くします。
要は次のフレームでプレイヤーに届いちゃうのが問題なので
弾を遅くします。

ベクトルには向きそのままに大きさを1にする正規化というものがあります。
これはそのベクトルをそのベクトルの大きさで割ればできます。
ベクトルの大きさは三平方の定理で分かります。
f:id:hakase0274:20181114194554p:plain

これで正規化に必要な情報は出そろい正規化できるようになりました。
あとは正規化したものに適当な弾速をかけてあげれば
それなりの速度で向かってくる弾の出来上がりです。

次にベクトルの向きを変えてみます。
f:id:hakase0274:20181114201240p:plain

式です。
x' = x * cosθ - y * sinθ
y' = x * sinθ + y * cosθ

この式のθの値を変えたい角度にすればその角度に曲がります。
θは度数法ではなく弧度法です。
詳しく知りたい人はググってください。
詳しくなくてもいいという人はとりあえず変えたい角度に
acos(-1.0) / 180をかけてあげてください。それでおkです。
例えば、30度曲げたければ θ = 30 * acos(-1.0) / 180 です。

弾幕実装

長々とベクトルの話をしてきましたがようやく弾幕の話です。
とはいえ、もうほとんど話終わっているんですけどねw
まずは動画です。
youtu.be


全方向へ打つということは何か適当なベクトルを一定間隔ごとに
曲げて打ってやれば全方向へ飛びます。

今回の私の例だと自機へ向かってくる弾を10度刻みでズラして
36個打っています。単純だけどなんかそれっぽく見えません?

今後の予定的な

ぶっちゃけ弾幕はベクトル計算さえできれば、
あとはどうにでもなる気がしてきました。
(ネットにたくさん計算式落ちてるしね)

ということでこれからは弾幕増やすのもそうですが
もっとゲームっぽくしたいなーと思ってます。
(音とかアニメーションとかスコアとか)

あと他にも私が残りの期間でできるかは不明ですが
(一応11月の間がこれの開発期間予定)
敵とか弾幕を別データにして管理しやすいようにしたいなー
とか妄想してます。

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