DxLibの関数を登録
DxLibの描画用関数をグローバル関数として宣言してその関数をanglescriptに登録して、呼び出せるようにする。 当然引数の型、数はDxLibの関数と同じにする。
描画用に下記の関数を登録する。
DrawLine()
DrawBox()
DrawCircle()
DrawOval()
DrawTriangle()
DrawPixel()
グローバル関数はDxLibの関数とわかるようにする。DxLibの関数にmyをつけただけ。
//retutn int
int myDrawLine( int x1 , int y1 , int x2 , int y2 ,int Color )
{
int iRet = DrawLine( x1, y1, x2, y2, Color );
return iRet;
}
<textarea rows="8" cols="75" readonly="readonly">#include "CAngelScriptMgr.h" #include "CMoveObject.h" //#include <windows.h> // timeGetTime() #include "LogUtility.h" #define OK 0 #define NG -1 //angelscript,c++両方で使用できるグローバル変数を定義する float g_fdata = 0; float g_fx = 0; float g_fy = 0; int gg_itimer = 0; int g_LogLevel = LOG_WARN; //scriptひとつひとつ読み込み、ビルドに成功した場合bsuccessをtrueに設定しておく struct _ScriptList { char *scriptname; //angel script名 bool bsuccess; //scrptnameのangelscriptがビルドできたか }ScriptList[] = { { "resource/script/test11.as", false }, { "resource/script/test12.as",false }, { "resource/script/test13.as",false }, { "resource/script/dxlib_img_bgm_handle.as",false }, }; #define ANGEL_SCRIPT_NUM (sizeof(ScriptList)/sizeof(ScriptList[0]) ) //angle scritptないで使用するmethodがふえたらここに追加 //別々のscript(ファイル)にある関数でもここにはすべて記述する。 chDescriptionにはどのファイル名で定義してあるかも記述しておく //asIScriptContextのmethodでangelscriptから戻り値を受け取ることができるのは以下の型のみ //chFuncIDは戻り値の型が違う場合c++側で再コンパイルが必要 //GetReturnAddress(),GetReturnByte(),GetReturnDouble() //GetReturnDWord(),GetReturnFloat(),GetReturnObject() //GetReturnQWord(),GetReturnWord() //test13.asにはDxLibの関数をangelscriptから使用できるようにする。 //test11.asはテスト用 struct _AngelFuncList { int iID; //index、for,while 用途 char *chFuncID; //angle scriptのasIScriptContext->Prepare(funcId); のfuncIdに指定する文字列 char *chDescription; //angle script用の関数説明用 }AngelFuncList[] = { {0,"float test1()","print test file:test11.as"}, {1,"CMoveObject getscriptreturn()"," file:test11.as"}, {2,"CMoveObject getscriptreturn2( CMoveObject cmove )"," file:test11.as"}, {3,"void DxLibFuncTest()"," file:test13.as"}, {4,"int DrawLine_Test()"," file:test13.as"}, {5,"int DrawBox_Test()"," file:test13.as"}, {6,"int DrawCircle_Test()"," file:test13.as"}, {7,"int DrawOval_Test()"," file:test13.as"}, {8,"int DrawTriangle_Test()"," file:test13.as"}, {9,"int DrawPixel_Test()"," file:test13.as"}, {80,"int xupdate( CMoveObject &out cmove )"," file:test13.as"}, {100,"void SetGlobalArrayLength( uint itype, uint ilength )"," file:dxlib_img_bgm_handle.as"}, {101,"void SetHandle( uint itype, uint index, uint ihandle )"," file:dxlib_img_bgm_handle.as"}, {15,"float test2()"," file:test2.as"}, {16,"float TestCorutine()","corotine test file::test3.as"}, //{3,"int test4()",""}, }; //anglesciprtで使用する関数の数 #define ANGEL_FUNC_NUM (sizeof(AngelFuncList)/sizeof(AngelFuncList[0]) ) //scriptarray test asIScriptArray *floatArray = 0; asIScriptArray *stringArray = 0; //このクラスのコンストラクタで、angelscriptの関数類を使えるようにしておく CAngelScriptMgr::CAngelScriptMgr() : m_pasengine( NULL ),m_pasmod( NULL ),m_pasctx( NULL ), m_pcontextMgr( NULL ), m_dwTimeOut( 1000 ) { int iRet = OK; m_mapAngelfunc.clear(); //angelscriptのengine初期化 iRet = InitializeAngelEngine(); assert( iRet >= 0 ); //c++,angelscript両方で使用する変数登録 iRet = RegisterProperty(); assert( iRet >= 0 ); //angelscriptで使用したいc++のクラスを登録 iRet = RegisterMyClass(); assert( iRet >= 0 ); //angelscriptをひとつひとつ読み込みビルドできるかcheck iRet = CheckBuild(); assert( iRet >= 0 ); SetAngelFuncMap(); } CAngelScriptMgr::~CAngelScriptMgr() { if( m_pasctx != NULL ) { m_pasctx->Release(); } if( m_pasengine != NULL ) { m_pasengine->Release(); } if( m_pcontextMgr != NULL ) { delete m_pcontextMgr; m_pcontextMgr = NULL; } if( m_pasmod != NULL ) { m_pasmod = NULL; } m_mapAngelfunc.clear(); } void CAngelScriptMgr::CommonErrorMsg() { int ifuncid = m_pasctx->GetExceptionFunction(); asIScriptFunction *func = m_pasengine->GetFunctionDescriptorById( ifuncid ); cout << "func: " << func->GetDeclaration() << endl; cout << "modl: " << func->GetModuleName() << endl; cout << "sect: " << func->GetScriptSectionName() << endl; cout << "line: " << m_pasctx->GetExceptionLineNumber() << endl; cout << "desc: " << m_pasctx->GetExceptionString() << endl; PUT_LOG( g_LogLevel,"func:%s\n",func->GetDeclaration() ); PUT_LOG( g_LogLevel,"modl:%s\n", func->GetModuleName() ); PUT_LOG( g_LogLevel,"sect:%s\n", func->GetScriptSectionName() ); PUT_LOG( g_LogLevel,"line:%d\n", m_pasctx->GetExceptionLineNumber() ); PUT_LOG( g_LogLevel,"line:%d\n", m_pasctx->GetExceptionString() ); func->Release(); } void CAngelScriptMgr::DisplayErrorMsg( int err ) { int ifuncid = m_pasctx->GetExceptionFunction(); asIScriptFunction *func = m_pasengine->GetFunctionDescriptorById( ifuncid ); //エラー内容によってメッセージを分ける。coutはコマンドライン用、PUT_LOGはOutputDebugPrintを使い //どちらでもメッセージが出力されるようにする switch( err ) { case asEXECUTION_ABORTED: cout << "The script was aborted before it could finish. Probably it timed out." << endl; PUT_LOG( g_LogLevel,"The script was aborted before it could finish. Probably it timed out.\n" ); break; case asEXECUTION_EXCEPTION: cout << "The script ended with an exception." << endl; PUT_LOG( g_LogLevel,"The script ended with an exception.\n" ); //共通エラーメッセージ CommonErrorMsg(); break; case asEXECUTION_ERROR: cout << "The script ended with an exception error." << endl; PUT_LOG( g_LogLevel,"The script ended with an exception error.\n" ); //共通エラーメッセージ CommonErrorMsg(); default: cout << "Unknown error " << endl; PUT_LOG( g_LogLevel,"Unknown error.\n" ); break; } } //angelscript内の関数に時間がかかる場合はabortを投げて例外終了させる void LineCallback2( asIScriptContext *ctx, DWORD *timeOut ) { // If the time out is reached we abort the script if( *timeOut < timeGetTime() ) { ctx->Abort(); } // It would also be possible to only suspend the script, // instead of aborting it. That would allow the application // to resume the execution where it left of at a later // time, by simply calling Execute() again. } //angelscript前にタイムアウト時間やmapにあるangelscriptのfuncIDを取得する。 int CAngelScriptMgr::Before_Excute( int index ) { int iRet = OK; CAngelMap mapdata; //int ifuncid = m_mapAngelfunc[string(chFunc)]; mapdata = m_mapAngelfunc[index]; // Create our context, prepare it, and then execute m_pasctx = m_pasengine->CreateContext(); //anglescriptの関数を実行するための準備 m_pasctx->Prepare( mapdata.iAngelFuncID ); // We don't want to allow the script to hang the application, e.g. with an // infinite loop, so we'll use the line callback function to set a timeout // that will abort the script after a certain time. Before executing the // script the timeOut variable will be set to the time when the script must // stop executing. DWORD timeOut; iRet = m_pasctx->SetLineCallback( asFUNCTION( LineCallback2 ), &timeOut, asCALL_CDECL ); if( iRet < 0 ) { cout << "Failed to set the line callback function." << endl; PUT_LOG( g_LogLevel,"Failed to set the line callback function.\n" ); return NG; } // Set the timeout before executing the function. Give the function 1 sec // to return before we'll abort it. // timeoutは1秒(1000ミリ秒)にしておく。SetScriptTimeOutで指定されていればその値 timeOut = timeGetTime() + m_dwTimeOut; return iRet; } int CAngelScriptMgr::Excute( int index, int &iret ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { iret = m_pasctx->GetReturnDWord(); } return iRet; } //この関数では戻り値float,引数なしの関数を実行する //indexにしていするのはAngelFuncList[]のインデックス値 int CAngelScriptMgr::Excute( int index, float &fret ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { fret = m_pasctx->GetReturnFloat(); } return iRet; } //この関数では戻り値float,引数なしの関数を実行する //indexにしていするのはAngelFuncList[]のインデックス値 int CAngelScriptMgr::Excute( int index,double &dret ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { dret = m_pasctx->GetReturnDouble(); } return iRet; } //この関数では戻り値byte,引数なしの関数を実行する //indexにしていするのはAngelFuncList[]のインデックス値 int CAngelScriptMgr::Excute( int index,BYTE &byte ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { byte = m_pasctx->GetReturnByte(); } return iRet; } //この関数では戻り値WORD,引数なしの関数を実行する //indexにしていするのはAngelFuncList[]のインデックス値 int CAngelScriptMgr::Excute( int index,WORD &word ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { word = m_pasctx->GetReturnWord(); } return iRet; } //この関数では戻り値WORD,引数なしの関数を実行する //indexにしていするのはAngelFuncList[]のインデックス値 int CAngelScriptMgr::Excute( int index,DWORD &dword ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { dword = m_pasctx->GetReturnDWord(); } return iRet; } //angelscritの引数をセットする int CAngelScriptMgr::Excute( int index,CMoveObject *ret ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angelscriptに引数をセット,複数の引数にする場合クラスにまとめた方がよさそう //angelscriptの第1引数は0,第2引数は1を指定する。 //引数リストを別クラスにしてある場合はvoid*にキャストしてからangelscriptの関数の引数に登録する。 iRet = m_pasctx->SetArgObject( 0,(void*)ret ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { //void*にキャストした後CMoveObject*にする必要がある *ret = *(CMoveObject*)(void*)m_pasctx->GetReturnObject(); } return iRet; } //DWORD(int,long,word,dword)の値を引数にしてangelscript int CAngelScriptMgr::Excute( int index,DWORD *dret, DWORD dwarg0, DWORD dwarg1, DWORD dwarg2 ) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angelscriptに引数をセット,複数の引数にする場合クラスにまとめた方がよさそう //angelscriptの第1引数は0,第2引数は1を指定する。 //引数リストを別クラスにしてある場合はvoid*にキャストしてからangelscriptの関数の引数に登録する。 //iRet = m_pasctx->SetArgObject( 0,(void*)ret ); if( dwarg0 != -1 ) { iRet = m_pasctx->SetArgDWord( 0,dwarg0 ); assert( iRet >= 0 ); } if( dwarg0 != -1 && dwarg1 != -1 ) { iRet = m_pasctx->SetArgDWord( 0,dwarg1 ); assert( iRet >= 0 ); } if( dwarg0 != -1 && dwarg1 != -1 && dwarg2 != -1 ) { iRet = m_pasctx->SetArgDWord( 0,dwarg2 ); assert( iRet >= 0 ); } if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { //void*にキャストした後CMoveObject*にする必要がある *dret = m_pasctx->GetReturnDWord(); } return iRet; } //floatの値を引数、戻り値もfloatのangelscriptを実行 int CAngelScriptMgr::Excute( int index,float *fret, float farg0, float farg1, float farg2) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angelscriptに引数をセット,複数の引数にする場合クラスにまとめた方がよさそう //angelscriptの第1引数は0,第2引数は1を指定する。 //引数リストを別クラスにしてある場合はvoid*にキャストしてからangelscriptの関数の引数に登録する。 //iRet = m_pasctx->SetArgObject( 0,(void*)ret ); if( farg0 != -1 ) { iRet = m_pasctx->SetArgFloat( 0,farg0 ); assert( iRet >= 0 ); } if( farg0 != -1 && farg1 != -1 ) { iRet = m_pasctx->SetArgFloat( 0,farg1 ); assert( iRet >= 0 ); } if( farg0 != -1 && farg1 != -1 && farg2 != -1 ) { iRet = m_pasctx->SetArgFloat( 0,farg2 ); assert( iRet >= 0 ); } if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { //void*にキャストした後CMoveObject*にする必要がある *fret = m_pasctx->GetReturnFloat(); } return iRet; } //関数の成功、失敗を確認しないバージョン,angelscriptでアップでーとした値は第2引数に格納する。 //この関数はうまく動作していない int CAngelScriptMgr::Excute2( int index,CMoveObject &ret) { int iRet = OK; iRet = Before_Excute( index ); if( iRet != 0 ) { return NG; } //angelscriptに引数をセット,複数の引数にする場合クラスにまとめた方がよさそう //angelscriptの第1引数は0,第2引数は1を指定する。 //引数リストを別クラスにしてある場合はvoid*にキャストしてからangelscriptの関数の引数に登録する。 iRet = m_pasctx->SetArgObject( 0,(void*)&ret ); if( iRet != 0 ) { return NG; } //angel scriptの実行 iRet = m_pasctx->Execute(); //angelscript内の関数に実行した場合、エラー表示を行う if( iRet != asEXECUTION_FINISHED ) { DisplayErrorMsg( iRet ); } else { //void*にキャストした後CMoveObject*にする必要がある //*ret = *(CMoveObject*)(void*)m_pasctx->GetReturnObject(); } return OK; } int CAngelScriptMgr::GetAngelFuncNum() { return m_mapAngelfunc.size(); } int CAngelScriptMgr::SetAngelFuncMap() { int iRet = OK; int iangelfuncnum = 0; for( int i = 0; i < ANGEL_SCRIPT_NUM; i++) { //buildに成功したangelscriptのみ読み込み if( ScriptList[i].bsuccess == true ) { LoadScript( ScriptList[i].scriptname ); iangelfuncnum++; } } //使用できるangelscriptのみモジュールとしてbuild BuildAngelScript(); for( int i = 0; i < ANGEL_FUNC_NUM; i++) { //anglescript内でのc++の関数のfuncidを取得しておく int ifuncid = m_pasmod->GetFunctionIdByDecl( AngelFuncList[i].chFuncID ); if( ifuncid < 0 ) { printf("The script must have the function %s. Please add it and try again.\n",AngelFuncList[i].chFuncID ); PUT_LOG( g_LogLevel,"The script must have the function %s. Please add it and try again.\n",AngelFuncList[i].chFuncID ); continue; } CAngelMap angeldata; angeldata.iAngelFuncID = ifuncid; angeldata.strFuncName = string( AngelFuncList[i].chFuncID ); m_mapAngelfunc[i] = angeldata; } return iRet; } int CAngelScriptMgr::CheckBuild() { int iRet = OK; for( int i = 0; i < ANGEL_SCRIPT_NUM; i++) { iRet = LoadScript( ScriptList[i].scriptname ); if( iRet == OK ) { iRet = BuildAngelScript(); if( iRet == OK ) { //angelscriptのビルドに成功したらtrueに設定しておく ScriptList[i].bsuccess = true; } else { printf("faile build script name %s\n",ScriptList[i].scriptname ); PUT_LOG( g_LogLevel,"faile build script name %s\n",ScriptList[i].scriptname ); } } } return iRet; } int CAngelScriptMgr::LoadScript( char *ScriptName ) { int iRet = OK; FILE *f = fopen(ScriptName, "rb"); if ( f == NULL ) { printf(" file not found\n"); PUT_LOG( g_LogLevel,"file not found\n"); return NG; } fseek(f, 0, SEEK_END); //file sizeを取得する int len = ftell( f ); fseek( f, 0, SEEK_SET ); std::string script; script.resize(len); size_t c = fread( &script[0], len, 1, f ); fclose(f); //scriptのファイル名でセクションを登録する。 iRet = m_pasmod->AddScriptSection( ScriptName, &script[0], len ); return iRet; } //この関数はangelscriptひとつひとつチェックした後 //buildに成功したすべてのangelscriptをモジュールとして再Buildする。 int CAngelScriptMgr::BuildAngelScript() { int iRet = OK; iRet = m_pasmod->Build(); if( iRet < 0 ) { printf("angel script build failed\n" ); PUT_LOG( g_LogLevel,"angel script build failed\n"); return NG; } return iRet; } void MessageCallback2( const asSMessageInfo *msg, void *param ) { const char *type = "ERR "; if( msg->type == asMSGTYPE_WARNING ) { type = "WARN"; } else if( msg->type == asMSGTYPE_INFORMATION ) { type = "INFO"; } printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message); PUT_LOG( g_LogLevel,"%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message ); } void print2( string &msg ) { std::cout << msg << std::endl; } void print2( int num ) { std::cout << num << std::endl; } void print2( asUINT num ) { std::cout << num << std::endl; } void print2( float num ) { std::cout << num << std::endl; } void print2( double num ) { std::cout << num << std::endl; } //retutn int int myDrawLine( int x1 , int y1 , int x2 , int y2 ,int Color ) { int iRet = DrawLine( x1, y1, x2, y2, Color ); return iRet; } int myDrawBox( int x1 , int y1 , int x2 , int y2 ,int Color , int FillFlag ) { int iRet = DrawBox( x1 , y1 , x2 , y2 , Color , FillFlag ); return iRet; } int myDrawCircle( int x , int y , int r , int Color, int FillFlag ) { int iRet = DrawCircle( x , y , r , Color, FillFlag ); return iRet; } int myDrawOval( int x , int y , int rx , int ry , int Color , int FillFlag ) { int iRet = DrawOval( x , y , rx , ry , Color , FillFlag ) ; return iRet; } int myDrawTriangle( int x1,int y1,int x2,int y2,int x3,int y3,int Color,int FillFlag ) { int iRet = DrawTriangle( x1, y1, x2, y2, x3, y3, Color, FillFlag ) ; return iRet; } int myDrawPixel( int x, int y, int Color ) { int iRet = DrawPixel( x , y , Color ) ; return iRet; } int CAngelScriptMgr::RegisterProperty() { int iRet = OK; iRet = m_pasengine->RegisterGlobalProperty("float g_fdata", &g_fdata); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalProperty("float g_fx", &g_fx); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalProperty("float g_fy", &g_fy); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalProperty("int gg_itimer", &gg_itimer); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalProperty("float[] @floatArray", &floatArray); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalProperty("string[] @stringArray",&stringArray); assert( iRet >= 0 ); return iRet; } int CAngelScriptMgr::RegisterMyClass() { //CMoveObject.hにあるクラスを登録 int iRet = OK; iRet = m_pasengine->RegisterObjectType("CMoveObject", sizeof(CMoveObject), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fx", offsetof(CMoveObject, fx)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fy", offsetof(CMoveObject, fy)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fwidth", offsetof(CMoveObject, fwidth)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fheight", offsetof(CMoveObject, fheight)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fhitradius", offsetof(CMoveObject, fhitradius)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float facceleration", offsetof(CMoveObject, facceleration)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fdirection", offsetof(CMoveObject, fdirection)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fspeed", offsetof(CMoveObject, fspeed)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fangle", offsetof(CMoveObject, fangle)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float finterval", offsetof(CMoveObject, finterval)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float flevel", offsetof(CMoveObject, flevel)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fkind", offsetof(CMoveObject, fkind)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fcolor", offsetof(CMoveObject, fcolor)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float falpha", offsetof(CMoveObject, falpha)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float falive", offsetof(CMoveObject, falive)); assert( iRet >= 0 ); iRet = m_pasengine->RegisterObjectProperty("CMoveObject", "float fscale", offsetof(CMoveObject, fscale)); assert( iRet >= 0 ); return iRet; } int CAngelScriptMgr::InitializeAngelEngine() { PUT_LOG( g_LogLevel,"start\n" ); int iRet = OK; // Create the script engine m_pasengine = asCreateScriptEngine(ANGELSCRIPT_VERSION); //SHIFT-JIS対応 m_pasengine->SetEngineProperty(asEP_SCRIPT_SCANNER ,0); // Set the message callback to receive information on errors in human readable form. // It's recommended to do this right after the creation of the engine, because if // some registration fails the engine may send valuable information to the message // stream. iRet = m_pasengine->SetMessageCallback( asFUNCTION( MessageCallback2 ), 0, asCALL_CDECL ); assert( iRet >= 0 ); if( iRet < 0 ) { printf("failed Message Callback\n" ); PUT_LOG( g_LogLevel,"failed Message Callback\n" ); return NG; } m_pasmod = m_pasengine->GetModule( 0, asGM_ALWAYS_CREATE ); if( iRet < 0 ) { printf("failed GetModule\n" ); PUT_LOG( g_LogLevel,"failed GetModule\n" ); return NG; } // AngelScript doesn't have a built-in string type, as there is no definite standard // string type for C++ applications. Every developer is free to register it's own string type. // The SDK do however provide a standard add-on for registering a string type, so it's not // necessary to implement the registration yourself if you don't want to. RegisterStdString( m_pasengine ); //anglescript側でprint(string),print(型)でそれぞれの値を表示できるようにする。print系は複数 //GUIやwindow関連では以下のprint関数は使えないため無意味 iRet = m_pasengine->RegisterGlobalFunction( "void print(const string &in)", asFUNCTIONPR(print2, (string &in), void), asCALL_CDECL ); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalFunction( "void print(int)", asFUNCTIONPR(print2, (int), void), asCALL_CDECL ); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalFunction( "void print(float)", asFUNCTIONPR(print2, (float), void), asCALL_CDECL ); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalFunction( "void print(uint)", asFUNCTIONPR(print2, (asUINT), void), asCALL_CDECL ); assert( iRet >= 0 ); iRet = m_pasengine->RegisterGlobalFunction( "void print(double)", asFUNCTIONPR(print2, (double), void), asCALL_CDECL ); assert( iRet >= 0 ); RegisterDxLibFunction(); RegisterScriptAny( m_pasengine ); // Add the support for co-routines m_pcontextMgr = new CContextMgr(); m_pcontextMgr->RegisterCoRoutineSupport( m_pasengine ); return iRet; } int CAngelScriptMgr::RegisterDxLibFunction() { //DxLibの関数をAngelScriptから呼べるようにする //命名規則はmy<DxLib関数名>で登録する int iRet = -1; //DxLibのDrawLineの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawLine(int, int, int, int, int )", asFUNCTIONPR(myDrawLine, (int, int, int, int, int), int), asCALL_CDECL ); assert( iRet >= 0 ); //DxLibのDrawBoxの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawBox( int, int, int, int, int, int )", asFUNCTIONPR(myDrawBox, ( int, int, int, int, int, int ), int), asCALL_CDECL ); assert( iRet >= 0 ); //DxLibのDrawCircleの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawCircle( int, int, int, int, int )", asFUNCTIONPR(myDrawCircle, ( int, int, int, int, int ), int), asCALL_CDECL ); assert( iRet >= 0 ); //DxLibのDrawOvalの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawOval( int, int, int, int, int, int )", asFUNCTIONPR(myDrawOval, ( int, int, int, int, int, int ), int), asCALL_CDECL ); assert( iRet >= 0 ); //DxLibのDrawTriangleの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawTriangle( int, int, int, int, int, int, int, int )", asFUNCTIONPR(myDrawTriangle, ( int, int, int, int, int, int, int, int ), int), asCALL_CDECL ); assert( iRet >= 0 ); //DxLibのDrawPixelの登録 iRet = m_pasengine->RegisterGlobalFunction( "int DrawPixel( int, int, int )", asFUNCTIONPR(myDrawPixel, ( int, int, int ), int), asCALL_CDECL ); assert( iRet >= 0 ); return iRet; } void CAngelScriptMgr::SetScriptTimeOut( DWORD dwMsec ) { //angelscriptの実行タイムアウト設定 m_dwTimeOut = dwMsec; } DWORD CAngelScriptMgr::GetScriptTimeOut() { //angelscriptのタイムアウト時間 return m_dwTimeOut; } </textarea>
</form> <form>DxLibの関数をよぶangelscript
<textarea rows="8" cols="75" readonly="readonly"> //このスクリプトはDxLibの関数を呼び出しように使う //それ以外の関数はここでは登録しない void DxLibFuncTest() { // DrawLine( 0, 0, 400,500 ,248 ); // DrawBox( 400 , 100 , 20 , 20 ,100 , 1 ); // DrawCircle( 300 , 300 , 3 , 200, 0 ); // DrawOval( 300, 20 , 45 , 45 ,128 , 0 ); // DrawTriangle( 20,20,100,100,200,200,128,0 ); // DrawPixel( 100,200,255 ); } int DrawLine_Test() { return DrawLine( 0, 0, 400,500 ,128 ); } int DrawBox_Test() { return DrawBox( 400 , 100 , 20 , 20 ,100 , 1 ); } int DrawCircle_Test() { return DrawCircle( 300 , 300 , 3 , 200, 0 ); } int DrawOval_Test() { return DrawOval( 300, 200 , 45 , 45 ,128 , 0 ); } int DrawTriangle_Test() { return DrawTriangle( 200,20,100,100,300,200,128,0 ); } int DrawPixel_Test() { return DrawPixel( 300,290,128 ); } </textarea>
</form>
※コメント投稿者のブログIDはブログ作成者のみに通知されます