Flashゲーム講座 & アクションスクリプトサンプル集



直線で一定の速度で狙撃する動き

 

サンプルをダウンロード
 


 
一番簡単で基本的な狙撃方法です。ターゲットに対して一定の速度で直線で飛ぶ弾を飛ばして攻撃します。
 
この動きを表現するために必要なパラメータ
  • 弾のスピード(直線)
初期データ

	speed = 3;	// スピード
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
ターゲットと自分の座標との角度を求めて、弾のスピードと角度でx方向とy方向の移動量に割り振ります。 計算の詳細はここを参照。

 移動量計算

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);
    
    dx = Math.cos(rad) * speed;	// x方向の移動量を計算
    dy = Math.sin(rad) * speed;	// y方向の移動量を計算
_root.targetはターゲットのMC
 
2.ループ処理部分

移動量を座標に足しこみ続けます。
 
 ループ処理

    _x += dx;
    _y += dy;    
 
 
まとめて記述すると以下の通りになります。
 直線で一定の速度で狙撃する動き

onClipEvent (load) {

    speed = 3;	// 弾の移動スピード
    
    _x = _root.player._x;	// 初期x座標
    _y = _root.player._y;	// 初期y座標

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);

    dx = Math.cos(rad) * speed;	// x方向の移動量を計算
    dy = Math.sin(rad) * speed;	// y方向の移動量を計算  
       
}

onClipEvent (enterFrame) {

    _x += dx;
    _y += dy;
    
}

 
 




直線で一定の速度で狙撃する動き

 

サンプルをダウンロード
 


 
上のサンプルの改造で弾を複数放射状に出します。
 
この動きを表現するために必要なパラメータ
  • 弾のスピード(直線)
  • 弾を同時に出す数
  • 弾を出す幅(角度)
初期データ

	speed = 3;	// スピード
	num = 5;
	w = 60;
 
基本的な動きは上のサンプルと同じなので角度を割り振り方だけ説明します。

 角度の割り振り方

    for(i=0;i < num;i++){
        tmp = ((num - 1) - i) / (num - 1);	// 0.0~1.0に丸める
	tmp -= 0.5;	// -0.5~0.5にする
    	rot = tmp * w;	// 角度を求める
    }
 
 
 




ターゲットを追尾する動き

 

サンプルをダウンロード
 


 
追尾する動きです。ターゲットに対して近づくように少しずつ向きを合わせます。
 
この動きを表現するために必要なパラメータ
  • 弾のスピード(直線)
  • 弾の回転スピード
初期データ

	speed = 3;	// スピード
	RotSpeed = 3;	// 弾の回転スピード
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
ターゲットと弾の座標との角度を求めて弾を回転させます。 計算の詳細はここを参照。

 移動量計算

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);

    rot = rad * 180 / Math.PI;	// ラジアンから角度に変換
    _rotation = rot;		// 回転
_root.targetはターゲットのMC
 
2.ループ処理部分

ターゲットと弾の座標との角度を求めて現在弾が向いているの角度と比較します。 左回りに近ければ左に少し回転し右回りに近ければ右に少し回転します。
 
 ループ処理(回転を計算)

    
    // 的と弾の角度
    rad = Math.atan2(_root.target._y - _y, _root.target._x - _x);
	
    rot = rad * 180 / Math.PI;	// ラジアンに変換

    // 角度を丸める
    if (_rotation - 180 > rot) {
        rot += 360;
    }
    if (_rotation + 180 < rot) {
        rot -= 360;
    }

    // 現在の角度と比較して近い方に少し回転
    if (_rotation - rot > RotSpeed) {
        _rotation -= RotSpeed;
    } else if (_rotation - rot < -RotSpeed) {
        _rotation += RotSpeed;
    } else {
        _rotation = rot;
    }
    
 
現在の角度とスピードとでx方向とy方向の移動量を計算して座標に足しこみます。
 
 ループ処理(移動量計算)

    // 的と弾の角度
    rad2 = _rotation * Math.PI / 180;
   
    // 移動量を計算
    dx = Math.cos(rad2) * speed;
    dy = Math.sin(rad2) * speed;
 
    _x += dx;
    _y += dy;	
    
 
 
まとめて記述すると以下の通りになります。
ターゲットを追尾する動き

