ミサイルの向きを実装しました。
今回使った方法をザックリとですが説明します。
ミサイルの元の方向と自機方向のベクトルと合成して出来た新しい方向のベクトルは、その大きさで割って正規化(大きさ1のベクトルにすること)します。
ベクトルの大きさは三平方の定理で求められます。
(ベクトルのX成分の二乗とY成分の二乗を足した数の平方根(ルート) )
で、大きさ1のベクトルと言う事は、ありうる全ての方向にグルッと回すと半径1の円になります。
ベクトルの作用点を原点とした座標上で考えるとそれはつまり、ベクトルのX成分はcosの値を、Y成分はsinの値をとると言う事です。
今回はこのcos=X成分の値を使いました。
X成分は、 1 ~ -1 の範囲の数になります。
ベクトルとX軸の作る角度が0度のとき1となり、90度で0、180度で-1となります。
180度から360度までは逆に-1から0を通って1へと推移してゆきます。
で、使うグラフィックパターンは8方向なので、円を8分割します。
そうすると、それぞれの方向のグラフィックパターンがどの範囲の角度に入るのか決まります。
その基点となる角度のcosの値をゲームの初期化部分であらかじめ計算させて変数に入れておきます。

こんな感じ。
Y軸は画面座標にあわせて下がプラス方向になっています。
正規化したベクトルのX成分の値とこの変数の値を比較すると角度の範囲が2つ見つかります。
Yがプラス側(0~180度)とマイナス側(180~360度)の2つです。
あとはY成分が0より大きいかどうかを判断すればベクトルの向きが特定できます。
例えば、X成分の値がcos(22度)を入れた変数より小さくて、cos(68度)を入れた変数より大きく、かつY成分が0より小さければベクトルは右上方向のグラフィックを表示する範囲の角度にあると特定できます。
使うのはたった4つの角度のcos値ですし、三角関数の処理の負荷が大きいことを考えると、ゲームが始まる前にあらかじめ4つのcos値を計算して変数に入れておいた方がより高速なアルゴリズムになります。

しっかり向きを変えながら自機を追ってきます。
今回のアルゴリズムで最大の発見は、あらかじめ三角関数を計算して変数に入れておくという部分かと思います。
もっと早く思いついていれば他の敵のアルゴリズムももっと高速に作れたと思います。
作り直すつもりはありませんが(笑)
っていうか、それほど厳密な値が必要なければ360度を例えば10度ずつ36等分した時のsin、cosを先に配列変数に入れておいて、プログラム上0~360度を0~36度として使用すれば、三角関数使い放題でアルゴリズムを書いても普通の変数のやり取り(計算や比較)と同じ負荷ですみますね。
これならそうとう遅いCPUでも楽々動くでしょう。
PCエンジンとか昔の8bitゲーム機でR-TYPEなんかのシューティングゲームがちゃんと動いていた秘密の一つを見付けた気分です。
今回使った方法をザックリとですが説明します。
ミサイルの元の方向と自機方向のベクトルと合成して出来た新しい方向のベクトルは、その大きさで割って正規化(大きさ1のベクトルにすること)します。
ベクトルの大きさは三平方の定理で求められます。
(ベクトルのX成分の二乗とY成分の二乗を足した数の平方根(ルート) )
で、大きさ1のベクトルと言う事は、ありうる全ての方向にグルッと回すと半径1の円になります。
ベクトルの作用点を原点とした座標上で考えるとそれはつまり、ベクトルのX成分はcosの値を、Y成分はsinの値をとると言う事です。
今回はこのcos=X成分の値を使いました。
X成分は、 1 ~ -1 の範囲の数になります。
ベクトルとX軸の作る角度が0度のとき1となり、90度で0、180度で-1となります。
180度から360度までは逆に-1から0を通って1へと推移してゆきます。
で、使うグラフィックパターンは8方向なので、円を8分割します。
そうすると、それぞれの方向のグラフィックパターンがどの範囲の角度に入るのか決まります。
その基点となる角度のcosの値をゲームの初期化部分であらかじめ計算させて変数に入れておきます。
こんな感じ。
Y軸は画面座標にあわせて下がプラス方向になっています。
正規化したベクトルのX成分の値とこの変数の値を比較すると角度の範囲が2つ見つかります。
Yがプラス側(0~180度)とマイナス側(180~360度)の2つです。
あとはY成分が0より大きいかどうかを判断すればベクトルの向きが特定できます。
例えば、X成分の値がcos(22度)を入れた変数より小さくて、cos(68度)を入れた変数より大きく、かつY成分が0より小さければベクトルは右上方向のグラフィックを表示する範囲の角度にあると特定できます。
使うのはたった4つの角度のcos値ですし、三角関数の処理の負荷が大きいことを考えると、ゲームが始まる前にあらかじめ4つのcos値を計算して変数に入れておいた方がより高速なアルゴリズムになります。
しっかり向きを変えながら自機を追ってきます。
今回のアルゴリズムで最大の発見は、あらかじめ三角関数を計算して変数に入れておくという部分かと思います。
もっと早く思いついていれば他の敵のアルゴリズムももっと高速に作れたと思います。
作り直すつもりはありませんが(笑)
っていうか、それほど厳密な値が必要なければ360度を例えば10度ずつ36等分した時のsin、cosを先に配列変数に入れておいて、プログラム上0~360度を0~36度として使用すれば、三角関数使い放題でアルゴリズムを書いても普通の変数のやり取り(計算や比較)と同じ負荷ですみますね。
これならそうとう遅いCPUでも楽々動くでしょう。
PCエンジンとか昔の8bitゲーム機でR-TYPEなんかのシューティングゲームがちゃんと動いていた秘密の一つを見付けた気分です。
PR
この記事にコメントする
- ABOUT
やってやれないことはないっ!たぶん・・・
- カレンダー
04 | 2025/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
50
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析