シューティングゲームの角度指定弾発射
今回は角度指定の弾発射です。
角度を指定して移動させるので、三角関数を使用します。
単位円におけるX軸の算出にはcos、Y軸の算出にはsinで出来ます。
当然ですが、弾の移動に限ったことではありませんので色々な場面で使用します。
速度の算出は以下のようになります。
// 速度vx,vy
vx = Math.cos(角度 * Math.PI / 180);
vy = Math.sin(角度 * Math.PI / 180);
一般的なプログラミング言語に実装されている数学ライブラリでは角度の単位はラジアンを使用しますので(円周率 / 180)を乗算しています。
今回もサンプルプログラムを用意しました。数値は角度を表しています。
サンプル※要FlashPlayer
デカルト座標系で標準位置はX軸方向が0度となりますので、画面で見ると右方向になります。
時計方向とは逆方向に角度は増加していきます。
ソースコード
// 初期化
if (!flg_init) {
// ループ変数
var i:Number;
// sinを設定
var val_sin:Array = new Array();
for (i = 0; i <= 360; i++) {
val_sin[i] = Math.sin(i * Math.PI / 180);
}
// cosを設定
var val_cos:Array = new Array();
for (i = 0; i <= 360; i++) {
val_cos[i] = Math.cos(i * Math.PI / 180);
}
// 弾を生成
_root.attachMovie("bullet", "tama", 1);
tama._x = jiki._x;
tama._y = jiki._y;
// 弾スピード初期設定
var sp:Number = 9;
// 弾の発射角度設定
var theta:Number = 0;
// 速度を設定
var vx:Number = val_cos[theta] * sp;
var vy:Number = -val_sin[theta] * sp;
// 初期化フラグオン
flg_init = true;
}
// 弾が画面内になければ生成
if (tama._x < 0 || tama._x > 300 || tama._y < 0 || tama._y > 300) {
// 弾を削除
tama.removeMovieClip();
// 角度をランダムで増加
if ((theta += int(Math.random() * 5) + 1) > 359) {
theta = 0;
}
// 弾を生成
_root.attachMovie("bullet", "tama", 1);
tama._x = jiki._x;
tama._y = jiki._y;
// 速度を設定
vx = val_cos[theta] * sp;
vy = -val_sin[theta] * sp;
}
else {
tama._x += vx;
tama._y += vy;
}
Y軸はゲーム座標だと下がプラス方向になりますので、デカルト座標系の値に変換するために符号を逆転しています。
またsin,cos,tan関数はオーバーヘッドをなくすために最初に配列を作成しておくと便利です。