onClipEvent (load) {
  
    speed = 3;	// スピード
    RotSpeed = 3;	// 弾の回転スピード

    this._x = _root.player._x;
    this._y = _root.player._y;

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);

    rot = rad * Math.PI / 180;	// ラジアンから角度に変換
    _rotation = rot;		// 回転

 
       
}

onClipEvent (enterFrame) {

    // 的と弾の角度
    rad = Math.atan2(_root.target._y - _y, _root.target._x - _x);
	
    rot = rad * 180 / Math.PI;	// ラジアンに変換

    // 角度を丸める
    if (_rotation - 180 > rot) {
        rot += 360;
    }
    if (_rotation + 180 < rot) {
        rot -= 360;
    }

    // 現在の角度と比較して近い方に少し回転
    if (_rotation - rot > RotSpeed) {
        _rotation -= RotSpeed;
    } else if (_rotation - rot < -RotSpeed) {
        _rotation += RotSpeed;
    } else {
        _rotation = rot;
    }  

    // 的と弾の角度
    rad2 = _rotation * Math.PI / 180;
   
    // 移動量を計算
    dx = Math.cos(rad2) * speed;
    dy = Math.sin(rad2) * speed;
 
    _x += dx;
    _y += dy;
    
}

 
 




ターゲットを追尾する動き(加速付き)

 

サンプルをダウンロード
 


 
ターゲットをに向かうように飛びます。スピードと回転スピードが加速するように修正した物です。
 
この動きを表現するために必要なパラメータ
  • 弾の回転加速度
  • 弾の最高回転スピード
初期データ

	aRotSpeed = 0.1;	// 弾の回転加速度
	RotSpeedMax = 5;	// 弾の最高回転速度
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
ターゲットと弾の座標との角度を求めて弾を回転させます。 計算の詳細はここを参照。

 移動量計算

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);

    rot = rad * 180 / Math.PI;	// ラジアンから角度に変換
    _rotation = rot;		// 回転
_root.targetはターゲットのMC
 
その他の初期化です。

 移動量計算

    RotSpeed = 0;	// 回転速度
    Speed = 1;		// スピード
 
2.ループ処理部分

ターゲットと弾の座標との角度を求めて現在弾が向いているの角度と比較します。 左回りに近ければ左に少し回転し右回りに近ければ右に回転速度を加減算します。 その後、角度に回転速度を足しこみます。
 
 ループ処理(回転を計算)

    
    // 的と弾の角度
    rad = Math.atan2(_root.target._y - _y, _root.target._x - _x);
	
    rot = rad * 180 / Math.PI;	// ラジアンに変換

    // 角度を丸める
    if (_rotation - 180 > rot) {
        rot += 360;
    }
    if (_rotation + 180 < rot) {
        rot -= 360;
    }

    // 現在の角度と比較して近い方に少し回転
    if (_rotation - rot > RotSpeedMax) {
        RotSpeed -= aRotSpeed;
    } else if (_rotation - rot < -RotSpeedMax) {
        RotSpeed += aRotSpeed;
    } else {
    	RotSpeed *= 0.5;	// 減速
    }
    
    // 回転速度のリミッタ
    if (RotSpeed > RotSpeedMax)	RotSpeed = RotSpeedMax;
    if (-RotSpeed < -RotSpeedMax)	RotSpeed = RotSpeedMax;
  
    // 角度に回転速度を加算  
    _rotation += RotSpeed;
 
弾のスピードを増やします。
 
 ループ処理(スピードを計算)

    speed *= 1.05;	// スピードを加速

 
現在の角度とスピードとでx方向とy方向の移動量を計算して座標に足しこみます。
 
 ループ処理(移動量計算)

    // 的と弾の角度
    rad2 = _rotation * Math.PI / 180;
   
    // 移動量を計算
    dx = Math.cos(rad2) * speed;
    dy = Math.sin(rad2) * speed;
 
    _x += dx;
    _y += dy;	
    
 
 
まとめて記述すると以下の通りになります。
ターゲットを追尾する動き(加速付き)

onClipEvent (load) {
  
    aRotSpeed = 0.1;	// 弾の回転加速度
    RotSpeedMax = 5;	// 弾の最高回転速度

    this._x = _root.player._x;
    this._y = _root.player._y;

    // ターゲットとのラジアンを求める
    rad = Math.atan2(_root.target._y - _y,_root.target._x - _x);

    rot = rad * 180 / Math.PI;	// ラジアンから角度に変換
    _rotation = rot;		// 回転
    
    RotSpeed = 0;	// 回転速度
    Speed = 1;		// スピード
       
}

