2.ドット単位のマップ表示

 
	;
	;	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は非常に難しいスクリプトになっています。
コメントを参考にして、考えて見てください。


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