dxlibのタグがつけられたコード一覧

HSP 【HSP3】DXライブラリのDxDLL.cs(C#)をHSPのasに変換するアレ(手抜き)Ver.3(2015/08/10)

#module
// 指定オフセットから右から検索していき見つけた位置を返す。(1byteのみ)
#defcfunc searchR1 str _in, int ps, int sh
	idx = -1
	in = _in
	max = strlen(in)
	repeat max, ps
		if peek(in, max-cnt) == sh : idx = max-cnt : break
	loop
return idx
// instr 右から検索版
#defcfunc instrl var s1, str s2
ind = 0
repeat
	res = instr(s1, ind, s2)
	if res == -1 : break
	ind += res + 1
loop
return ind-1
#defcfunc GetMacroName str _tmp, var macro, var const
	sdim tmp, 1024
	tmp = _tmp
	sdim macro, 128
	sdim const, 128
	flag = 0
	if instr(tmp, 0, "public const int ") != -1{
		flag = 1
		sdim res, 128
		split tmp, " ", res
		;markpos = -1
		repeat length(res)
			if res(cnt) == "="{
				tmpcnt = cnt
				// スペースの可能性を考慮して検索(マクロ名を取得)
				repeat tmpcnt
					tmpcnt--
					if res(tmpcnt) != ""{
						macro = res(tmpcnt)
						break
					}
				loop
				// スペースの場合があるので連結処理をする(定数値を取得)
				tmpcnt = cnt + 1	// 足しておく
				sdim tmpconst, 128
				repeat length(res)-tmpcnt, tmpcnt
					tmpconst += res(cnt)+" "
				loop
				// セミコロンを除去
				tmpconst = strtrim(tmpconst, 0, ' ')
				const = strtrim(tmpconst, 0, ';')
						//
			}
		loop
	}
return flag
// 戻り値の型を取得します。とれないときは空。
#defcfunc GetFuncReturn str _lineTmp, str _funcName
	sdim lineTmp, 1024
	lineTmp = _lineTmp
	if instr(lineTmp, 0, "extern") != -1{
		_posFuncName = instr(lineTmp, 0, _funcName)
		if _posFuncName != -1{
			_trimedFuncLine = strmid(lineTmp, 0, _posFuncName)
			strrep _trimedFuncLine, "extern unsafe static ", ""
			strrep _trimedFuncLine, "extern static ", ""
			strrep _trimedFuncLine, "\t", ""
			_trimedFuncLine = strtrim(_trimedFuncLine, 0, ' ')
			return _trimedFuncLine
		}
	}
return ""
#defcfunc GetFuncName str _tmp, var _fnc, array _arg, var _retType
	sdim tmp, 1024
	tmp = _tmp
	sdim _arg, 256 : sdim _fnc, 128
	num = -1
	if instr(tmp, 0, "extern") != -1{
		num = 0
		ks = instr(tmp, 0, "(")
		ke = instrl(tmp, ")")
		if ks != -1 | ke != -1{
			args = strmid(tmp, ks+1, ke-ks-1)
			tmp2 = strmid(tmp, 0, ks)
			tmp2 = strtrim(tmp2, 0, ' ')
			ps = searchR1(tmp2, 0, ' ')
			if ps != -1 {
				// 関数名を取得
				tmp3 = strmid(tmp2, ps, strlen(tmp2))
				_fnc = strtrim(tmp3, 0, ' ')

				// 末尾が_x64の場合(対象外として-1を返す)
				if "_x64" == strmid(_fnc, -1, strlen("_x64")){
					return -1
				}

				// 末尾が_x86の場合(取り除きます)
				if "_x86" == strmid(_fnc, -1, strlen("_x86")){
					_fnc = strmid(_fnc, 0, strlen(_fnc) - strlen("_x86"))
				}

				// 戻り値の型を取得
				_retType = GetFuncReturn(tmp, _fnc)

				// 引き続き引数を取得
				// 引数がないケースを取得
				cargs = args
				cargs = strtrim(cargs, 3, ' ')
				cargs = strtrim(cargs, 3, '\t')
				if cargs == "" : num = 0 : return num
				// 引数ありのケース
				sdim tmp2
				split args, ",", tmp2
				num = stat
				repeat num
					tmp3 = tmp2(cnt)
					tmp3 = strtrim(tmp3, 3, '\t')
					tmp3 = strtrim(tmp3, 0, ' ')
					ps = searchR1(tmp3, 0, ' ')
					if ps != -1{
						tmp4 = strmid(tmp3, 0, ps)
						tmp4 = strtrim(tmp4, 0, ' ')
						_arg(cnt) = tmp4
					}
				loop
			}
		}
	}
return num
#global

	dialog "cs",16
	if stat == 0 : end
	fname = refstr

	notesel buf
	noteload fname

	sdim def, 1024*512
	sdim fncs, 1024*512

	repeat notemax
		noteget tmp, cnt
		if GetMacroName(tmp, macro, const){
			def += "#define global "+ macro +" "+ const +"\n"
		}
		num = GetFuncName(tmp, fnc, arg, ret)
		if num != -1{
			sdim outargs
			repeat num
				// 引数で使われているものだけピックアップしているので構造体は全部ではない。
				if arg(cnt) == "int" || arg(cnt) == "ulong" || arg(cnt) == "uint" || arg(cnt) == "char"{
					outargs += "int"
				}else:if arg(cnt) == "System.Text.StringBuilder" || arg(cnt) == "string"{
					outargs += "str"
				}else:if arg(cnt) == "double"{
					outargs += "double"
				}else:if arg(cnt) == "float"{
					outargs += "float"
				}else:if arg(cnt) == "VECTOR"{
					outargs += "float,float,float"
				}else:if arg(cnt) == "VECTOR_D"{
					outargs += "double,double,double"
				}else:if arg(cnt) == "UV"{
					outargs += "float,float"
				}else:if arg(cnt) == "COLOR_F" || arg(cnt) == "FLOAT4"{
					outargs += "float,float,float,float"
				}else:if arg(cnt) == "COLOR_U8"{
					outargs += "int"
				}else:if arg(cnt) == "IPDATA" || arg(cnt) == "IPDATA_IPv6"{
					outargs += "int"
				}else:if arg(cnt) == "RECT" || arg(cnt) == "INT4"{	// ポインタとかは "RECT *" といった感じに来ます。
					outargs += "int,int,int,int"
				}else:if arg(cnt) == "MATRIX"{
					outargs += "float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float"
				}else:if arg(cnt) == "MATRIX_D"{
					outargs += "double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double"
				}else:if arg(cnt) == "MV1_COLL_RESULT_POLY"{
					outargs += "int,float,float,float,int,int,int,float,float,float,float,float,float,float,float,float,float,float,float"
				}else:if arg(cnt) == "MV1_REF_POLYGON"{
					outargs += "int,int,int,int,int,float,float,float,float,float,float"
				}else:if arg(cnt) == "MV1_REF_VERTEX"{
					outargs += "float,float,float,float,float,float"
				}else:if arg(cnt) == "MATERIALPARAM"{
					outargs += "float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float"
				}else:if arg(cnt) == "HITRESULT_LINE"{
					outargs += "int,float,float,float"
				}else:if arg(cnt) == "MV1_COLL_RESULT_POLY_DIM"{
					outargs += "int,int"
				}else:if arg(cnt) == "System.IntPtr"{
					outargs += "sptr"
				}else:if arg(cnt) == "void"{
					outargs += ""
				}else{
					// out~、*は気にしない
					// logmes arg(cnt)
					outargs += "sptr"
				}
				// 最後以外は , をつける
				if cnt != num - 1 : outargs += ","
			loop

			// 戻り値の型をチェックします(構造体のもの)
			retTypeStruct = 0
			if ((ret == "COLOR_F") || (ret == "COLOR_U8") || (ret == "DISPLAYMODEDATA") || (ret == "DOUBLE4") || (ret == "FLOAT4") || (ret == "HITRESULT_LINE") || (ret == "MATRIX") || (ret == "MATRIX_D") || 	(ret == "MV1_COLL_RESULT_POLY") ||(ret == "MV1_COLL_RESULT_POLY_DIM") || (ret == "VECTOR") ||(ret == "VECTOR_D")){
				retTypeStruct = 1
		 	}

		 	if retTypeStruct == 1{
				fncs += "// 戻り値が構造体です(" + ret +")\n// 第一引数に戻り値を返却します。パラメタは第二引数以降にずれます。\n"
				outargs = "var," + outargs
			}

			// 接頭辞の dx_ を外す(手抜き)
			split fnc, "dx_", fnc2
			fncs += "#func global "+ fnc2(1) +" \""+ fnc +"\" "+outargs+"\n"
		}
	loop

	def2 = {"// VECTOR => float, float, float
#define global ctype VGet(%1,%2,%3) %1, %2, %3
#define global ctype VAdd(%1,%2,%3,%4,%5,%6) %1+%4, %2+%5, %3+%6
#define global ctype VSub(%1,%2,%3,%4,%5,%6) %1-%4, %2-%5, %3-%6
#define global ctype VDot(%1,%2,%3,%4,%5,%6) %1*%4+%2*%5+%3*%6
#define global ctype VCross(%1,%2,%3,%4,%5,%6) %2*%6-%3*%5, %3*%4-%1*%6, %1*%5-%2*%4
#define global ctype VScale(%1,%2,%3,%4) %1*%4, %2*%4, %3*%4
#define global ctype VSquareSize(%1,%2,%3) %1*%1+%2*%2+%3*%3
// 行列だからdimの方が良いのか…(MATRIX 4x4)
#define global ctype VTransform(%1,%2,%3, %4,%5,%6,%7, %8,%9,%10,%11, %12,%13,%14,%15, %16,%17,%18,%19) %1*%4 + %2*%8 + %3*%12 + %16, %1*%5 + %2*%9 + %3*%13 + %17, %1*%6 + %2*%10 + %3*%14 + %18
#define global ctype VTransformSR(%1,%2,%3, %4,%5,%6,%7, %8,%9,%10,%11, %12,%13,%14,%15, %16,%17,%18,%19) %1*%4 + %2*%8 + %3*%12, %1*%5 + %2*%9 + %3*%13, %1*%6 + %2*%10 + %3*%14
// VConvFtoD, VConvDtoF未実装
#define global VGetD VGet
#define global VAddD VAdd
#define global VSubD VSub
#define global VDotD VDot
#define global VCrossD VCross
#define global VScaleD VScale
#define global VSquareSizeD VSquareSize
#define global VTransformD VTransform
#define global VTransformSRD VTransformSR
"}

	sdim outbuf, 1024*5120
	notesel outbuf
	noteadd "// "
	noteadd "// DxLib for HSP " + strf("(%04d/%02d/%02d)", gettime(0), gettime(1), gettime(3))
	noteadd "// http://hsp.moe/"
	noteadd "// https://twitter.com/hk1v"
	noteadd "// by inovia."
	noteadd "// "
	noteadd "// 【本モジュールを利用するにはC#版に付属しているDxLib.dllが必要です】"
	noteadd "// http://homepage2.nifty.com/natupaji/DxLib/dxdload.html"
	noteadd "// "
	noteadd "// ※本モジュールをスムーズに使用するには、構造体に対する理解が必要です。"
	noteadd "// また、C言語で書いてあるソースがそれとなく分かるぐらいの知識が必要です。"
	noteadd "// (世の中にあるDxLibのサンプルコードのほとんどがC/C++/C#なので)"
	noteadd "// HSPの知識だけですと、かなりきついと思います。"
	noteadd "// 推奨レベル:★★★★☆(Lv.4) 当社比...?"
	noteadd "// "
	noteadd "// 【旧バージョンのDxLib.as】"
	noteadd "// http://hsp.moe/download/DxLib_old.as"
	noteadd "// 【TIPS】"
	noteadd "// 構造体が戻り値の場合、HSPがクラッシュする問題(解決方法)"
	noteadd "// http://codetter.com/?p=1192"
	noteadd "// DxLib関連のサンプル(HSP用)"
	noteadd "// http://codetter.com/?extag=dxlib"
	noteadd "// HSPとDxLibで2D描画の基礎ら辺とか(えくー氏)"
	noteadd "// http://fe0km.blog.fc2.com/blog-entry-53.html"
	noteadd "// hspからDXlibの利用方法について"
	noteadd "// http://hsp.tv/play/pforum.php?mode=all&num=70321"
	noteadd "#ifndef __DXLIB__"
	noteadd "#define __DXLIB__"
	noteadd "// 定義ファイルのバージョン(=作成時のDxLibのバージョン+連番4桁数字)"
	noteadd "#define DEFINE_DXLIB_VERSION \"3.14f0000\""
	noteadd "#uselib \"DxLib.dll\""
	noteadd fncs
	noteadd def
	noteadd def2
	noteadd "#endif"
	notesave "DxLib.as"

	end

HSP 【HSP3】構造体を戻り値とするDXライブラリの関数をHSPで呼び出すテスト

// http://sprocket.babyblue.jp/html/hsp_koneta3.htm
#module
#defcfunc todouble int p1
	temp = 0.0
	lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
	lpoke temp, 0, p1 << 29
return temp
#global
;
#runtime "hsp3cl"
#include "DxLib.as"
;
// 【参考】元の形式
; #func global ConvWorldPosToScreenPos "dx_ConvWorldPosToScreenPos" float,float,float
;
// 第一引数に戻り値を格納するポインタを指定する(そのため、引数が1つずれます)
#func global _ConvWorldPosToScreenPos "dx_ConvWorldPosToScreenPos" var,float,float,float
;
	ChangeWindowMode TRUE			// ウィンドウモードになる
	SetDoubleStartValidFlag TRUE	// 多重起動を許可
;
	DxLib_Init
;
	px = 0.0f
	py = 0.0f
	pz = 100.0f
;
	; 戻り値を格納するVECTOR構造体(12bytes)
	dim VECTOR, 3
	_ConvWorldPosToScreenPos VECTOR, VGet(px, py, pz)
;
	; ポインタ(同じ値を指します)
	mes "ptr:" + stat
	mes "ptr:" + varptr(VECTOR)
;
	; 結果
	mes todouble(vector.0)
	mes todouble(vector.1)
	mes todouble(vector.2)
;

HSP 【HSP3】HSPから呼び出したDXライブラリを使ってMMD(.pmd)を表示してみる

// 参考
// http://blog.ness3.com/?p=2624

#include "DxLib.as"
// http://sprocket.babyblue.jp/html/hsp_koneta3.htm
#module
#defcfunc todouble int p1
	temp = 0.0
	lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
	lpoke temp, 0, p1 << 29
return temp
#global

	// アンチエイリアスの設定
	SetFullSceneAntiAliasingMode 4, 2
	// ウィンドウサイズと色数
	;SetGraphMode ginfo_dispx, ginfo_dispy, 32

	// ウィンドウモードにするか?
	ChangeWindowMode TRUE
	if stat != DX_CHANGESCREEN_OK : end

	DxLib_Init
	if stat == -1 : end
	SetDrawScreen DX_SCREEN_BACK

	onexit gosub *e

	// モデルデータを読み込む
	MV1LoadModel "MMD_YUKARI\\結月ゆかり.pmd"
	hModel = stat

	if hModel == -1 : dialog "失敗" : gosub *e

	// モデルの輪郭線の太さを変える
	/*
	MV1GetMaterialNum hModel
	repeat stat
        MV1GetMaterialOutLineDotWidth hModel, cnt
        MV1SetMaterialOutLineDotWidth hModel, cnt, todouble(stat)/2
	loop
	*/

	// 環境光色
	SetGlobalAmbientLight 0.5f, 0.5f, 0.5f, 0.0f

	// スケール
	;MV1SetScale hModel, 2.0f, 2.0f, 2.0f

	// カメラの 手前クリップ距離と 奥クリップ距離を設定
	SetCameraNearFar 10.0f, 10000.0f

	x = 0.0 : y = 20.0 : z = -20.0

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break

		RECT = -1, -1, -1, -1
		ClearDrawScreen varptr(RECT)

		CheckHitKey KEY_INPUT_UP
		if stat == 1 : y += 1.0

		CheckHitKey KEY_INPUT_DOWN
		if stat == 1 : y -= 1.0

		CheckHitKey KEY_INPUT_LEFT
		if stat == 1 : x -= 1.0

		CheckHitKey KEY_INPUT_RIGHT
		if stat == 1 : x += 1.0

		// カメラの位置と注視点をセット、注視点は原点
		SetCameraPositionAndTarget_UpVecY x, y, z, 0.0f, 10.0f, 0.0f

		//線の描画
		GetColor 255, 0, 0
		DrawLine3D VGet(0.0f, 0.0f, 0.0f), VGet(10000.0f, 0.0f, 0.0f), stat //X
		GetColor 0, 255, 0
		DrawLine3D VGet(0.0f, 0.0f, 0.0f), VGet(0.0f, 10000.0f, 0.0f), stat //Y
		GetColor 0, 0, 255
		DrawLine3D VGet(0.0f, 0.0f, 0.0f), VGet(0.0f, 0.0f, 10000.0f), stat //Z

		// モデルの描画
		MV1DrawModel hModel
		if stat == -1 : dialog "モデルの描画に失敗" : gosub *e

		ScreenFlip

		WaitTimer 10

		title "x:"+x+" y:"+y+" z:"+z

	loop

	gosub *e
stop

*e
	DxLib_End
	end
return

HSP 【HSP3】DXライブラリのDxDLL.cs(C#)をHSPのasに変換するアレ(手抜き)Ver.2

#module
// 指定オフセットから右から検索していき見つけた位置を返す。(1byteのみ)
#defcfunc searchR1 str _in, int ps, int sh
	idx = -1
	in = _in
	max = strlen(in)
	repeat max, ps
		if peek(in, max-cnt) == sh : idx = max-cnt : break
	loop
return idx
// instr 右から検索版
#defcfunc instrl var s1, str s2
ind = 0
repeat
	res = instr(s1, ind, s2)
	if res == -1 : break
	ind += res + 1
loop
return ind-1
#defcfunc GetMacroName str _tmp, var macro, var const
	sdim tmp, 1024
	tmp = _tmp
	sdim macro, 128
	sdim const, 128
	flag = 0
	if instr(tmp, 0, "public const int ") != -1{
		flag = 1
		sdim res, 128
		split tmp, " ", res
		;markpos = -1
		repeat length(res)
			if res(cnt) == "="{
				tmpcnt = cnt
				// スペースの可能性を考慮して検索(マクロ名を取得)
				repeat tmpcnt
					tmpcnt--
					if res(tmpcnt) != ""{
						macro = res(tmpcnt)
						break
					}
				loop
				// スペースの場合があるので連結処理をする(定数値を取得)
				tmpcnt = cnt + 1	// 足しておく
				sdim tmpconst, 128
				repeat length(res)-tmpcnt, tmpcnt
					tmpconst += res(cnt)+" "
				loop
				// セミコロンを除去
				tmpconst = strtrim(tmpconst, 0, ' ')
				const = strtrim(tmpconst, 0, ';')
						//
			}
		loop
	}
return flag
#defcfunc GetFuncName str _tmp, var _fnc, array _arg
	sdim tmp, 1024
	tmp = _tmp
	sdim _arg, 256 : sdim _fnc, 128
	num = -1
	if instr(tmp, 0, "extern") != -1{
		num = 0
		ks = instr(tmp, 0, "(")
		ke = instrl(tmp, ")")
		if ks != -1 | ke != -1{
			args = strmid(tmp, ks+1, ke-ks-1)
			tmp2 = strmid(tmp, 0, ks)
			tmp2 = strtrim(tmp2, 0, ' ')
			ps = searchR1(tmp2, 0, ' ')
			if ps != -1 {
				// 関数名を取得
				tmp3 = strmid(tmp2, ps, strlen(tmp2))
				_fnc = strtrim(tmp3, 0, ' ')

				// 引き続き引数を取得
				// 引数がないケースを取得
				cargs = args
				cargs = strtrim(cargs, 3, ' ')
				cargs = strtrim(cargs, 3, '\t')
				if cargs == "" : num = 0 : return num
				// 引数ありのケース
				sdim tmp2
				split args, ",", tmp2
				num = stat
				repeat num
					tmp3 = tmp2(cnt)
					tmp3 = strtrim(tmp3, 3, '\t')
					tmp3 = strtrim(tmp3, 0, ' ')
					ps = searchR1(tmp3, 0, ' ')
					if ps != -1{
						tmp4 = strmid(tmp3, 0, ps)
						tmp4 = strtrim(tmp4, 0, ' ')
						_arg(cnt) = tmp4
					}
				loop
			}
		}

	}
return num
#global

	dialog "cs",16
	if stat == 0 : end
	fname = refstr

	notesel buf
	noteload fname

	sdim def, 1024*512
	sdim fncs, 1024*512

	repeat notemax
		noteget tmp, cnt
		if GetMacroName(tmp, macro, const){
			def += "#define global "+ macro +" "+ const +"\n"
		}
		num = GetFuncName(tmp, fnc, arg)
		if num != -1{
			sdim outargs
			repeat num
				// 引数で使われているものだけピックアップしているので構造体は全部ではない。
				if arg(cnt) == "int" || arg(cnt) == "ulong"{
					outargs += "int"
				}else:if arg(cnt) == "System.Text.StringBuilder" || arg(cnt) == "string"{
					outargs += "str"
				}else:if arg(cnt) == "double"{
					outargs += "double"
				}else:if arg(cnt) == "float"{
					outargs += "float"
				}else:if arg(cnt) == "VECTOR"{
					outargs += "float,float,float"
				}else:if arg(cnt) == "UV"{
					outargs += "float,float"
				}else:if arg(cnt) == "COLOR_F" || arg(cnt) == "FLOAT4"{
					outargs += "float,float,float,float"
				}else:if arg(cnt) == "COLOR_U8"{
					outargs += "int"
				}else:if arg(cnt) == "IPDATA" || arg(cnt) == "IPDATA_IPv6"{
					outargs += "int"
				}else:if arg(cnt) == "RECT" || arg(cnt) == "INT4"{	// ポインタとかは "RECT *" といった感じに来ます。
					outargs += "int,int,int,int"
				}else:if arg(cnt) == "MATRIX"{
					outargs += "float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float"
				}else:if arg(cnt) == "MV1_COLL_RESULT_POLY"{
					outargs += "int,float,float,float,int,int,int,float,float,float,float,float,float,float,float,float,float,float,float"
				}else:if arg(cnt) == "MV1_REF_POLYGON"{
					outargs += "int,int,int,int,int,float,float,float,float,float,float"
				}else:if arg(cnt) == "MV1_REF_VERTEX"{
					outargs += "float,float,float,float,float,float"
				}else:if arg(cnt) == "MATERIALPARAM"{
					outargs += "float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float"
				}else{
					outargs += "sptr"
				}
				// 最後以外は , をつける
				if cnt != num - 1 : outargs += ","
			loop

			// 接頭辞の dx_ を外す(手抜き)
			split fnc, "dx_", fnc2
			fncs += "#func global "+ fnc2(1) +" \""+ fnc +"\" "+outargs+"\n"
		}
	loop

	def2 = {"// VECTOR => float, float, float
#define global ctype VGet(%1,%2,%3) %1, %2, %3
#define global ctype VAdd(%1,%2,%3,%4,%5,%6) %1+%4, %2+%5, %3+%6
#define global ctype VSub(%1,%2,%3,%4,%5,%6) %1-%4, %2-%5, %3-%6
#define global ctype VDot(%1,%2,%3,%4,%5,%6) %1*%4+%2*%5+%3*%6
#define global ctype VCross(%1,%2,%3,%4,%5,%6) %2*%6-%3*%5, %3*%4-%1*%6, %1*%5-%2*%4
#define global ctype VScale(%1,%2,%3,%4) %1*%4, %2*%4, %3*%4
#define global ctype VSquareSize(%1,%2,%3) %1*%1+%2*%2+%3*%3
// 行列だからdimの方が良いのか…(MATRIX 4x4)
#define global ctype VTransform(%1,%2,%3, %4,%5,%6,%7, %8,%9,%10,%11, %12,%13,%14,%15, %16,%17,%18,%19) %1*%4 + %2*%8 + %3*%12 + %16, %1*%5 + %2*%9 + %3*%13 + %17, %1*%6 + %2*%10 + %3*%14 + %18
#define global ctype VTransformSR(%1,%2,%3, %4,%5,%6,%7, %8,%9,%10,%11, %12,%13,%14,%15, %16,%17,%18,%19) %1*%4 + %2*%8 + %3*%12, %1*%5 + %2*%9 + %3*%13, %1*%6 + %2*%10 + %3*%14
"}

	sdim outbuf, 1024*512
	notesel outbuf
	noteadd "#ifndef __DXLIB__"
	noteadd "#define __DXLIB__"
	noteadd "#uselib \"DxLib.dll\""
	noteadd fncs
	noteadd def
	noteadd def2
	noteadd "#endif"
	notesave "DxLib.as"

	end

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(7.メニュー処理基本)

#runtime "hsp3cl"
#include "DxLib.as"

	// 処理ラベル型変数配列
	ldim Method, 3
	Method = *RedBoxDraw, *RandPsetPixel, *GDraw

	// 選択項目の文字列
	sdim String, 64, 3
	String = "赤い箱を描画する", "ランダムにドットを打つ", "グラデーションを描く"

*main

	//SetGraphMode 640, 480, 16
	ChangeWindowMode TRUE	// ウィンドウモードになる
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 選択ラベルの位置初期化
	SPoint = 0

	// 選択項目の数を取得&ついでに項目描画
	SenntakuNum = 0
	repeat length(String)
		GetColor 255, 255, 255
		DrawString 32, SenntakuNum * 32, String(SenntakuNum), stat
		SenntakuNum++
	loop

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break

		// 前のカーソル消去
		DrawBox 0, 0, 32, SenntakuNum * 32, 0, TRUE

		// カーソル描画
		GetColor 255, 255, 0
		DrawBox 0, SPoint * 32, 16, SPoint * 32 + 16, stat, TRUE

		// キー入力待ち
		WaitKey

		// キー入力に応じて処理
		// カーソル移動
		CheckHitKey KEY_INPUT_UP
		if ( (stat != 0) && (SPoint != 0) ) : SPoint--
		CheckHitKey KEY_INPUT_DOWN
		if ( (stat != 0) && (SPoint < SenntakuNum - 1) ) : SPoint++

		// 決定キー時処理
		CheckHitKey KEY_INPUT_Z
		if( stat != 0 ){
			// 項目に応じた処理を行う
			gosub Method(SPoint)

			// キー入力待ち
			WaitKey

			// ループから抜ける
			break
		}

	loop

	DxLib_End					// DXライブラリ使用の終了処理
end

stop
// 赤い箱を描画するラベル
*RedBoxDraw
	GetColor 255, 0, 0
	DrawBox 0, 0, 640, 480, stat, TRUE
return
// ランダムにドットを打つラベル
*RandPsetPixel
	repeat 1000
		GetRand 639
		r639 = stat
		GetRand 479
		r479 = stat
		GetRand 255
		r = stat
		GetRand 255
		g = stat
		GetRand 255
		b = stat
		GetColor r, g, b
		DrawPixel r639, r479, stat
	loop
return
// グラデーションを描くラベル
*GDraw
	repeat 480
		GetColor 255, 255, 255 * cnt / 480
		DrawLine 0, cnt, 640, cnt + 1, stat
	loop
return

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(6.サウンドノベル風文字列描画基本)

#runtime "hsp3cl"
#include "DxLib.as"

// 文字のサイズ
#define MOJI_SIZE 24

	DrawPointX = 0 : DrawPointY = 0	// 文字列描画の位置
	SP = 0 : CP = 0	// 参照する文字列番号と文字列中の文字の位置(ポインタ不使用)

	sdim String, 256, 11

	String(0) = " ゲームプログラムとは、いやプログラムとは"
	String(1) = "ある事柄を実現するプログラムの方法を説明されても理解できないことがある。B"
	String(2) = "@ なぜならそのプログラム技法も何かの基本的な技法の組み合わせで出来ているからだ。B"
	String(3) = "@ これはその他の学問も基本がわからないと応用が利かないということと同じ現象で、"
	String(4) = "別に特に珍しいことでもない。B"
	String(5) = "C しかしゲームプログラムとなると覚えなくてはならない基礎が沢山あり、"
	String(6) = "さらにある程度クオリティの高いソフトを作ろうとすると色々なプログラム技法を"
	String(7) = "習得しなくてはならない。B"
	String(8) = "@ しかもある程度レベルが高くなると自分で技法を編み出すか、技術レベルの高い"
	String(9) = "プログラマーに聞くなどするしか方法がなく大変厄介である。B"
	String(10) = "というかそのせいでゲームプログラムの敷居は高くなっているといえる。BE"

*main

	EndFlag = 0			// 終了フラグ
	sdim OneMojiBuf, 64	// 1文字分一時記憶

	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 描画位置の初期位置セット
	DrawPointX = 0
	DrawPointY = 0

	// 参照文字位置をセット
	SP = 0	// 1行目の
	CP = 0	// 0文字

	// フォントのサイズセット
	SetFontSize MOJI_SIZE

	// 終了フラグを倒す
	EndFlag = 0

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break

		Moji = peek(String(SP), CP)

		switch Moji
			case '@'	// 改行文字
				// 改行処理および参照文字位置を一つ進める
				gosub *Kaigyou
				CP++
			swbreak
			case 'B'	// ボタン押し待ち文字
				// ボタン押し待ちおよび参照文字位置を一つ進める
				WaitKey
				CP++
			swbreak
			case 'E'	// 終了文字
				// 終了フラグを立てるおよび参照文字位置を一つ進める
				EndFlag = 1
				CP++
			swbreak
			case 'C'	// クリア文字
				// 画面を初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
				ClearDrawScreen 0
				DrawPointY = 0
				DrawPointX = 0
				CP++
			swbreak
			default		// その他の文字
				// 1文字分抜き出す(2byteずつ)
				wpoke OneMojiBuf, 0, wpeek(String(SP), CP)

				// 1文字描画
				GetColor 255, 255, 255
				DrawString DrawPointX * MOJI_SIZE, DrawPointY * MOJI_SIZE, OneMojiBuf, stat

				// 参照文字位置を2バイト勧める
				CP+=2

				// カーソルを一文字文進める
				DrawPointX++

				// 少し待つ
				WaitTimer 10

				// 画面からはみ出たら改行する
				if( DrawPointX * MOJI_SIZE + MOJI_SIZE > 640 ) : gosub *Kaigyou

			swbreak
		swend
		// 終了フラグが1だったら終了する
		if( EndFlag == 1 ) : break

		// 参照文字列の終端まで行っていたら参照文字列を進める
		if ( Moji == 0 ){
			SP++
			CP = 0
		}

	loop

	DxLib_End					// DXライブラリ使用の終了処理
end

stop
// 改行
*Kaigyou
	TempGraph = 0

	// 描画行位置を一つ下げる
	DrawPointY++

	// 描画列を最初に戻す
	DrawPointX = 0

	// もし画面からはみ出るなら画面をスクロールさせる
	if( DrawPointY * MOJI_SIZE + MOJI_SIZE > 480 ){
		// テンポラリグラフィックの作成
		MakeGraph 640, 480
		TempGraph = stat

		// 画面の内容を丸々コピーする
		GetDrawScreenGraph 0, 0, 640, 480, TempGraph

		// 一行分上に貼り付ける
		DrawGraph 0, -MOJI_SIZE, TempGraph, FALSE

		// 一番下の行の部分を黒で埋める
		DrawBox 0, 480 - MOJI_SIZE, 640, 480, 0, TRUE

		// 描画行位置を一つあげる
		DrawPointY--

		// グラフィックを削除する
		DeleteGraph TempGraph
	}
return

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(5.シューティング基本)

#runtime "hsp3cl"
#include "DxLib.as"
// ショットの最大数
#define MAX_SHOT	4

	dim ShotValid, MAX_SHOT	// ショットが存在するか、フラグ
	dim ShotX, MAX_SHOT
	dim ShotY, MAX_SHOT		// ショットの位置

	Key = 0
	OldKey = 0	// 前のキー入力状態
	i = 0 : j = 0

	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にセット
	SetDrawScreen DX_SCREEN_BACK

	// プレイヤーの初期位置をセット
	PlayerX = 320
	PlayerY = 400

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break

		// キー入力取得
		OldKey = Key
		GetJoypadInputState DX_INPUT_KEY_PAD1
		Key = stat

		if( Key & PAD_INPUT_RIGHT ) : PlayerX += 3	// 右を押していたら右に進む
		if( Key & PAD_INPUT_LEFT ) : PlayerX -= 3	// 左を押していたら左に進む

		// ショットの移動処理
		for j, 0, MAX_SHOT, 1
			// ショットデータが無効だったらスキップ
			if( ShotValid(j) == 0 ) : _continue

			// 位置を上にずらす
			ShotY(j) -= 8

			// 画面外に出ていたらショットデータを無効にする
			if( ShotY(j) < -32 ) : ShotValid(j) = 0
		next

		// ショットボタンを押していたらショットを出す
		// 一つ前のループでショットボタンを押していたらショットは出さない
		// Zキーを押すとショット
		// C言語では
		// if( ( Key & ~OldKey ) & PAD_INPUT_A )
		// となっているが、~OldKey の ~ チルダは NOT演算子である。
		// HSPではNOT演算子がないので、OldKey^0xFFFFFFFF
		// とすることで対処している。
		// 詳しくは
		// http://hspdev-wiki.net/?HSP%B9%D6%BA%C2%2F%A5%D3%A5%C3%A5%C8%B1%E9%BB%BB#md54eaf4

		if( (Key&(OldKey^0xFFFFFFFF)) & PAD_INPUT_A ){
			// 使われていないショットデータを探す
			for j, 0, MAX_SHOT, 1
				if( ShotValid(j) == 0 ) : _break
			next
			// もし使われていないショットデータがあったらショットを出す
			if( j != MAX_SHOT ){
				// ショットの位置を設定
				ShotX(j) = PlayerX + 16
				ShotY(j) = PlayerY
					// ショットデータを使用中にセット
				ShotValid(j) = 1
			}
		}

		// 背景を黒でつぶす
		GetColor 0, 0, 0
		DrawBox 0, 0, 640, 480, stat, TRUE

		// プレイヤーを描画する
		GetColor 255, 0, 0
		DrawBox PlayerX, PlayerY, PlayerX + 48, PlayerY + 48, stat, TRUE

		// ショットを描画する
		for j, 0, MAX_SHOT, 1
			// ショットデータが有効な時のみ描画
			if( ShotValid(j) == 1 ){
				GetColor 255, 255, 255
				DrawBox ShotX(j), ShotY(j), ShotX(j) + 16, ShotY(j) + 16, stat, TRUE
			}
		next

		// 裏画面の内容を表画面に反映させる
		ScreenFlip
	loop

	DxLib_End				// DXライブラリ使用の終了処理
end

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(4.マップスクロール基本[スクロール滑らか版])

#runtime "hsp3cl"
#include "DxLib.as"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

#define MOVE_FRAME	32			// 移動にかけるフレーム数

	// マップのデータ
	dim MapData, MAP_WIDTH, MAP_HEIGHT
	MapData(0, 0) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	MapData(0, 1) = 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
	MapData(0, 2) = 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 3) = 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0
	MapData(0, 4) = 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0
	MapData(0, 5) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0
	MapData(0, 6) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 7) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 8) = 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 9) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 10) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 11) = 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 12) = 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 13) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 14) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 15) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

	Key = 0
	OldX = 0 :  OldY = 0 	// 移動する前のプレイヤーの位置を保存する変数

	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にセット
	SetDrawScreen DX_SCREEN_BACK

	// プレイヤーの初期位置をセット
	PlayerX = 2
	PlayerY = 2

	// 最初は停止中(0)にしておく
	Move = 0

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break

		// 移動中ではない場合キー入力を受け付ける
		if( Move == 0 ){

			// キー入力取得
			GetJoypadInputState DX_INPUT_KEY_PAD1
			Key = stat

			// 上を押していたら上に進む
			if( Key & PAD_INPUT_UP ) {
				Move = 1
				MoveX = 0
				MoveY = -1
			}
			// 下を押していたら下に進む
			if( Key & PAD_INPUT_DOWN ) {
				Move = 1
				MoveX = 0
				MoveY = 1
			}
			// 右を押していたら右に進む
			if( Key & PAD_INPUT_RIGHT ) {
				Move = 1
				MoveX = 1
				MoveY = 0
			}
			// 左を押していたら左に進む
			if( Key & PAD_INPUT_LEFT ) {
				Move = 1
				MoveX = -1
				MoveY = 0
			}

			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 ){
				if( MapData( PlayerX + MoveX, PlayerY + MoveY ) == 0 ){
					Move = 0
				}else{
					MoveCounter = 0
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0
			ScrollY = 0

		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 ){
			MoveCounter++
			// 移動処理が終了したら停止中にする
			if( MoveCounter == MOVE_FRAME ){
				Move = 0
				// プレイヤーの位置を変更する
				PlayerX += MoveX
				PlayerY += MoveY

				// 停止中は画面のスクロールは行わない
				ScrollX = 0
				ScrollY = 0
			}else{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME )
				ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME )
			}

		}

		// マップとプレイヤーを描画
		gosub *GraphDraw

		// 裏画面の内容を表画面に映す
		ScreenFlip

	loop

	DxLib_End				// DXライブラリ使用の終了処理
	end
