今回も素材集サイト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