HSP-TECH 第7弾

2D Field Walk Script Ver.1.1

2001.3.23 fix 3.24 HSP-TECH Written & Programed by Smith

 この回を進める前に、ある程度HSPのHELPで一通りの命令を理解しておくか最初からHSPに付いてくるサンプルプログラムなどで HSPとはなんぞよ?と言うのを理解しておいてください。
この回から少々むつかしくなっていきます。
さて、
前回のTMap DataLoaderは、2DフィールドのMAPを再現するだけに止まりましたが、今回はそのMAP上を実際にキャラクタで  歩いてみようというものです。
キャラクタ画像は、ちょこさんの「けまのほーむぺーじ」から お借りしてます。
 この場を借りてお礼を申し上げたいと思います。
また、前回のTMap DataLoaderを少し修正して今回のに採用してますが、screen命令をbuffer命令に置き換えた程度の違いです。
 なお、今回含め、今後のHSP-TECHは、HSP2.6をベースに進めていきますので、まだ2.6β6を入手していない方はすぐGETして下さい。

それでは早速1stepずつ解説していきます。
まず、前準備からいきましょう。
前準備としては、TMap DataLoaderのインクルード(結合)と定数の定義、それに画面初期化やキャラ情報の初期設定などです。
それではインクルードと定数の定義をしてみましょう。

;/////	定数を定義する	/////
#define MAP_BACK_PLANE 4	;MAPプレーン
#define CHR_CHIP_PLANE 5	;キャラクタプレーン
#define MAP_CHIP_PLANE 3	;MAPチッププレーン
#define MAIN_PLANE 2		;メインプレーン
#define W_X 640			;メイン画面 xサイズ
#define W_Y 480			;メイン画面 yサイズ
#define MAP_DRAW_AREA_SIZE 288	;MAPが描画されるエリアのサイズ
#define WAIT_TIME 1		;ループ内でのwaitタイム
#define CHR_SIZE_X 24		;キャラクタ xサイズ
#define CHR_SIZE_Y 32		;キャラクタ yサイズ
#define C_MODE 0		;スクリーンのカラーモード

;/////	TMap DataLoaderをインクルード	/////
#include "map_load.as"
 ここで#defineによって定義しておく利点は、この定数をもし変更してもそれはScript中の全てに有効となるからです。
 このような定数定義を行わずに製作を進めると、例えば後々に「キャラクタのサイズを変更しよう」となった場合、 Script中の全てのキャラクタに関するルーチンをチェックし変更をかけなければいけなくなります。
 そういった面倒でバグを生みやすい状態に出来るだけ陥らない為にもキャラXサイズは24、キャラYサイズは32、という ように#defineでまとめて定義しておきます。

次の前準備では、キャラクタ画像の読み込みやメイン画面の初期化、それと今後よく使うであろうと思われる計算を あらかじめ計算して変数にいれて用意しておきます。
 この「あらかじめ計算して用意」は、非常に有効な手法であり、毎回計算しなければいけないものでもこの1回の計算 で済ますことが出来ます。
 これは処理速度の向上とともにバグを避けやすく、万が一バグが発生しても原因を特定しやすくする手段でもあります。
 前準備をしっかりしておくことでプログラミングも効率よく行えるということを頭に入れて下さい。

	;/////	キャラクタ画像をバッファへ読み込む	/////
	buffer CHR_CHIP_PLANE,,,C_MODE:picload "charaset02.bmp"

	;/////	メイン画面の初期化	/////
	chgdisp 2:screen MAIN_PLANE,W_X,W_Y,0,dispx-W_X/2,dispy-W_Y/2
	cls 4:gmode 0:title "MAIN_SCREEN":color 0,0,255

	;/////	メイン画面内でのMAP描画ポジションを計算しておく	/////
	MAP_DRAW_Y = W_Y-MAP_DRAW_AREA_SIZE/2
	MAP_DRAW_X = W_X-MAP_DRAW_AREA_SIZE/2

	;/////	メイン画面の真ん中を計算しておく	/////
	CENTERX = W_X/2:CENTERY = W_Y/2

	;/////	主人公キャラの描画位置(固定)を計算しておく	/////
	P_CHR_DRAWX=CENTERX-(CHR_SIZE_X>>1):P_CHR_DRAWY=CENTERY-(CHR_SIZE_Y>>1)

 キャラクタの情報を構造体チックに持つことでこれまた後々に有効となってきます。
 わかりやすいメリットでは、データセーブです。この場合、bsave "save.dat",my_dataで済みます。
 初心者プログラマーでよく陥りやすいのは、「バラバラの変数をどうやって一つのファイルに保存するの?」です。
 まあ、私もつい最近HSPでこの手法を使いだしたのですが改めて有効だなあと感じてます。C言語では当たり前の範囲です。

