アクションゲームの投擲
今回はアクションゲームの投擲処理です。
物理法則に従って物を投げるとどういう軌跡を描くかを実装します。
今回もサンプルを用意しました。
ソースコード
// 初期化
if (!flg_init) {
// 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);
}
// sp thetaはテキストボックス入力
// x,y
var x:Number = 0;
var y:Number = 0;
// フレームレート
var fr:Number = 60;
// 重力加速度(px/s^2)
var g:Number = -9.8 / fr;
// 速度を求める
var vx:Number = sp * val_cos[theta] / fr;
var vy:Number = sp * val_sin[theta] / fr;
// 弾の作成
var b:MovieClip = _root.attachMovie("bullet", "bullet", 1);
b._x = jiki._x;
b._y = jiki._y;
// 初期化フラグオン
flg_init = true;
}
// 弾が画面右or画面下を越えたらリセット
if (b._x > 307.5 || b._y > 307.5) {
flg_init = false;
_root.gotoAndPlay("stop");
}
else {
// 弾の移動
b._x += vx;
b._y -= vy;
// 重力加速度の反映
vy += g;
// 弾座標(分かりやすいように左下を原点とする)
x = b._x;
y = -(b._y - 300);
}
スタート画面では速さと投擲角度を入力します。
数字の上で左クリックすると入力できるようになります。
速さは1~999(px/s)、投擲角度は0~90(度)までの値を入力できます。
入力し終えたらSTARTの上で左クリックすると動作を開始します。物体が画面右か画面下に達するとリセットされます。
このプログラムでは無風状態で、重力加速度(-9.8px/s)が存在すると仮定しています。
入力した速さと投擲角度からこの条件下での速度を算出します。
// 速度(vx,vy)
vx = 速さ * cos(ラジアン) / フレームレート;
vy = 速さ * sin(ラジアン) / フレームレート - (重力加速度 / フレームレート);
フレーム毎の速度を算出するので、フレームレートで割るのを忘れないようにしないといけません。
またvyには重力加速度が掛かりますので、フレーム毎に速度を引く必要があります。
座標の関係上ソースコードでは和算しています。
この処理を行うことで、ハイパーオリンピック@FCの槍投げや幅跳びなどを実装できます。
また角度や速さをランダムに入力することでスーパーマリオブラザーズ@FCのハンマーブロスの実装ができます。