・概要

 スクロールの基礎に関しては、参考サイト(https://hakuhin.jp/as/scroll.html#SCROLL_02)に丸投げ。
 ちなみに、「board(ボード)」という表現を用いているのは、過去においてこのサイトの記述を丸パクリしていたことの名残である。

・スクロール用の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