*MY_INIT
	;<<<<<<<<<<	PlayerCharacterのイニシャライズ	>>>>>>>>
	;-----	Player情報の構造体	-----
	dim my_data,64
		dup mx,my_data.0	;x座標
		dup my,my_data.1	;y座標
		dup ph,my_data.2	;キャラの向き
		dup pa,my_data.3	;キャラのアニメーション番号
		dup pc,my_data.4	;キャラのアニメーションカウント
		dup mf,my_data.5	;移動中フラグ
		dup mc,my_data.6	;移動中のカウント
		dup mp,my_data.7	;1stepで進むドット数
		dup xv,my_data.8	;移動中の一時座標x増分
		dup yv,my_data.9	;移動中の一時座標y増分
		dup ps,my_data.10	;キャラクタ種別番号
	;-----				-----

	;/////	Playerキャラクタの初期値設定	/////
	mx=START_X:my=START_Y:ph=2:pa=0:pc=0:mf=0:mc=0:mp=1:ps=0

	;/////	メイン画面に最初の状態を描画する	/////
	boxf MAP_DRAW_X-4,MAP_DRAW_Y-4,MAP_DRAW_X+MAP_DRAW_AREA_SIZE+4,MAP_DRAW_Y+MAP_DRAW_AREA_SIZE+4
	gosub *MAP_DRAW:gosub *MY_CHR_DRAW

 次にキー入力処理を説明しましょう
 とは言ってもたいしたことはやってなく、stick命令で得た情報がカーソルキーであった場合、それに対応した 処理をしているだけです。カーソルキー入力が有効となる条件として、
・移動中ではない(今回はこのフラグはまだ意味がありません)
・斜めへは進めない
の2点です。
移動フラグmfについては次回必要になります。

*KEY_IN	;<<<<<<<<<<	キー入力処理	>>>>>>>>>>

	stick ky,15,1	;カーソルキーは非トリガータイプ指定
	if ky==128:goto *owari	;ESCキーで終了

	;/////	移動中(スクロール中)ではない場合カーソルキーを受け付ける
	if mf==0:xvv=(ky>>2&1)-(ky&1):yvv=(ky>>3&1)-(ky>>1&1)

	;/////	カーソルキーが押されていたら移動要求フラグに1
	if (xvv!0)||(yvv!0):mf=1

	;/////	斜めには進ませない	/////
	if xvv:if yvv:mf=0
return

 次に、MAPの描画処理のルーチンですが、あらかじめMAPの全てをbufferに描画済み(TMap DataLoader Ver.1.0にて)なので、 それほどむつかしいことはしてません。
 なお、MAPフィールド画像を2倍ズームにして迫力をすこし出しております。

*MAP_DRAW
	;<<<<<<<<<<	MAP描画ルーチン	>>>>>>>>>>

	;/////	キャラの現座標をMAP_BACK_PLANE座標上として計算させる
	x=mx*CHIP_SIZE_X+xv:y=my*CHIP_SIZE_Y+yv

	;/////	キャラの現座標から描画範囲となる左上座標を求める
	draw_top=y-(CHIP_SIZE_Y*4):draw_left=x-(CHIP_SIZE_X*4)

	;/////	メイン画面上での描画ポジション	/////
	pos MAP_DRAW_X,MAP_DRAW_Y

	;/////	MAP_BACK_PLANEから2倍ズームで描画	/////
	gzoom MAP_DRAW_AREA_SIZE,MAP_DRAW_AREA_SIZE,MAP_BACK_PLANE,draw_left,draw_top,MAP_DRAW_AREA_SIZE>>1,MAP_DRAW_AREA_SIZE>>1
return

