シューティングゲームの3-WAY弾
前回は角度指定の弾の発射を行いましたので、今回はそれの応用編として3-WAY弾の発射を行います。
要は角度指定弾を3つ同時に発射すればいいだけです。
以下にサンプルプログラムを示します。
サンプル※要FlashPlayer
角度を変えて同時に処理する弾の数を増やせば、N-WAY弾の処理が出来ます。
ただ同じ処理を行うのであればクラスを作成した方が色々と便利です。
Bullet.as
// 弾クラス
class Bullet
{
// 弾MC
public var mc:MovieClip;
// 速度
private var vx:Number;
private var vy:Number;
// 消失フラグ
public var flg_vanish:Boolean;
// コンストラクタ
public function Bullet(deps:Number)
{
// 弾インスタンスを作成
this.mc = _root.attachMovie("bullet", "bullet" + deps, deps);
// 消失フラグオフ
this.flg_vanish = false;
}
// 速度設定
public function SetVel(vx:Number, vy:Number)
{
this.vx = vx;
this.vy = vy;
}
// 移動処理
public function Move()
{
this.mc._x += this.vx;
this.mc._y += this.vy;
}
}
Flash8で作成しているのでAS2.0文法です。
クラスにまとめて配列に突っ込むとループ内でアクセスするのに便利です。
ソースコード(本体)
// 初期化
if (!flg_init) {
// 弾クラスをimport
import Bullet;
// ループ変数
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);
}
// 弾スピード設定
var sp:Number = 9;
// 弾を生成
var ar_bullet:Array = new Array();
for (i = 0; i < 3; i++) {
ar_bullet[i] = new Bullet(i);
// 初期位置を設定
ar_bullet[i].mc._x = jiki._x;
ar_bullet[i].mc._y = jiki._y;
// 速度を設定
ar_bullet[i].vx = val_cos[75 + i * 15] * sp;
ar_bullet[i].vy = -val_sin[75 + i * 15] * sp;
}
// 初期化フラグオン
flg_init = true;
}
// 弾判定
for (i = 0; i < 3; i++) {
if (ar_bullet[i].mc._x < 0 || ar_bullet[i].mc._x > 300 || ar_bullet[i].mc._y < 0 || ar_bullet[i].mc._y > 300) {
// 消失フラグオン
ar_bullet[i].flg_vanish = true;
}
if (!ar_bullet[i].flg_vanish) {
ar_bullet[i].Move();
}
}
// 3つとも消失したら弾の位置を初期化
if (ar_bullet[0].flg_vanish && ar_bullet[1].flg_vanish && ar_bullet[2].flg_vanish) {
for (i = 0; i < 3; i++) {
ar_bullet[i].mc._x = jiki._x;
ar_bullet[i].mc._y = jiki._y;
ar_bullet[i].flg_vanish = false;
}
}
常に同時に発射するために、3つの弾が消失するまで初期化を待っています。
同期を図るかどうかは仕様によります。