stop
// マップとプレイヤーの描画
*GraphDraw
	j = 0 :  i = 0
	MapDrawPointX = 0
	MapDrawPointY = 0		// 描画するマップ座標値
	DrawMapChipNumX = 0
	DrawMapChipNumY = 0			// 描画するマップチップの数

	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 1
	DrawMapChipNumY = 480 / MAP_SIZE + 1

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - DrawMapChipNumX / 2
	MapDrawPointY = PlayerY - DrawMapChipNumY / 2

	// 背景を黒でつぶす
	GetColor 0, 0, 0
	DrawBox 0, 0, 640, 480, stat, TRUE

	// マップを描く
	for i, 0, DrawMapChipNumY, 1
		for j, 0, DrawMapChipNumX, 1
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 || j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) : _continue

			// マップデータが0だったら四角を描画する
			if( MapData(j + MapDrawPointX, i + MapDrawPointY) == 0 ){
				GetColor 255, 0, 0
				DrawBox j * MAP_SIZE + ScrollX, i * MAP_SIZE + ScrollY, j * MAP_SIZE + MAP_SIZE + ScrollX, i * MAP_SIZE + MAP_SIZE + ScrollY, stat, TRUE
			}
		next
	next

	// プレイヤーの描画
	GetColor 255, 255, 255
	DrawBox ( PlayerX - MapDrawPointX ) * MAP_SIZE, ( PlayerY - MapDrawPointY ) * MAP_SIZE, ( PlayerX - MapDrawPointX + 1 ) * MAP_SIZE, ( PlayerY - MapDrawPointY + 1 ) * MAP_SIZE, stat, TRUE
