シューティングゲームの回転弾
今回のコラムは回転弾についてですが、STGに限ったものではありません。
オブジェクトの角度や位置を計算することはゲーム開発には必須だからです。
それでは回転運動を実装するにはどのようにすればよいのでしょうか。
サンプル
ソースコード
// 初期化
if (!flg_init) {
// モードフラグ
var flg_mode:Number = 0;
// 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);
}
// 円の半径を設定
var r:Number = 100;
// 角度を設定
var theta:Number = 0;
// 角度の変位
var p_theta:Number = 5;
// 速度
var vx:Number;
var vy:Number;
// 弾の作成
var b:MovieClip = _root.attachMovie("bullet", "bullet", 1);
b._x = jiki._x + r;
b._y = jiki._y;
// 初期化フラグオン
flg_init = true;
}
switch (flg_mode) {
case 0:
// 弾の位置を算出
theta = theta >= 360 ? 0 : theta + p_theta;
b._x = jiki._x + (r * val_cos[theta]);
b._y = jiki._y - (r * val_sin[theta]);
break;
case 1:
// 弾の速度を算出
vx = -r * (p_theta * (Math.PI / 180)) * val_sin[theta];
vy = r * (p_theta * (Math.PI / 180)) * val_cos[theta];
// 誤差対策
if (theta >= 360) {
b._x = jiki._x + r;
b._y = jiki._y;
theta = 0;
}
else {
b._x += vx;
b._y += vy;
theta += p_theta;
}
break;
default:
break;
}
最初に中心点を決定します。サンプルでは白丸の中心座標が中心点になっています。
次に回転運動をする円の半径を決めます。
ここから方法は2つあります。
弾の次フレーム座標を求めるか、弾の速度を求めるかです。
弾の次フレーム座標を求める場合
// x,yは現在の座標 rは半径
x = x + r * cos(角度);
y = y - r * sin(角度);
単位円の公式を考えれば理解出来ると思います。r=1と考えればそのままですね。
弾の速度を求める場合
// x,yは現在の座標 rは半径 p_thetaは角度の変位
vx = -r * (p_theta * (Math.PI / 180)) * sin(角度);
vy = r * (p_theta * (Math.PI / 180)) * cos(角度);
sinとcosがxとyで逆になっているのに気を付けて下さい。
これは角度の変位分のxが移動前の座標のyで、角度の変位分のyが移動前の座標のxとなっているからです。