3.マップを読み込む

今回も素材集サイトFirst Seed Materialのキャラクターチップをお借りします。

マップの情報をファイルから読み込みます。
下のデータをメモ帳に貼り付けて、map.txtとしてソースと同じフォルダに入れてください。

1,1,1,1,1,1,1,1,1,1
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,2,0,0,0,0
0,0,0,0,0,0,0,0,0,0
1,1,1,1,0,1,1,1,1,1
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,2,0,0,0
0,2,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
1,1,1,1,1,1,1,1,1,1

noteload、notegetなどの命令はメモリノートパッド命令といって、
テキストファイルを読み込んでデータを簡単に扱う事ができます。

noteselはメモリノートパッド命令の対象となる変数を指定します。
指定した変数に対して、データの読み込みや書き込みが行われます。

getstrは変数から文字列を読み出す命令です。
例えば変数pに"勇者@魔法使い@遊び人"という文字列が入っているとします。
getstr a,p,0,'@'とすると、変数pの0文字目から@がある所までの文字列をaに代入します。この場合 a = "勇者" となります。
このとき、strsizeというシステム変数に読み出したbyte数が代入されます。
漢字は一文字2バイトなので、strsizeは5バイトになります。(@も含む)
ここでindex = strsizeと代入します。
次にgetstr b,p,index,'@'とすれば、変数pの5文字目(勇者@の後)からデータを読み込みます。
b = "魔法使い"、strsizeは9バイトになります。index += strsizeとすれば、次は14文字目から読み込むことが可能になります。
これを繰り返して、文字列からデータを抽出します。

int(s)は文字列sを数値に直す関数です。"12345"→12345

buffer 1,96,32
picload "maptip.bmp"
buffer 2,72,128
picload "charatip.bmp"
screen 0,320,320

dim map,10,10
notesel buf
noteload "map.txt",300 //map.txtの内容をbufに読み込む
repeat 10
noteget row,i //bufのi行目のデータをrowに代入する
	repeat 10
	getstr tip,row,index,','
	index += strsize
	map(cnt,i) = int(tip)
	loop
i++
index = 0
loop
ex = 8 :ey = 2 //キャラの初期位置

*main
gosub *move //キャラの移動
gosub *draw_map //マップの描画
gosub *draw_chara //キャラクターの描画
redraw 1
wait 8
redraw 0
goto *main

*move
stick key,15
if walk = 0 {
	wdx = 0 :wdy = 0
	if key = 1: wdx-- //左移動
	if key = 2: wdy-- //上移動
	if key = 4: wdx++ //右移動
	if key = 8: wdy++ //下移動
	if (wdx ! 0) | (wdy ! 0){
		walk = 1
		edir = logf(key)/logf(2) //移動方向に合わせてキャラの向きを変える
		x = ex+wdx : y = ey+wdy //移動先の座標
		if (x < 0) | (x > 9) : walk = 0 :x = 0 //移動先が画面外だったら移動しない
		if (y < 0) | (y > 9) : walk = 0 :y = 0
		if map(x,y) :walk = 0 //移動先に障害物があれば移動しない
	}
}
return

*draw_chara
gmode 4,24,32,256
color 0,117,117 //透過したい背景色を指定
	pos ex*32+walk*wdx*8+4,ey*32+walk*wdy*8
	if walk = 0 : gcopy 2,24,(edir * 32),24,32
	if walk = 1 : gcopy 2,0,(edir * 32),24,32
	if walk = 2 : gcopy 2,24,(edir * 32),24,32
	if walk = 3 : gcopy 2,48,(edir * 32),24,32
	if walk = 4 {
		gcopy 2,24,(edir * 32),24,32
		walk = 0 //移動終了
		ex += wdx //現在の座標を移動後の位置にする
		ey += wdy
		wdx = 0 : wdy = 0
	}
	if walk:walk++
return

*draw_map
gmode 0
x = 0 : y = 0
repeat 10
j = cnt
	repeat 10
	i = cnt
	pos x,y
	gcopy 1,map(i,j)*32,0,32,32
	x += 32
	loop
x = 0 : y += 32
loop
return