次は、MAPフィールドのスクロール処理です。
 やや長いルーチンですが、1フィールド16ドットを16stepかけて進むように組んでおります。
 その間にキャラが歩いているようにアニメーションさせてますが、停止時は必ず仁王立ちのアニメーションで終わるようにし、 カーソルキーが押しっぱなしの場合は次のアニメーションへ滑らかに繋がるように仕組んでます。これにより出来るだけ自然な 歩行を再現してます。
 また、今回は1フィールド分のスクロールをこのルーチン内で完結させてますが、本来ならば1step毎にメインから呼び出されて 処理されるほうが望ましいです。それはなぜか、次回のHSP-TECHくらいで明らかになります。

*DRAW_MAP_AREA

	;/////	進行方向からキャラクタアニメーションレーン番号を算出
	if xvv=1:ph=1
	if xvv=-1:ph=3
	if yvv=1:ph=2
	if yvv=-1:ph=0

	;/////	進行方向が通過可能か調べる
	tmpx=mx+xvv:tmpy=my+yvv:if map.tmpx.tmpy>0:mf=0:return	;不可ならリターン

	;/////	1フィールド分のスクロールを行う	/////
	gsel MAIN_PLANE	;描画先はメインプレーンであることを指定
	repeat
		await WAIT_TIME
		stick ky,15,1:if ky==128:goto *owari
		kyy=ky&15	;カーソルキーが押され続けているか
		redraw 2	;一旦描画STOP(高速化の為)
		mc++:xv+=xvv*mp:yv+=yvv*mp	;1step分の計算
		pc++:if pc>5:pc=0:pa++		;キャラアニメーションさせる為の計算
		if pa>2:pa=0			;キャラアニメーションは繰り返し
		if mc>15:if kyy==0:pa=1		;16step終了時にキーが押されてなければ停止アニメーション
		gosub *MAP_DRAW:gosub *MY_CHR_DRAW	;MAPとキャラを描画

		;/////	描画ON(一気にメイン画面へ描かれる)
		redraw 1,MAP_DRAW_X,MAP_DRAW_Y,MAP_DRAW_AREA_SIZE,MAP_DRAW_AREA_SIZE

		;/////	16stepならスクロール(移動処理)は終了
		if mc>15:break
	loop

	;/////	移動後処理(mx,myに進行方向分を足す)	/////
	mx+=xvv:my+=yvv:xv=0:yv=0:mf=0:mc=0:pc=0
return
 次は、Playerキャラの描画ルーチンですが、至って簡単でキャラの向きとアニメーションに応じてキャラ画像のあるバッファ からgcopyしてメイン画面中央に描画しているだけです。

*MY_CHR_DRAW
	;<<<<<<<<<<	Playerキャラの描画処理	>>>>>>>>>>
	pos P_CHR_DRAWX,P_CHR_DRAWY:tmpx=pa*CHR_SIZE_X:tmpy=ps*4:tmpy+=ph*CHR_SIZE_Y
	gmode 2:gcopy CHR_CHIP_PLANE,tmpx,tmpy,CHR_SIZE_X,CHR_SIZE_Y
return
*2001.3.24 一部修正しました、ご指摘ありがとうございます。

 最後にメインループと終了処理です。
 処理のほとんどをサブルーチン化しているのでメインはすっきりとしてます。 これならなにをしているか解説するまでもないですね。

*MAIN	;<<<<<<<<<<	メインループ	>>>>>>>>>>
	await WAIT_TIME	;waitをとる
	gosub *KEY_IN	;キー入力処理へ
	if mf:gosub *DRAW_MAP_AREA	;移動要求があったら(mf=0:停止中/mf=1:移動中)
goto *MAIN

*owari	;<<<<<<<<<<	終了	>>>>>>>>>>
	end

さあ、これでオリジナルマップの2Dフィールドをキャラクターが歩くようになりました。次回は、このフィールドに モンスターを出現させてそれらを自由に歩かせるようにしたいと思います。また、このHSP-TECHでは最終形として、 なんと「クライアント/サーバ型のネットワークアクションRPG」まで進化させるつもりです。

今回、2D Filed Walk ScriptのソーススクリプトとTMap DataLoaderの改良版、MAPデータ、リソース画像の全てを アーカイブで用意しておきました。ただし、リソース画像に関しては必ずReadmeをお読み下さい。リソース画像は 素材として配布する訳ではありません、あくまでもこのHSP-TECHで解説した教本の一部、教材としてお使い下さい。

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

次のHSP-TECHへ進む

INDEXへ戻る