Codetterからコピペする際、空行にゴミが混入するので、削除してから使ってください。(コンパイルエラーになります)
関数と定数が DxLib.as として出力されます。めっちゃ手抜きです。構造体が戻り値で使用されているものに対応。
出力結果: http://hsp.moe/download/DxLib.as
Codetterからコピペする際、空行にゴミが混入するので、削除してから使ってください。(コンパイルエラーになります)
関数と定数が DxLib.as として出力されます。めっちゃ手抜きです。構造体が戻り値で使用されているものに対応。
出力結果: http://hsp.moe/download/DxLib.as
#module// 指定オフセットから右から検索していき見つけた位置を返す。(1byteのみ)#defcfunc searchR1 str _in, int ps, int shidx = -1in = _inmax = strlen(in)repeat max, psif peek(in, max-cnt) == sh : idx = max-cnt : breakloopreturn idx// instr 右から検索版#defcfunc instrl var s1, str s2ind = 0repeatres = instr(s1, ind, s2)if res == -1 : breakind += res + 1loopreturn ind-1#defcfunc GetMacroName str _tmp, var macro, var constsdim tmp, 1024tmp = _tmpsdim macro, 128sdim const, 128flag = 0if instr(tmp, 0, "public const int ") != -1{flag = 1sdim res, 128split tmp, " ", res;markpos = -1repeat length(res)if res(cnt) == "="{tmpcnt = cnt// スペースの可能性を考慮して検索(マクロ名を取得)repeat tmpcnttmpcnt--if res(tmpcnt) != ""{macro = res(tmpcnt)break}loop// スペースの場合があるので連結処理をする(定数値を取得)tmpcnt = cnt + 1 // 足しておくsdim tmpconst, 128repeat length(res)-tmpcnt, tmpcnttmpconst += res(cnt)+" "loop// セミコロンを除去tmpconst = strtrim(tmpconst, 0, ' ')const = strtrim(tmpconst, 0, ';')//}loop}return flag// 戻り値の型を取得します。とれないときは空。#defcfunc GetFuncReturn str _lineTmp, str _funcNamesdim lineTmp, 1024lineTmp = _lineTmpif 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 _retTypesdim tmp, 1024tmp = _tmpsdim _arg, 256 : sdim _fnc, 128num = -1if instr(tmp, 0, "extern") != -1{num = 0ks = 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 = argscargs = strtrim(cargs, 3, ' ')cargs = strtrim(cargs, 3, '\t')if cargs == "" : num = 0 : return num// 引数ありのケースsdim tmp2split args, ",", tmp2num = statrepeat numtmp3 = 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#globaldialog "cs",16if stat == 0 : endfname = refstrnotesel bufnoteload fnamesdim def, 1024*512sdim fncs, 1024*512repeat notemaxnoteget tmp, cntif GetMacroName(tmp, macro, const){def += "#define global "+ macro +" "+ const +"\n"}num = GetFuncName(tmp, fnc, arg, ret)if num != -1{sdim outargsrepeat 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 = 0if ((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_", fnc2fncs += "#func global "+ fnc2(1) +" \""+ fnc +"\" "+outargs+"\n"}loopdef2 = {"// 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*5120notesel outbufnoteadd "// "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 fncsnoteadd defnoteadd def2noteadd "#endif"notesave "DxLib.as"end