・概要
・スクロール用のhitrect
スクロールの処理は、
ボードにおいて出現させた「スクロール用のhitrect」において行っている。
このMCの大きさは、ゲーム画面に合わせている。
↓スクロール用のhitrect。このMCの基準点(「+」の箇所)を、ゼロの位置に合わせることになる。
・loadの処理
・・位置取得(background_base)
「・スクロール用のhitrectの位置調整(2)」を参照。
ASのファイル:scroll_hitrect.txt
//端の位置(background_base)
background_base_xmin=background_base.getBounds(_root.board).xMin;background_base_xmax=background_base.getBounds(_root.board).xMax //左,右
︙
・・位置取得、スクロール判定(初期)
「・スクロール用のhitrectの移動量の制限」を参照。
ASのファイル:scroll_hitrect.txt
scroll_hitrect_x_old=_parent._x;scroll_hitrect_y_old=_parent._y //スクロール用のhitrectの位置(保存用)
initial_scroll=0 //スクロール判定(初期)
・・強制スクロール判定
「・応用」の「・・強制スクロール」を参照。
ASのファイル:scroll_hitrect.txt
_root.forced_scroll=0 //強制スクロール判定
・スクロール用のhitrectの位置調整(1)
(「強制スクロール判定」がない場合)スクロール用のhitrectをゼロの位置に合わせる。
↓スクロール用のhitrectの位置調整(1)。この段階では、まだスクロールは行われない。
ASのファイル:scroll_hitrect.txt
if(_root.forced_scroll==0){_parent._x=zero._x;_parent._y=zero._y} //ゼロの位置(強制スクロール判定がない場合)
・スクロール
スクロール用のhitrectの位置の情報を用いて、ボードの位置調整を行う。
↓スクロール。
↓スクロールの前。
原点は_rootを基準にしている。
・①:スクロール用のhitrect。
・②:「ゲーム画面」の領域。
スクロール用のhitrectをこの領域に合わせることになる。
・③:「background_base」。
ボードの「・ステージのボードのレイヤー構造」を参照。
・④:「_parent.getBounds(_root).xMin」。スクロール用のhitrectの左端の位置。
この値だけ、ボードを左に移動させることになる。
・⑤:「_parent.getBounds(_root).yMin」。スクロール用のhitrectの上端の位置。
この値だけ、ボードを上に移動させることになる。
↓スクロールの後。
「スクロール用のhitrectの領域」がゲーム画面に表示されることになる。
ASのファイル:scroll_hitrect.txt
_root.board._x-=_parent.getBounds(_root).xMin;_root.board._y-=_parent.getBounds(_root).yMin //スクロール
・「_root.board」:ボード。
・「_parent」:スクロール用のhitrectのことを指す。
・「_root.board._x-=_parent.getBounds(_root).xMin」:ボードを、上の図の④の値だけ、左に移動させる。y方向の移動に関しても同様の処理を行っている。
・スクロール用のhitrectの位置調整(2)
・・概要
上記までの処理では、「background_base」の外側の領域もゲーム画面に表示される場合がある。そこで、スクロール用のhitrectが「background_base」の外側に出ないように位置調整を行う。
↓スクロール用のhitrectの位置調整(2)。
・・端の位置の差分
「スクロール用のhitrect」の端の位置を取得し、「background_base」の端の位置との差分を計算する。
ASのファイル:scroll_hitrect_background_base.txt
//端の位置(scroll_hitrect)
scroll_hitrect_xmin=_parent.getBounds(_root.board).xMin;scroll_hitrect_xmax=_parent.getBounds(_root.board).xMax //左,右
︙
//端の位置の差分(background_base-scroll_hitrect)
scroll_dx_background_base_left=background_base_xmin-scroll_hitrect_xmin;scroll_dx_background_base_right=background_base_xmax-scroll_hitrect_xmax //左,右
︙
・・位置調整
ここでは、左側の位置調整を例にする。
↓位置調整の前。
原点はボードの基準点に設定している。
・①:「background_base_xmin」。「background_base」の左端の位置。
・②:「scroll_hitrect_xmin」。「スクロール用のhitrect」の左端の位置。
・③:「scroll_dx_background_base_left」。左端の位置の差分。①-②。
↓位置調整の後。この後で「・スクロール」の処理が行われることになる。
ASのファイル:scroll_hitrect_background_base.txt
if(scroll_dx_background_base_left>=0){_parent._x+=scroll_dx_background_base_left} //左
・「if(scroll_dx_background_base_left>=0)」:左端の位置の差分が正の場合、つまり、スクロール用のhitrectが「background_base」より左側に出ている場合。
・「_parent._x+=scroll_dx_background_base_left」:スクロール用のhitrectの位置調整を行う。
右側、上側、下側に関しても、同様の処理を行っている。
以降の解説では、分かりやすくするため、スクロール用のhitrectを非表示にしている。
・スクロール用のhitrectの位置調整(3)
・・概要
「スクロール制限用の地形」を用いて、スクロール用のhitrectの位置調整を行う。この処理を行うことで、スクロールの範囲を、(ある程度)任意に制限できる。
この内容は、上記までの内容と比較して、処理の構築の難易度がやや高い。
↓スクロール用のhitrectの位置調整(3)。分かりやすくするため、マスクを適用していない。以降の動画も同様。
スクロール用のhitrectと「スクロール制限用の地形(床)」(横長の紫の矩形)との接触判定がある場合は、スクロール用のhitrectの位置調整が行われる。この処理により、「スクロール制限用の地形(床)」よりも下側にはスクロールしないことになる。
・・スクロール制限用の地形との接触判定
ここでは、「スクロール制限用の地形(床)」を例にする。
なお、この地形に関しては、「手動で地形の番号を設定する地形」と同様の方法で制作している。
地形の出現・消滅の「・手動で地形の番号を設定する地形」を参照。
スクロール用のhitrectと「スクロール制限用の地形(床)」との接触判定に関する記述は、以下の通りとなる。
地形との接触判定の「・「接触判定」+「位置調整」」も参照。
ASのファイル:scroll_hitrect_landform.txt
hit_y_floor=0 //地形めり込み量をリセットしておく
for(i=1;i<=_root.i_scroll_limit_floor;i++){
landform=_root.board["scroll_limit_floor_"+i] //参照先を変数に保存
if(_parent.hitTest(landform)){
hit_y_floor=scroll_hitrect_ymax-landform.getBounds(_root.board).yMin //地形めり込み量
break //ループを離脱
}
}
・「_root.board["scroll_limit_floor_"+i]」:ボードに配置されている「スクロール制限用の地形(床)」のことを指す。インスタンス名は「scroll_limit_floor_1」「scroll_limit_floor_2」…と設定されている。
・・位置調整(1)
「・・スクロール制限用の地形との接触判定」において算出した「地形めり込み量」を用いて、位置調整を行う。
ASのファイル:scroll_hitrect_landform.txt
if(hit_y_floor!=0 and hit_y_ceiling==0){_parent._y-=hit_y_floor} //床
・「hit_y_floor!=0 and hit_y_ceiling==0」:「スクロール制限用の地形(床)」との接触判定があり、「スクロール制限用の地形(天井)」との接触判定がない。
・・位置調整(2)
「スクロール制限用の地形(床)」と「スクロール制限用の地形(天井)」の両方と同時に接触判定がある場合は、「地形めり込み量」が小さい地形に関する処理を優先させる。
「・応用」の「・・地形無効」の「スクロール制限用の地形(床)」と「スクロール制限用の地形(天井)」の例の動画も参照。
ASのファイル:scroll_hitrect_landform.txt
else if(hit_y_floor<=hit_y_ceiling){_parent._y-=hit_y_floor} //床
・「hit_y_floor<=hit_y_ceiling」:「スクロール制限用の地形(床)」の「地形めり込み量」が、「スクロール制限用の地形(天井)」の「地形めり込み量」以下。
・スクロール用のhitrectの移動量の制限
・・概要
「・スクロール用のhitrectの位置調整(3)」の処理を行うと、一瞬で大きくスクロールする場合がある。そこで、急激なスクロールを防止するための処理を行っている。
↓スクロール用のhitrectの移動量の制限。徐々にスクロールが行われる。ここでは、分かりやすくするため、移動量の制限の値を「1」と設定している。
・・スクロール用のhitrectの移動量
各種の位置調整の後、スクロール用のhitrectに関して、移動量(「現在の位置」と「1フレーム前の位置」との差分)を計算する。
ASのファイル:scroll_hitrect.txt
scroll_hitrect_dx=_parent._x-scroll_hitrect_x_old;scroll_hitrect_dy=_parent._y-scroll_hitrect_y_old
x方向に関しては、以下の通りとなる。y方向に関しても、同様の計算を行っている。
・「_parent._x」:スクロール用のhitrectの現在の位置(x方向)。
・「scroll_hitrect_x_old」:スクロール用のhitrectの1フレーム前の位置(x方向)。
・「scroll_hitrect_dx」:移動量(x方向)。
・・スクロール用のhitrectの移動量の制限
「スクロール用のhitrectの移動量」が一定の値よりも大きい場合、移動量を制限する。
ここでは、右方向への移動を例にする。
スクロール判定(初期)に関しては、「・・スクロール判定(初期)」を参照。
ASのファイル:scroll_hitrect.txt
if(initial_scroll==1){ //スクロール判定(初期)がない場合
if(scroll_hitrect_dx>10){_parent._x=scroll_hitrect_x_old+10} //右
︙
}
・「scroll_hitrect_dx>10」:「スクロール用のhitrectの移動量」が一定の値(ここでは「10」と設定している)よりも大きい。
・「_parent._x=scroll_hitrect_x_old+10」:スクロール用のhitrectの位置を、「スクロール用のhitrectの1フレーム前の位置(x方向)+10」の位置にする。この処理により、スクロール用のhitrectの移動量が10以下に制限されることになる。
左方向や、y方向に関しても、同様の処理を行っている。
・・スクロール判定(初期)
スクロール用のhitrectの移動量の制限を行うと、ゼロが出現したフレームにおいても、制限が行われる場合がある。そこで、ゼロが出現したフレームのみ制限を行わないように設定する必要がある。
↓スクロール判定(初期)を付加しない場合の例。ここでは、分かりやすくするため、移動量の制限の値を「1」と設定している。
ASのファイル:scroll_hitrect.txt
initial_scroll=1 //スクロール判定(初期)
・「initial_scroll」:スクロール判定(初期)。この判定が「0」の場合(ゼロが出現したフレームの場合)、制限をされずにスクロールが行われる。この判定が「1」となることで、以降は制限されることになる。
また、スクロール判定(初期)がある場合(ゼロが出現したフレーム以降の場合)は、一時停止判定がある場合に、スクロールを行わないように設定している。
ASのファイル:scroll_hitrect.txt
if(initial_scroll==1 and _root.start_pause==1){} //スクロール判定(初期)がある場合・一時停止判定がある場合,処理を行わない
else{
︙
}
・応用
・・強制スクロール
強制スクロールを行う場合は、強制スクロール判定を付加する。この処理により、スクロール用のhitrectは、ゼロの位置に位置調整されないことになる(ただし、loadの処理における位置調整を除く)。
ASのファイル:landform_count_test.txt
_root.forced_scroll=1 //強制スクロール判定
以下に、「スクロール用のhitrectを、徐々に右方向に移動させる場合」の例を示す。
↓強制スクロール。
ASのファイル:landform_count_test.txt
_root.board.scroll_hitrect._x+=1 //強制スクロール
・・地形無効
特定の条件が満たされた場合、「スクロール制限用の地形」のインスタンス名を変更することで、地形を無効化する。
地形無効も参照。
以下に、「ゼロの位置」により地形が無効化される例を示す。
↓「スクロール制限用の地形(壁(左))」(青い縦長の矩形)と「スクロール制限用の地形(壁(右))」(赤い縦長の矩形)の配置。
「スクロール制限用の地形(壁(左))」は、「ゼロの位置」よりも右にある場合に無効化されるように設定している。分かりやすくするため、透明度も変化させている。
ASのファイル:scroll_limit_wall_left_zero_x.txt
onClipEvent(load){
initial_name="scroll_limit_wall_left"+this._name
︙
}
onClipEvent(enterFrame){
if(_parent.zero._x<=this._x){this._name="'"+initial_name;this._alpha=50} //ゼロの位置よりも右にある場合,インスタンス名を変更
else{this._name=initial_name;this._alpha=100} //インスタンス名を戻す
︙
}
「スクロール制限用の地形(壁(右))」は、「ゼロの位置」よりも左にある場合に無効化されるように設定している。
ASのファイル:scroll_limit_wall_right_zero_x.txt
︙(省略)
↓「スクロール制限用の地形(壁(左))」と「スクロール制限用の地形(壁(右))」の例。
ゼロが左から右に移動した場合の解説は、以下の通りとなる。
・ゼロの位置が「スクロール制限用の地形(壁(左))」よりも左の場合、「スクロール制限用の地形(壁(左))」は無効化され、「スクロール用のhitrect」は、「スクロール制限用の地形(壁(右))」のみの影響を受ける。
・ゼロの位置が「スクロール制限用の地形(壁(左))」よりも右の場合、「スクロール制限用の地形(壁(左))」の無効化が解除される。ただし、ゼロが両方の地形の中間を通過するまでは、「・スクロール用のhitrectの位置調整(3)」の「・・位置調整(2)」の処理により、「スクロール制限用の地形(壁(右))」が優先されることになる。
・ゼロが両方の地形の中間を通過した場合、「スクロール制限用の地形(壁(左))」が優先されることになり、スクロールが行われる。
・ゼロの位置が「スクロール制限用の地形(壁(右))」よりも右の場合、「スクロール制限用の地形(壁(右))」は無効化され、「スクロール用のhitrect」は、「スクロール制限用の地形(壁(左))」のみの影響を受ける。
ゼロが右から左に移動した場合も、同様の処理が行われることになる。
↓「スクロール制限用の地形(床)」と「スクロール制限用の地形(天井)」の例。上記の例と同様の処理を行っている。
最終更新:2020年12月19日 09:42