HSP-TECH 第六弾

TMap DataLoader Script Ver.1.0

2001.3.22 HSP-TECH Written & Programed by Smith

今回は、みずやん氏開発のTMapedter 2D Ver.1.32によって作成されたMAPデータをHSPを使って読み込むScriptの解説です。
TMapediterは、みずやん氏サイトの「みずやん's Water World」から 入手しておいてください。
また、すぐにでもこのScriptを使って試してみたい人は、TMapEditerで私がサンプルデータを作成しましたのでページ下部から ソースScriptとのセットをDLし、さらに「RPGツクール2000対応素材集」より、 溶岩の洞窟チップセット(chipset10.bmpで保存しておく事)をDLしておいて下さい。

それでは早速1stepずつ解説していきます。
まず、TMapEditerのフォーマットにはMAPデータに関する情報がヘッダ部にあるので それを先に読み込み本体部分のMAPデータを読み込む準備処理をしておきます。

	title "MapData Loader for TMapEditer BinaryFormat"
	filename="map1.tm2"
	exist filename
	if strsize == -1:dialog "ファイル:"+filename+"がありません":end
	filesize = strsize
	dim buf,filesize
	bload filename,buf
exist filename を実行するとファイルサイズがシステム変数strsizeに帰ります。 ファイルが存在しなければシステム変数strsizeに-1が帰るのでif文で判断させ適切な警告 メッセージを表示させてあげます。
dim buf,filesize でMAPデータ読み込みに必要なバッファを確保しておき、bload filename,buf で変数bufにMAPデータを読み込みます。

次に読み込んだMAPデータの情報をヘッダ部から取得し本体部分の読み込みに備えます。
ヘッダ部は次のような構造になっております。
    ・BMPファイルネーム(48byte)*ただし、最初の1byteは必ず0である。
    ・MAPサイズのX幅(2byte)
    ・MAPサイズのY幅(2byte)
    ・チップサイズのX幅(2byte)
    ・チップサイズのY幅(2byte)
この情報を読み込むために予めヘッダ情報格納用の変数を確保しておくことにしましょう。

	;---	ヘッダデータ構造体	---
	sdim bmpname,64,1
	dim HEAD_DATA,4
		dup MAP_SIZE_X ,HEAD_DATA.0
		dup MAP_SIZE_Y ,HEAD_DATA.1
		dup CHIP_SIZE_X,HEAD_DATA.2
		dup CHIP_SIZE_Y,HEAD_DATA.3
	;----------------------------------
bmpname用に一応64byte確保しておきます(実際は47byte分の名前)。
HEAD_DATA変数に注目してください、配列で4つ分確保したのはMAPサイズ情報などを入れる為です。 これは次のdup命令を見るとわかりますが、HEAD_DATA配列の0番からそれぞれMAP_SIZE_Xのように 変数を複製しております。こうしておくことで後々使い勝手が良いですし、メモリ節約、高速化の 助けにもなるのです。
こういう手法は是非活用しましょう。

次のScriptは実際にヘッダで選られる情報を各変数(配列)に入れてます。 特にむつかしいことはしてませんが、DUPした複製のほうではなくHEAD_DATA配列に一気に入れてます。 このように入れても後々MAP_SIZE_Xなどの変数を使用してもここで入れた値が使われるわけです。

	;/////	bmpネーム取得
	repeat 24
		wpeek tmp,buf,i_index
		wpoke bmpname,o_index,tmp
		i_index+=2:o_index+=2
	loop
	i_index--	;飛ばした分との調整で1byte戻す

	;/////	チップ/マップサイズ取得
	o_index=0:dim tmp,1
	repeat 8
		wpeek tmp,buf,i_index
		wpoke HEAD_DATA,o_index,tmp
		i_index+=2:o_index+=2
	loop

次に確認の為、以下のScriptを付けてヘッダで得る情報がうまく読み込めているか見てみましょう。

	offset = i_index	;実データ開始のoffsetを記録しておく
	;確認用の表示
	mes "bmpname:"+bmpname
	mes "ChipSize:"+CHIP_SIZE_X+"x"+CHIP_SIZE_Y
	mes "MapSize:"+MAP_SIZE_X+"x"+MAP_SIZE_Y
	mes "i_index:"+i_index
どうですか、うまく正しい値が表示されましたか。特にi_indexの値がきちんと64になっているか 確認してください。これが違う値だとおそらくほかの値もおかしいはずです。

それでは次にヘッダで得た情報を元に本体であるMAPデータを読み込む準備をしましょう。

	;/////	MAP画像リソースを読む
	;バッファ作成し画像をロード
	;buffer 3,,,0;実際はbufferで取る
	screen 3,,,0;確認用
	picload bmpname:title "MAP Resouce"

	;/////	MAP属性を記録する配列変数を確保	/////
	dim map,MAP_SIZE_X,MAP_SIZE_Y

	;/////	MAP描画用のバッファ作成
	;必要なバッファサイズを求める
	wx=CHIP_SIZE_X*MAP_SIZE_X:wy=CHIP_SIZE_Y*MAP_SIZE_Y
	;buffer 4,wx,wy,0;実際はこのbufferで取る
	screen 4,wx,wy,0,dispx-wx/2,dispy-wy/4;確認用
	cls 4:gmode 0
MAPのサイズやチップサイズが分かる事で余分な領域を確保する必要がなくなります。 このようにMAPデータ本体を読む前にヘッダ情報を解読しておくことでメモリの節約にもなるのです。

さて、いよいよローダーの最後に取り掛かりましょう。
64byte目からMAPデータ本体をTMapEditer仕様書に沿って、
  ・チップセットX座標データ(2byte)
  ・チップセットY座標データ(2byte)
  ・マップフィールド属性データ(2byte)
の順にマップサイズX*マップサイズY回取り込んで行きます。
サンプルでは取り込みながらscreen 4に描画してますが、実際にゲームなどに組み込む場合は buffer命令で確保したプレーンに取り込めばOKです。

;<<<<<<<<<<	MAP描画ルーチン	>>>>>>>>>>
	dim x,1:dim y,1:dim a,1
	repeat MAP_SIZE_Y
		i=cnt
		repeat MAP_SIZE_X
			wpeek x,buf,i_index:i_index+=2
			wpeek y,buf,i_index:i_index+=2
			wpeek a,buf,i_index:i_index+=2
			map.cnt.i=a:if a==256:START_X=cnt:START_Y=i
			pos cnt*CHIP_SIZE_X,i*CHIP_SIZE_Y
			gcopy 3,x,y,CHIP_SIZE_X,CHIP_SIZE_Y
		loop
	loop
	redraw 1:title "MAP Screen"
stop

どうですか?うまく表示されましたか?
わからない命令などはHSPのHELPを良く読んで理解してみてください。とりあえずこのサンプルでは とくにむつかしいことはしてませんが、効率的にMAPデータを読み込んでいることがおわかりになれば 良いと思います。TMapediter形式を使うことで基本的なMAPフィールドはほぼ再現できます。
次回のHSP-TECHでは、実際に「主人公キャラがMAPを歩き回る」を解説します。

▽ここまでのスクリプトとサンプルデータのセットをDLする▽

次のHSP-TECHへ進む

INDEXへ戻る