onClipEvent (enterFrame) {
   
    // 的と弾の角度
    rad = Math.atan2(_root.target._y - _y, _root.target._x - _x);
	
    rot = rad * 180 / Math.PI;	// ラジアンに変換

    // 角度を丸める
    if (_rotation - 180 > rot) {
        rot += 360;
    }
    if (_rotation + 180 < rot) {
        rot -= 360;
    }

    // 現在の角度と比較して近い方に少し回転
    if (_rotation - rot > RotSpeedMax) {
        RotSpeed -= aRotSpeed;
    } else if (_rotation - rot < -RotSpeedMax) {
        RotSpeed += aRotSpeed;
    } else {
    	RotSpeed *= 0.5;	// 減速
    }
    
    // 回転速度のリミッタ
    if (RotSpeed > RotSpeedMax)	RotSpeed = RotSpeedMax;
    if (-RotSpeed < -RotSpeedMax)	RotSpeed = RotSpeedMax;
  
    // 角度に回転速度を加算  
    _rotation += RotSpeed;

    speed *= 1.05;	// スピードを加速

    // 的と弾の角度
    rad2 = _rotation * Math.PI / 180;
   
    // 移動量を計算
    dx = Math.cos(rad2) * speed;
    dy = Math.sin(rad2) * speed;
 
    _x += dx;
    _y += dy;
    
}

 
 




放物線で狙撃する動き(時間固定)

 

サンプルをダウンロード
 


 
放物線を描きながらターゲットを通る動きを計算します。ここでは、あらかじめターゲットまでに到達する時間を設定してから計算します。
 
この動きを表現するために必要なパラメータ
  • 到達するまでの時間
  • Flashのフレームレート
  • 重力加速度
  • 微分
初期データ

	t = 2;	// 弾がターゲットに到達するまでの時間(単位秒)
	fps = 60;	// フレームレート
	g = 9.8;	// 重力加速度
	dt = 0.05;	// 微分(動きをゆっくりにするため)

	frame = t * fps;	// 到達時間を秒からフレーム数に変換
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
x方向の移動量を計算します。

 x方向移動量計算

    // x方向のターゲットとの距離
    subx = _root.target._x - _x;
    
    // x方向移動量
    dx = subx / frame;
_root.targetはターゲットのMC
 
y方向の移動量を計算します。

 移動量計算

    // y方向のターゲットとの距離
    suby = _root.target._y - _y;

    // y方向の移動量
    dy = suby - (0.5 * frame * frame * g * dt) / frame;
 
2.ループ処理部分

 
 ループ処理(移動量計算)

    // 移動量に重力加速度を足しこむ
    dy += g * dt;
 
    _x += dx;
    _y += dy;
    
 
 
まとめて記述すると以下の通りになります。
放物線で狙撃する動き(時間固定)

onClipEvent (load) {

    t = 2;	// 弾がターゲットに到達するまでの時間(単位秒)
    fps = 60;	// フレームレート
    g = 9.8;	// 重力加速度
    dt = 0.05;	// 微分(動きをゆっくりにするため)

    frame = t * fps;	// 到達時間を秒からフレーム数に変換

    this._x = _root.player._x;
    this._y = _root.player._y;

    // x方向のターゲットとの距離
    subx = _root.target._x - _x;
    
    // x方向移動量
    dx = subx / frame;

    // y方向のターゲットとの距離
    suby = _root.target._y - _y;

    // y方向の移動量
    dy = suby - (0.5 * frame * frame * g * dt) / frame;

}

onClipEvent (enterFrame) {
   
    dy += g * dt;
 
    _x += dx;
    _y += dy;

}

 
 




放物線で狙撃する動き(角度固定)

 

サンプルをダウンロード
 


 
放物線を描きながらターゲットを通る動きを計算します。ここでは、あらかじめ発射角度を設定してから計算します。
 
この動きを表現するために必要なパラメータ
  • 発射角度
  • 重力加速度
  • 微分
