マップ内を移動する



RPGを作るとなるとかなりめんどくさいですよ。結構いろいろな技術が必要になってくるのでやるならそれなりに覚悟しましょう。 私は昔作ってみたけど、途中で挫折しました。まあ超ミニRPGぐらいなら作れますが、大きいのは作る気にならないですね。
今回はカーソルキーでマップ内を移動するのだけをやります。 一般的なRPGならば、移動方法はシューティングと違ってマスを使った移動になります。よって、キーを一回押すだけで複数回自分が動くようになります。

;マップ内を移動する

#const tipsize 20		;マップチップのサイズ
#const movefreq tipsize/4	;移動時に何ループで行くか(サイズを割りきれるように)
#const movelong tipsize/movefreq;一歩の長さ
#const tipmax 20		;マップチップの個数

	screen 0,tipsize*tipmax,tipsize*tipmax

	jpx=10		;自分のマップチップのマスで数えたx座標
	jpy=10		;自分のマップチップのマスで数えたy座標
	jx=jpx*tipsize	;自分の位置の絶対座標x
	jy=jpy*tipsize	;自分の位置の絶対座標y

*mainloop	;メインループ
	redraw 0
	gosub *drawmap
	gosub *checkkey
	gosub *drawown
	redraw
	await 1
	goto *mainloop

*drawmap	;マップ描画ルーチン(今回は全体が緑)
	color ,255 : boxf
return

*checkkey	;キー判定ルーチン
	if moveflg=0 {
		stick key,15,1
		if key=1 {
			if jpx!0 {			;画面端でなければ
				jmovex=-movelong	;一回の移動量x
				jmovey=0		;一回の移動量y
				moveflg=1		;移動フラグ
				counter=movefreq	;移動する回数
				jpx--			;マップの座標を変更
			}
		}
		if key=2 {
			if jpy!0 {
				jmovex=0
				jmovey=-movelong
				moveflg=1
				counter=movefreq
				jpy--
			}
		}
		if key=4 {
			if jpx!(tipmax-1) {
				jmovex=movelong
				jmovey=0
				moveflg=1
				counter=movefreq
				jpx++
			}
		}
		if key=8 {
			if jpy!(tipmax-1) {
				jmovex=0
				jmovey=movelong
				moveflg=1
				counter=movefreq
				jpy++
			}
		}
	}
	if moveflg=1 {
		jx+jmovex
		jy+jmovey
		counter-- : if counter=0 : moveflg=0
	}
return

*drawown	;自分描画ルーチン
	font "",tipsize : color 255 : pos jx,jy : mes "●"
return

全体緑じゃちゃんと移動してるかわかりづらいですね。大丈夫、ちゃんと出来てます(オイ)。
各変数が何を表しているかはコメントを見れば大体わかるでしょう。
移動だけならもっといろいろ方法はあります。この方法はとっさに思いついたものだったのであまりいい方法とはいえないです。 特に高速化も考えずに作ったもので…。
昔はもっと違う方法を使っていたけれど覚えてないんですよ。
キー判定のifはswitchマクロを使えば少しは記述が楽になるかもしれませんが、速度も変わらないのでとりあえずifで。
次で、移動できる場所と移動できない場所を判定させます。


戻る 次へ