return

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(4.マップスクロール基本)

#runtime "hsp3cl"
#include "DxLib.as"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

	// マップのデータ
	dim MapData, MAP_WIDTH, MAP_HEIGHT
	MapData(0, 0) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	MapData(0, 1) = 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
	MapData(0, 2) = 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 3) = 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0
	MapData(0, 4) = 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0
	MapData(0, 5) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0
	MapData(0, 6) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 7) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 8) = 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 9) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 10) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 11) = 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 12) = 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 13) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 14) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 15) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

	Key = 0
	OldX = 0 :  OldY = 0 	// 移動する前のプレイヤーの位置を保存する変数

	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にセット
	SetDrawScreen DX_SCREEN_BACK

	// プレイヤーの初期位置をセット
	PlayerX = 2
	PlayerY = 2

	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break

		// キー入力取得
		GetJoypadInputState DX_INPUT_KEY_PAD1
		Key = stat

		// 移動する前のプレイヤーの位置を保存
		OldX = PlayerX
		OldY = PlayerY

		// 上を押していたら上に進む
		if( Key & PAD_INPUT_UP ) : PlayerY -= 1
		// 下を押していたら下に進む
		if( Key & PAD_INPUT_DOWN ) : PlayerY += 1
		// 右を押していたら右に進む
		if( Key & PAD_INPUT_RIGHT ) : PlayerX += 1
		// 左を押していたら左に進む
		if( Key & PAD_INPUT_LEFT ) : PlayerX -= 1

		// 進入不可能なマップだった場合は移動できない
		if( MapData( PlayerX, PlayerY ) == 0 ){
			PlayerX = OldX
			PlayerY = OldY
		}

		// マップとプレイヤーを描画
		gosub *GraphDraw

		// 裏画面の内容を表画面に映す
		ScreenFlip

		// ウエイト
		WaitTimer 100
	loop

	DxLib_End				// DXライブラリ使用の終了処理
	end
