みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

NScripterでDXライブラリ!?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

NScripterでDXライブラリ!?

投稿記事 by みけCAT » 12年前

また変な言語でDXライブラリを使ってしまいました。
今度はなんと、NScripterです!

でも、さすがにNScripterでは一般的なDLLは扱えないので、DXライブラリを積んだNScripter用DLLを自作します。
とりあえず必要そうな関数のみ実装。エラー処理はとりあえず省略。

CODE:

#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;
}
これをコンパイルしてできたDLLをNScripterの実行ファイルと同じディレクトリに置き、
次にNScripterのスクリプトを書く。例えばこんな感じ。

CODE:

*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
これを実行すると、きちんと矢印キーで絵が動く。
nscrdxlib_ss.png
NScripterでDXライブラリ、スクリーンショット
しかも、Excelの時のようにDxLib_Endをするとプログラムが終了してしまうというようなこともない。
さらに、ベースがNScripterなので、printfデバッグのようなこともできるはず。
(ただし画面の表示範囲を超えてテキストを出力すると落ちるので注意)
構造体?なにそれ?おいしいの?

・・・
マジ誰得1000%です

一応プログラムも添付しておきました。よかったら使ってみてください。(笑)
添付ファイル

[拡張子 zip は無効化されているため、表示できません]

[拡張子 zip は無効化されているため、表示できません]


コメントはまだありません。