・概要
「EXバスター」の処理の大半は、「バスター」と共通している。
バスターを参照。
ここでは、各種EXバスターにおける、特殊な挙動に関する処理を中心に解説する。
なお、EXバスターは、エレメントゲージの消費があるため、ダメージを強めに設定している。
・頻出する処理
・・バスターのタイプ
ASのファイル:各種バスターのAS
zero_buster_type="persistent" //バスターのタイプ(持続性)
・・バスターの消滅判定がない場合
バスターの消滅判定がない場合にのみ行う処理。バスターの消滅判定がない場合にのみ、「敵との接触判定」や「地形との接触判定」を取得する、などの目的で用いる。
ASのファイル:各種バスターのAS
if(zero_buster_vanish==0){ //バスターの消滅判定がない場合
︙
}
・・複数のhitrectにより構成されているバスター
「複数のhitrectにより構成されているバスター」に関しては、敵との接触判定において、「複数のhitrectにより構成されたMCの接触判定」の処理を行う。
接触判定の「・複数のhitrectにより構成されたMCの接触判定(2)」を参照。
・・「透明化」と「敵との接触判定」
ある程度透明化した場合は、敵との
接触判定を取得しない。
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 //目標となる敵の番号
「敵との距離(二乗、検出用)の保存用」には、予め非常に大きな値を代入している。
・・・目標となる敵の検出、速度の付加など
「・・目標となる敵の検出、速度の付加など」を参照。
・・目標となる敵の検出、速度の付加など
・・・目標となる敵の検出
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 //回転
}
・・・目標となる敵がいる場合
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