・概要

 「EXバスター」の処理の大半は、「バスター」と共通しているバスターを参照。

 ここでは、各種EXバスターにおける、特殊な挙動に関する処理を中心に解説する。

 なお、EXバスターは、エレメントゲージの消費があるため、ダメージを強めに設定している

・頻出する処理

・・バスターのタイプ

 「バスターのタイプ」に関しては、連鎖値、属性、攻撃の方向・角度の「・攻撃の方向による符号の補正」の「・・バスターの攻撃の方向」を参照。

ASのファイル:各種バスターのAS
 
zero_buster_type="persistent"	//バスターのタイプ(持続性)
 

・・バスターの消滅判定がない場合

 バスターの消滅判定がない場合にのみ行う処理バスターの消滅判定がない場合にのみ、「敵との接触判定」や「地形との接触判定」を取得する、などの目的で用いる。

ASのファイル:各種バスターのAS
 
if(zero_buster_vanish==0){	//バスターの消滅判定がない場合}
 

・・複数のhitrectにより構成されているバスター

 「複数のhitrectにより構成されているバスター」に関しては、敵との接触判定において、「複数のhitrectにより構成されたMCの接触判定」の処理を行う。接触判定の「・複数のhitrectにより構成されたMCの接触判定(2)」を参照。

↓複数のhitrectにより構成されているバスターの例。ベクトルレーザー(チャージ)。

・・「透明化」と「敵との接触判定」

 ある程度透明化した場合は、敵との接触判定を取得しない。

ASのファイル:各種バスターのAS
 
if(_parent._alpha>=20){	//ある程度透明化した場合,判定を取得しない}
 

・ベクトルレーザー(非チャージ)

・・概要

 このバスターは、通常のバスターの処理をベースにして、角度、速度、拡大・縮小、透明化などの処理が追加されている。

↓ベクトルレーザー(非チャージ)。

・・loadの処理

・・・バスターの方向(y方向)

 このバスターは、「loadの処理の時点で、上下キーのどちらの入力があるか」により、「バスターの方向(y方向)」が変化する

ASのファイル:zero_ex_buster_none_vector_laser_normal.txt
 
	if(_root.keydown_up==1){zero_buster_direction_y=1}	//バスターの方向(y方向)(1:上,-1:下)
	else{zero_buster_direction_y=-1}
 

・・・角度、速度

 「・・・バスターの方向(y方向)」において取得した値を用いて、角度と速度を計算する。

ASのファイル:zero_ex_buster_none_vector_laser_normal.txt
 
	if(zero_buster_direction==1){rotation_zero_buster=-10*zero_buster_direction_y}
	else{rotation_zero_buster=10*zero_buster_direction_y+180}
 
	velocity_zero_buster=9
	velocity_zero_buster_x=velocity_zero_buster*Math.cos((rotation_zero_buster/180)*Math.PI)
	velocity_zero_buster_y=velocity_zero_buster*Math.sin((rotation_zero_buster/180)*Math.PI)
 
	_parent._rotation=rotation_zero_buster	//回転
 

・・画面外消滅判定

 このバスターは、スケールが一定の値となるまでは、画面外で消滅しないようにしている。

ASのファイル:zero_ex_buster_none_vector_laser_normal.txt
 
		if(this.hitTest(_root.mask)==false and _parent._xscale>=100){_root.zero_buster_identify[number_zero_buster-1]="none";_parent.removeMovieClip()}	//出現判定をリセット,MCを削除(スケールが一定の値となるまでは判定を取得しない)
 

・・バスターの消滅

 バスターの消滅判定がない場合は、徐々に拡大する(上限は100%)。
 バスターの消滅判定がある場合は、減速・徐々に縮小(下限は0%)・徐々に透明化などの処理を行う。
 完全に透明化した場合、出現判定をリセットし、MCを削除する。

ASのファイル:zero_ex_buster_none_vector_laser_normal.txt
 
		if(zero_buster_vanish==0){	//バスターの消滅判定がない場合
			if(_parent._xscale<100){_parent._xscale+=5}	//スケール変化
		}
		else{	//バスターの消滅判定がある場合
			velocity_zero_buster_x*=0.5;velocity_zero_buster_y*=0.5//減速
			if(_parent._xscale>0){_parent._xscale-=5}	//スケール変化
			_parent._alpha-=10	//透明度の変化
			if(_parent._alpha<=0){
				_root.zero_buster_identify[number_zero_buster-1]="none";_parent.removeMovieClip()	//出現判定をリセット,MCを削除
			}
		}
 

 このような処理をすれば、わざわざ消滅用のエフェクトを作成しなくて済むので楽になる。

・分裂ソニック(非チャージ、出現用のMC)

・・概要

 ゼロは分裂ソニック(非チャージ)を直接発射するのではなく、「出現用のMC」を出現させる。
 このMCは、分裂ソニック(非チャージ)を2つ出現させる。そして、分裂ソニック(非チャージ)が2つとも消滅した場合は、自身も消滅する

↓分裂ソニック(非チャージ)。「出現用のMC」は灰色の矩形(実際のゲーム中は非表示にしている)。

・・loadの処理

・・・バスターの出現判定

 「上方向のソニック」と「下方向のソニック」を1フレーム差で出現させるために、このような判定を用いている。
 ソニックが同時に出現し、同時に敵にヒットすると、片方のダメージしか与えられないため、このような方式にしている(そもそも、「同時にヒットした場合の処理を、適切に構築すれば良い」ということではあるが…)。

ASのファイル:zero_ex_buster_thunder_separative_sonic_normal_appearance.txt
 
	count_zero_buster_appearance=0	//バスターの出現判定(バスターを出現させた個数)
 

・・上方向のソニックの出現

 「バスターの出現判定」が「0」の場合、上方向のソニックを出現させ、バスターの出現判定を変化させる。
 各種の情報伝達の解説に関しては省略する。

ASのファイル:zero_ex_buster_thunder_separative_sonic_normal_appearance.txt
 
	if(count_zero_buster_appearance==0){	//上方向のソニックの出現
		_root.board.attachMovie("zero_ex_buster_thunder_separative_sonic_normal",["zero_attack_"+_root.depth_zero_attack],_root.depth_zero_attack)	//バスターのMCを出現させる
︙
		count_zero_buster_appearance=1
	}
 

・・下方向のソニックの出現

 「バスターの出現判定」が「1」の場合、下方向のソニックを出現させる。
 「・・上方向のソニックの出現」とほぼ全く同様の処理なので、解説は省略する。

・・出現判定のリセット、MCの削除

 「バスターの出現判定」が「2」であり、出現させたバスターの両方が消滅した場合、出現判定をリセットして、MCを削除する

ASのファイル:zero_ex_buster_thunder_separative_sonic_normal_appearance.txt
 
	if(count_zero_buster_appearance==2 and _root.board["zero_attack_"+depth_zero_attack_1]==undefined and _root.board["zero_attack_"+depth_zero_attack_2]==undefined){	//出現させたバスターの両方が消滅した場合
		_root.zero_buster_identify[number_zero_buster-1]="none";_parent.removeMovieClip()	//出現判定をリセット,MCを削除
	}
 

・分裂ソニック(非チャージ)

・・概要

 「・分裂ソニック(非チャージ、出現用のMC)」において出現したバスターに関する処理を解説する。

・・loadの処理

・・・速度、方向(y方向)

 このバスターは、上・下の2種類ある。出現元のMCから伝達された「バスターの方向」の値に基づき、速度とスケール変化に関する処理を行う。

ASのファイル:zero_ex_buster_thunder_separative_sonic_normal.txt
 
	velocity_zero_buster_x=5.5*zero_buster_direction;velocity_zero_buster_y=-5.5*zero_buster_direction_y
︙
	_parent._xscale=100*zero_buster_direction	//スケール変化
	_parent._yscale=100*zero_buster_direction_y	//スケール変化
 

・伸縮バーナー(非チャージ)

・・概要

 このバスターは、移動せずに発射された位置に留まる。そして、徐々に透明化しつつ、x方向に拡大していく。

↓伸縮バーナー(非チャージ)。

・・loadの処理

・・・スケール変化

 スケール変化の加算値を設定している。

ASのファイル:zero_ex_buster_fire_elastic_burner_normal.txt
 
	add_xscale_zero_buster=15*zero_buster_direction
	add_yscale_zero_buster=20
 

・・スケール変化

 スケール変化の記述に関しては、以下の通りとなる。y方向は、特定の値を上回るか、下回った場合、スケール変化の符号を変化させている。

ASのファイル:zero_ex_buster_fire_elastic_burner_normal.txt
 
		_parent._xscale+=add_xscale_zero_buster;_parent._yscale+=add_yscale_zero_buster	//スケール変化
		if(_parent._yscale>=200 or _parent._yscale<=50){add_yscale_zero_buster*=-1}	//スケール変化の符号の変化
 

・氷柱&クリスタル(非チャージ)

・・概要

 このバスターは、出現時に、「バスターの前方における、最も近くにいる敵」を検出し、その敵の方向に速度が付加される。目標となる敵がいない場合には直進する。
 目標となり得るのは、「破壊された際にエネミーカウントが増加する敵」に限定している

↓氷柱&クリスタル(非チャージ)。

・・loadの処理

・・・目標となる敵の検出用の変数

 「・・目標となる敵の検出、速度の付加など」を参照。

ASのファイル:zero_ex_buster_ice_icicle_and_crystal_normal.txt
 
	enemy_x;enemy_y	//目標となる敵の位置
	distance_zero_buster_enemy_target	//目標となる敵との距離(二乗)
	distance_zero_buster_enemy	//敵との距離(二乗,検出用)
	distance_zero_buster_enemy_save=100000	//敵との距離(二乗,検出用)の保存用
	number_enemy=0	//目標となる敵の番号
 

 「敵との距離(二乗、検出用)の保存用」には、予め非常に大きな値を代入している。

・・・目標となる敵の検出、速度の付加など

 「・・目標となる敵の検出、速度の付加など」を参照。

・・目標となる敵の検出、速度の付加など

・・・目標となる敵の検出

 目標となる敵の検出に関しては、「ループ開始」→「エネミーカウントが増加する敵か否かの判定」→「前方にいる敵か否かの判定」→「敵との距離の算出」→「(暫定で)最も近くにいる敵か否かの判定」、をループの終値まで繰り返す処理を行う。そして、「最も近くにいる敵」の番号が保存される。
 「Math.pow()」に関する参考サイト(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)。

ASのファイル:zero_ex_buster_ice_icicle_and_crystal_normal_enemy_target.txt
 
for(i=1;i<=_root.i_enemy;i++){	//目標となる敵の検出用のループ
	enemy=_root.board["enemy_"+i]	//参照先を変数に保存
	if(enemy.enemy_hitrect.enemy_count_plus==1){	//エネミーカウントが増加する敵の場合
		if((zero_buster_direction==1 and _parent._x<enemy._x) or (zero_buster_direction==-1 and _parent._x>enemy._x)){	//前方にいる敵の場合
			distance_zero_buster_enemy=Math.pow(_parent._x-enemy._x,2)+Math.pow(_parent._y-enemy._y,2)	//敵との距離(二乗,検出用)を算出
			if(distance_zero_buster_enemy<distance_zero_buster_enemy_save){	//保存した値未満の場合
				distance_zero_buster_enemy_save=distance_zero_buster_enemy	//最小値として保存
				number_enemy=i	//目標となる敵の番号を保存
			}
		}
	}
}
 
・「for(i=1;i<=_root.i_enemy;i++)」:目標となる敵の検出用のループ。出現している敵の番号の最大値(=終値)まで繰り返されることになる。
・「enemy_count_plus」:「エネミーカウントが増加する敵」に関する値。の「・loadの処理」の「・・破壊、消滅関連」を参照。
・「zero_buster_direction==1 and _parent._x<enemy._x」:バスターの方向が右、かつ、敵の位置がバスターの位置より右という条件。左も同様の条件となる。
・「distance_zero_buster_enemy」:「敵との距離(二乗、検出用)」。正確な距離はこの値の平方根(√)となる。
・「distance_zero_buster_enemy<distance_zero_buster_enemy_save」:今まで算出した「敵との距離(二乗、検出用)」未満か否か(=(暫定で)最も近くにいる敵か否か)を判定する。
・「distance_zero_buster_enemy_save=distance_zero_buster_enemy」:新たに、「敵との距離(二乗、検出用)」の最小値として保存する。
・「number_enemy=i」:目標となる敵の番号(暫定)を保存する。

・・・目標となる敵がいない場合

 目標となる敵がいない場合は、直進させる。

ASのファイル:zero_ex_buster_ice_icicle_and_crystal_normal_enemy_target.txt
 
if(number_enemy==0){	//目標となる敵がいない場合
	velocity_zero_buster_x=velocity_zero_buster*zero_buster_direction	//初期速度(x方向)
	velocity_zero_buster_y=0	//初期の方向(y方向)
	_parent._rotation=-90+90*zero_buster_direction	//回転
}
 

・・・目標となる敵がいる場合

 目標となる敵がいる場合は、目標となる敵との角度を算出し、速度を付加し、回転させる。
 角度の算出に関する参考サイト(https://hakuhin.jp/as/shot.html)。

ASのファイル:zero_ex_buster_ice_icicle_and_crystal_normal_enemy_target.txt
 
else{	//目標となる敵がいる場合
	enemy_x=_root.board["enemy_"+number_enemy]._x;enemy_y=_root.board["enemy_"+number_enemy]._y	//目標となる敵の位置
	radian_zero_buster=Math.atan2(enemy_y-_parent._y,enemy_x-_parent._x)	//角度を算出
	rotation_zero_buster=radian_zero_buster*180/Math.PI
	velocity_zero_buster_x=velocity_zero_buster*Math.cos(radian_zero_buster);velocity_zero_buster_y=velocity_zero_buster*Math.sin(radian_zero_buster)	//速度
	_parent._rotation=rotation_zero_buster	//回転
}
 

・・目標となる敵がいる場合

 目標となる敵がいる場合、常に、「目標となる敵との距離の二乗を算出」を算出し、(角度が計算された時点での)目標となる敵がいた地点に近接したか否かを判定する。
 目標となる敵と近接した場合(「バスターの速度の値の二乗」以下の値となった場合)は、各種の値をリセットし、再び「目標となる敵の検出」を行う。

 このような処理を行うことにより、「目標としていた敵にヒットしなかった場合(敵が消滅したり、大きく移動するなど)」においても、再び「目標となる敵の検出」を行うことが可能になる。

ASのファイル:zero_ex_buster_ice_icicle_and_crystal_normal.txt
 
		if(number_enemy!=0){	//目標となる敵がいる場合
			distance_zero_buster_enemy_target=Math.pow(_parent._x-enemy_x,2)+Math.pow(_parent._y-enemy_y,2)	//目標となる敵との距離の二乗を算出
			if(distance_zero_buster_enemy_target<=Math.pow(velocity_zero_buster,2)){	//目標となる敵と近接した場合
				distance_zero_buster_enemy_save=100000	//敵との距離(二乗,検出用)の保存用の値をリセット
				number_enemy=0	//目標となる敵の番号をリセット
 
				//目標となる敵の検出,速度の付加など
				#include "zero_AS/zero/zero_ex_buster_ice_icicle_and_crystal_normal_enemy_target.txt"
			}
		}
 

最終更新:2020年12月19日 09:33