; ; HSP マップ描画 & スクロールサンプル ; 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 30 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 if my<a : my+ goto *map_main *go_left if mx>0 : mx- goto *map_main *go_right a=mapsx-mapvx if mx<a : mx+ goto *map_main *map_draw ; マップ描画ルーチン ; ( mx,myをマップ左上座標として画面に表示する) ; gmode 1,mapcx,mapcy ; 高速モードでコピー指定 y=0:i=my*mapsx+mx ; 画面左上から順番に描画する repeat mapvy x=0:j=i repeat mapvx peek a,mdat,j:j+ ; マップデータ読み出し pos x,y ; 変数x,yが描画先の座標になる gcopy 3,a*mapcx,0 ; チップをコピー x+=mapcx ; 1つ右にずらす loop y+=mapcy:i+=mapsx ; 1つ下にずらす loop return *chr_draw ; 重ねあわせキャラクタ描画ルーチン ; ( カレントポジションに変数aのキャラNo.を重ねあわせ表示する) ; gmode 2,mapcx,mapcy gcopy 3,a*mapcx,mapcy return *owari end |
単純なマップ表示スクリプトです。
カーソルキーでマップを移動、りんごが重ね合わせで表示されます。
移動の単位はキャラクター(チップ単位)になっています。
キー入力にはstick命令を使い、my,mxを足したり引いたりしています。
alloc命令で確保した変数mdatにマップデータを読み込んで、参照にはpeek命令を使っています。
表示用のチップはID 3にグラフィックとして読み込んでいます。
重ねあわせ表示はサブルーチン*chr_drawです。
「gmode 2,mapcx,mapcy」で重ねあわせのモードに設定しています。
重ねる絵の透明になる部分を完全な黒にしておくと、透明として処理されるようになっています。