stop
// マップとプレイヤーの描画
*GraphDraw
	j = 0 :  i = 0
	MapDrawPointX = 0
	MapDrawPointY = 0		// 描画するマップ座標値
	DrawMapChipNumX = 0
	DrawMapChipNumY = 0			// 描画するマップチップの数

	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 1
	DrawMapChipNumY = 480 / MAP_SIZE + 1

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - DrawMapChipNumX / 2
	MapDrawPointY = PlayerY - DrawMapChipNumY / 2

	// 背景を黒でつぶす
	GetColor 0, 0, 0
	DrawBox 0, 0, 640, 480, stat, TRUE

	// マップを描く
	for i, 0, DrawMapChipNumY, 1
		for j, 0, DrawMapChipNumX, 1
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 || j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) : _continue

			// マップデータが0だったら四角を描画する
			if( MapData(j + MapDrawPointX, i + MapDrawPointY) == 0 ){
				GetColor 255, 0, 0
				DrawBox j * MAP_SIZE, i * MAP_SIZE, j * MAP_SIZE + MAP_SIZE, i * MAP_SIZE + MAP_SIZE, stat, TRUE
			}
		next
	next

	// プレイヤーの描画
	GetColor 255, 255, 255
	DrawBox ( PlayerX - MapDrawPointX ) * MAP_SIZE, ( PlayerY - MapDrawPointY ) * MAP_SIZE, ( PlayerX - MapDrawPointX + 1 ) * MAP_SIZE, ( PlayerY - MapDrawPointY + 1 ) * MAP_SIZE, stat, TRUE
