今度はなんと、NScripterです!
でも、さすがにNScripterでは一般的なDLLは扱えないので、DXライブラリを積んだNScripter用DLLを自作します。
とりあえず必要そうな関数のみ実装。エラー処理はとりあえず省略。
#include
#include
#include "DxLib.h"
BOOL APIENTRY DllMain (HINSTANCE hInst,DWORD reason,LPVOID reserved) {
return TRUE;
}
extern "C" {
__declspec(dllexport) BOOL NScrPlugInMain (HINSTANCE hinstance,HWND hwnd,char *param,int *ret_int,char *ret_str);
};
BOOL NScrPlugInMain (HINSTANCE hinstance,HWND hwnd,char *param,int *ret_int,char *ret_str) {
char command[1024];
*ret_int=0;
*ret_str=0;
sscanf(param,"%s",command);
if(lstrcmp(command,"DxLib_Init")==0) {
*ret_int=DxLib_Init();
} else if(lstrcmp(command,"DxLib_End")==0) {
*ret_int=DxLib_End();
} else if(lstrcmp(command,"ProcessMessage")==0) {
*ret_int=ProcessMessage();
} else if(lstrcmp(command,"ChangeWindowMode")==0) {
int Flag;
sscanf(param,"%*s%d",&Flag);
*ret_int=ChangeWindowMode(Flag);
} else if(lstrcmp(command,"ClearDrawScreen")==0) {
*ret_int=ClearDrawScreen();
} else if(lstrcmp(command,"GetColor")==0) {
int Red,Green,Blue;
sscanf(param,"%*s%d,%d,%d",&Red,&Green,&Blue);
*ret_int=GetColor(Red,Green,Blue);
} else if(lstrcmp(command,"SetDrawScreen")==0) {
char buffer[1024];
sscanf(param,"%*s%s",buffer);
if(lstrcmp(buffer,"DX_SCREEN_FRONT")==0) {
*ret_int=SetDrawScreen(DX_SCREEN_FRONT);
} else if(lstrcmp(buffer,"DX_SCREEN_BACK")==0) {
*ret_int=SetDrawScreen(DX_SCREEN_BACK);
} else {
*ret_int=-1;
}
} else if(lstrcmp(command,"ScreenFlip")==0) {
*ret_int=ScreenFlip();
} else if(lstrcmp(command,"LoadGraph")==0) {
char buffer[1024];
sscanf(param,"%*s%s",buffer);
*ret_int=LoadGraph(buffer);
} else if(lstrcmp(command,"DrawGraph")==0) {
int x,y,GrHandle,TransFlag;
sscanf(param,"%*s%d,%d,%d,%d",&x,&y,&GrHandle,&TransFlag);
*ret_int=DrawGraph(x,y,GrHandle,TransFlag);
} else if(lstrcmp(command,"WaitKey")==0) {
*ret_int=WaitKey();
} else if(lstrcmp(command,"CheckHitKey")==0) {
int KeyCode;
sscanf(param,"%*s%d",&KeyCode);
*ret_int=CheckHitKey(KeyCode);
} else {
*ret_int=-1;
}
return FALSE;
}
次にNScripterのスクリプトを書く。例えばこんな感じ。
*define
game
*start
DXライブラリのデモを起動します。@
exec_dll "nscdxlib.dll/ChangeWindowMode 1"
exec_dll "nscdxlib.dll/DxLib_Init"
exec_dll "nscdxlib.dll/SetDrawScreen DX_SCREEN_BACK"
exec_dll "nscdxlib.dll/LoadGraph cat.png"
getret %0
itoa $0,%0
mov %2,100
mov %3,100
*loopmain
exec_dll "nscdxlib.dll/ProcessMessage"
getret %1
if %1!=0 goto *loopend
exec_dll "nscdxlib.dll/ClearDrawScreen"
getret %1
if %1!=0 goto *loopend
exec_dll "nscdxlib.dll/CheckHitKey 1"
getret %1
if %1!=0 goto *loopend
*leftmove
if %2490 goto *downmove
exec_dll "nscdxlib.dll/CheckHitKey 205"
getret %1
if %1=1 add %2,3
*downmove
if %3>375 goto *moveend
exec_dll "nscdxlib.dll/CheckHitKey 208"
getret %1
if %1=1 add %3,3
*moveend
itoa $2,%2
itoa $3,%3
mov $1,"nscdxlib.dll/DrawGraph "+$2+","+$3+","+$0+",1"
exec_dll $1
exec_dll "nscdxlib.dll/ScreenFlip"
goto *loopmain
*loopend
exec_dll "nscdxlib.dll/DxLib_End"
DXライブラリのデモを終了しました。\
end
さらに、ベースがNScripterなので、printfデバッグのようなこともできるはず。
(ただし画面の表示範囲を超えてテキストを出力すると落ちるので注意)
構造体?なにそれ?おいしいの?
・・・
マジ誰得1000%です
一応プログラムも添付しておきました。よかったら使ってみてください。(笑)