; ; HSP マップ描画 & スクロールサンプル2 ; mapsx=32:mapsy=32 ; マップ全体のサイズ mapcx=64:mapcy=64 ; 1つのチップのX,Yサイズ mapvx=9:mapvy=7 ; 画面に表示される大きさ(チップ単位) mx=0:my=0 ; 左上のマップ座標 alloc mdat,mapsx*mapsy ; マップデータのバッファ bload "test.map",mdat wx=mapcx*mapvx:wy=mapcy*mapvy screen 0,wx,wy,1 buffer 3,,,1 picload "testchr.bmp" *map_main ; マップ描画ルーチンを呼び出す ; gsel 0 ; 描画先をID0に redraw 2 ; 書き換えスイッチOFF gosub *map_draw ; マップ描画ルーチン呼び出し pos mapvx/2*mapcx,mapvy/2*mapcy ; 重ねあわせキャラ座標 a=0:gosub *chr_draw ; 重ねあわせキャラ表示 redraw 1 ; 最後に書き換えスイッチON *keychk ; カーソルキー入力でスクロールさせる ; await 10 stick a,15 if a&1 : goto *go_left if a&2 : goto *go_up if a&4 : goto *go_right if a&8 : goto *go_down goto *keychk *go_up if my>0 : my- goto *map_main *go_down a=mapsy-mapvy*mapcx if my<a : my+ goto *map_main *go_left if mx>0 : mx- goto *map_main *go_right a=mapsx-mapvx*mapcy if mx<a : mx+ goto *map_main *map_draw ; マップ描画ルーチン ; ( mx,myをドット単位で扱う) ; xx=mx/mapcx:yy=my/mapcy ax=mx\mapcx:ay=my\mapcy xt=0:y=0:ix=mapvx:iy=mapvy i=yy*mapsx+xx:a=0 if ax>0 : ix+:xt=0-ax if ay>0 : iy+:y=0-ay ; gosub *draw_sub ; 一番上のライン y+=mapcy:i+=mapsx ; 1つ下にずらす ; repeat iy-2 ; 2番目以降のライン ; x=xt:j=i peek a,mdat,j:j+ gmode 0,mapcx,mapcy pos x,y:gcopy 3,a*mapcx,0:x+=mapcx ; 一番左のチップ gmode 1,mapcx,mapcy ; repeat ix-2 peek a,mdat,j:j+ pos x,y:gcopy 3,a*mapcx,0:x+=mapcx ; 2番目以降のチップ loop ; peek a,mdat,j:j+ gmode 0,mapcx,mapcy pos x,y:gcopy 3,a*mapcx,0 ; 一番右のチップ ; y+=mapcy:i+=mapsx ; 1つ下にずらす loop ; gosub *draw_sub ; 一番下のライン ; return *draw_sub ; 1ライン描画のためのサブルーチン ; gmode 0,mapcx,mapcy j=i:x=xt repeat ix peek a,mdat,j:j+ pos x,y:gcopy 3,a*mapcx,0 x+=mapcx loop return *chr_draw ; 重ねあわせキャラクタ描画ルーチン ; ( カレントポジションに変数aのキャラNo.を重ねあわせ表示する) ; gmode 2,mapcx,mapcy gcopy 3,a*mapcx,mapcy return *owari end |
ドット単位のマップ表示スクリプトです。
基本的な構成はキャラクター単位のマップ表示と同じです。
しかし、表示の単位がドット単位になっていますので、 キー入力で変化する値もドット単位になっています。
ドット単位の表示ルーチン*map_drawは非常に難しいスクリプトになっています。
コメントを参考にして、考えて見てください。