画面のスクロールについて


はじめに

アクションゲームやRPGに見られる自分を中心とした画面のスクロールについて以前尋ねられたので、 今回はその方法について考証していきたいと思います。

最も簡単な方法

最も簡単であろう方法をこれより説明します。
ソース及び必要なファイルはこちらからダウンロードしてください。
その中でも特に重要な部分を以下に挙げます。



*haikei		;背景の表示 
	redraw 2
	gmode 2
	color 0,0,0 :boxf 0,0,640,480

	scx=scx+spd1x	;spd1x:自分の移動速度(X座標分)
	scy=scy+spd1y	;spd1y:(Y座標分)

	if scx>500:scx=0
	if scy>480:scy=0
	if scy<0:scy=480
	if scx<0:scx=500

	pos 0,0 :gcopy 1,scx,scy,500-scx,480-scy
	pos 500-scx,480-scy :gcopy 1,0,0,scx,scy
	pos 0,480-scy :gcopy 1,scx,0,500-scx,scy
	pos 500-scx,0 :gcopy 1,0,scy,scx,480-scy
	return




実行すると
自分(へんてこなロボット)が真ん中で移動すると周囲のキャラや背景が動くと画面が出来上がります。
上記のソースは背景のスクロールの移動値を自分の移動値にしている事です。
他に周囲のキャラも自分の絶対位置からの値を計算し入っているなら表示すると言う風にしています。

問題点

問題点としてマップの端っこにいった場合の処理に不満が残ります。
RPGなら問題が無いと思われますが、アクションの場合だとちょっと不細工な仕上りになってしまいます。


改良すると

マップ全体のつもり


では先ほどのソースを改良してみましょう。
なお左の図はマップ全体を表します。

今回はマップの端以外での移動では自分が常に真ん中に表示されると考えます。 すると自分の位置を取得し、マップの真ん中(番号無し)より外へ出た場合、 画面の移動を停止し、移動分自分の表示をずらすという方法が考えられます。
そうするとマップ内では場所にあわせて9通りの処理が必要とされます。(これは更なる改良で簡単に出来ると思われますが…)
背景だけなら仕組みは意外と簡単なんですが他のキャラを含むとさらに複雑になります…。 とにかくソースを実行していろいろいじくり回して試してみてください。
ちなみに改良結果はこちらです(どこが変ったか比べて見て下さい)

戻る