return

HSP 【HSP3】DXライブラリをHSPで使ってみるサンプル(3.マップ表示基本)

#runtime "hsp3cl"
#include "DxLib.as"	

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	10			// マップの幅
#define MAP_HEIGHT	8			// マップの縦長さ

	// マップのデータ
	dim MapData, MAP_WIDTH, MAP_HEIGHT
	MapData(0, 0) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	MapData(0, 1) = 0, 1, 0, 0, 0, 0, 0, 0, 0, 0
	MapData(0, 2) = 0, 1, 0, 1, 1, 1, 1, 1, 1, 0
	MapData(0, 3) = 0, 1, 0, 1, 1, 0, 0, 0, 1, 0
	MapData(0, 4) = 0, 1, 1, 1, 1, 0, 0, 0, 1, 0
	MapData(0, 5) = 0, 1, 0, 1, 0, 0, 0, 0, 1, 0
	MapData(0, 6) = 0, 1, 1, 1, 1, 1, 1, 1, 1, 0
	MapData(0, 7) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	i = 0 : j = 0

	for i, 0, MAP_HEIGHT, 1
		for j, 0, MAP_WIDTH, 1
			if MapData(j, i) == 0{
				GetColor 255, 0, 0
				DrawBox j * MAP_SIZE, i * MAP_SIZE, j * MAP_SIZE + MAP_SIZE, i * MAP_SIZE + MAP_SIZE, stat, TRUE
			}
		next
	next

	WaitKey

	DxLib_End
end
Total Pages: 1 / 212

よく投稿されているコード

タグ

最近投稿されたコード