初期データ

	rot = -45;	// 弾を発射する角度
	g = 9.8;	// 重力加速度
	dt = 0.05;	// 微分(動きをゆっくりにするため)
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
到達時間を計算します。到達時間と初速スピードが不明なので連立方程式を立てて計算します。
speed * cosθ = (_root.target._x - _x) / t;
speed * sinθ = ((_root.target._y - _y) - 0.5 * t * t * g) / t;
 
 到達時間

    // 角度からラジアンに変換
    rad = rot * Math.PI / 180;
    
    // x方向のターゲットとの距離
    subx = _root.target._x - _x;
 
    // y方向のターゲットとの距離
    suby = _root.target._y - _y;
   
    // 到達時間を求める
    t = -(2 * subx * Math.sin(rad)) / (Math.cos(rad)*_root.g
* _root.dt) + (2 * suby / (_root.g * _root.dt)); t = Math.sqrt(Math.abs(t));
_root.targetはターゲットのMC
 
x方向とy方向の移動量を計算します。

 移動量計算

    dx = subx / t;	// x方向の移動量を求める
    dy = dx / Math.cos(rad) * Math.sin(rad);	// y方向の移動量を求める
 
2.ループ処理部分

 
 ループ処理(移動量計算)

    // 移動量に重力加速度を足しこむ
    dy += g * dt;
 
    _x += dx;
    _y += dy;
    
 
 
まとめて記述すると以下の通りになります。
放物線で狙撃する動き(角度固定)

onClipEvent (load) {
   
    rot = -45;	// 弾を発射する角度
    g = 9.8;	// 重力加速度
    dt = 0.05;	// 微分(動きをゆっくりにするため)

    this._x = _root.player._x;
    this._y = _root.player._y;

    // 角度からラジアンに変換
    rad = rot * Math.PI / 180;
    
    // x方向のターゲットとの距離
    subx = _root.target._x - _x;
 
    // y方向のターゲットとの距離
    suby = _root.target._y - _y;
   
    // 到達時間を求める
    t = -(2 * subx * Math.sin(rad)) / (Math.cos(rad)*_root.g
* _root.dt) + (2 * suby / (_root.g * _root.dt)); t = Math.sqrt(Math.abs(t)); dx = subx / t; // x方向の移動量を求める dy = dx / Math.cos(rad) * Math.sin(rad); // y方向の移動量を求める } onClipEvent (enterFrame) { dy += g * dt; _x += dx; _y += dy; }
 
 




放物線で狙撃する動き(x方向のみ速度固定)

 

サンプルをダウンロード
 


 
放物線を描きながらターゲットを通る動きを計算します。ここでは、x方向の速度を設定してから計算します。
 
この動きを表現するために必要なパラメータ
  • x方向速度
  • 重力加速度
  • 微分
初期データ

	dx = 5;		// 弾を発射する角度
	g = 9.8;		// 重力加速度
	dt = 0.05;	// 微分(動きをゆっくりにするため)
 
1.初期設定

発射位置の座標をセットして弾の発射位置を決めます。

 初期位置セット

    this._x = _root.player._x;
    this._y = _root.player._y;
_root.playerは弾を発射するMC
 
x方向の移動量と距離から到達時間(フレーム数)を求めます。
 
 到達時間

    // x方向のターゲットとの距離
    subx = _root.target._x - _x;

    // 到達時間(フレーム)
    t = subx / dx;
_root.targetはターゲットのMC
 
到達時間からy方向の移動量を計算します。

 移動量計算

    // y方向のターゲットとの距離
    suby = _root.target._y - _y;
    
    // y方向の移動量を求める
    dy = (suby - 0.5 * t * t * _root.g * _root.dt) / t;
 
2.ループ処理部分

 
 ループ処理(移動量計算)

    // 移動量に重力加速度を足しこむ
    dy += g * dt;
 
    _x += dx;
    _y += dy;
    
 
 
まとめて記述すると以下の通りになります。
放物線で狙撃する動き(x方向のみ速度固定)

onClipEvent (load) {
   
    dx = 5;	// 弾を発射する角度
    g = 9.8;	// 重力加速度
    dt = 0.05;	// 微分(動きをゆっくりにするため)

    this._x = _root.player._x;
    this._y = _root.player._y;

    // x方向のターゲットとの距離
    subx = _root.target._x - _x;

    // 到達時間(フレーム)
    t = subx / dx;

    // y方向のターゲットとの距離
    suby = _root.target._y - _y;
    
    // y方向の移動量を求める
    dy = (suby - 0.5 * t * t * _root.g * _root.dt) / t;

}

onClipEvent (enterFrame) {
   
    dy += g * dt;
 
    _x += dx;
    _y += dy;

}