2.キャラクター単位のマップ表示

 
	;
	;	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」で重ねあわせのモードに設定しています。
重ねる絵の透明になる部分を完全な黒にしておくと、透明として処理されるようになっています。


マップ表示とマップエディタに戻る