多语言展示
当前在线:1954今日阅读:39今日分享:10

如何使用AngelScript

前段时间琢磨了Urho3D的源码,其核心支持AngelScript脚本。包括随Urho3D引擎自带的editor都是使用AngelScript实现的。那么AngelScript到底是什么呢?本文仅做简单入门介绍,并使用vc++创建一个调用脚本的最简代码。
工具/原料
1

visual c++ 2017

2

AngelScript V2.31.2

方法/步骤
2

参考docs目录下的参考手册,我们可以很容易创建一个示例工程。具体方法为: a.创建一个空工程,加入以下代码。 b. 设置工程属性,包含sdk/angelscript/include和sdk/add_on目录,连接包含sdk/anglescript/lib目录。 c.使用#pragma comment(lib,'angelscript.lib')或在链接属性中加入angelscriptd.lib/angelscript.lib)。 d.将当前工程设置为MTD(Debug)/MT (Release)#include #include #include #include #include #include using namespace std;#pragma comment(lib,'angelscriptd.lib')void MessageCallback(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);}void print(string& str) { cout << str << endl;  }int main(){ auto* engine = asCreateScriptEngine(); auto r = engine->SetMessageCallback(asFUNCTION(MessageCallback),0,asCALL_CDECL); assert(r >= 0); RegisterStdString(engine); r = engine->RegisterGlobalFunction('void print(const string &in)', asFUNCTION(print), asCALL_CDECL); assert(r >= 0); CScriptBuilder builder; r = builder.StartNewModule(engine, 'MyModule');assert(r >= 0); r = builder.AddSectionFromFile('test.as');assert(r >= 0); r = builder.BuildModule();assert(r >= 0); auto* mod = engine->GetModule('MyModule'); auto* func = mod->GetFunctionByDecl('void main()'); assert(func != nullptr); auto* ctx = engine->CreateContext(); ctx->Prepare(func); r = ctx->Execute(); if (r != asEXECUTION_FINISHED){ if (r == asEXECUTION_EXCEPTION) { printf('An exception %s occurred,Please correct the code and try again.\n', ctx->GetExceptionFunction()); }   } ctx->Release(); engine->ShutDownAndRelease(); return 0;}

3

示例代码是注册文件名为test.as 的脚本文件。可以在编译后exe所在目录下建立此文件。内容为: void main(){ print ( 'Hello AngelScript !\n') ;}运行编译后的exe程序,即可看到控制台输出“Hello AngleScript!'。

4

原理解释: a. 脚本嵌入c++语言并使用的话,必须要先注册接口,接口包含函数,变量或类 b. 使用AngelScript,最好还要定义个message callback,这个回调函数用于在调用build和执行脚本出错时,能够直观确认why。否则,调试脚本异常困难。        c. 下一步就是加载编译脚本和执行脚本。目前加载编译脚本使用add_on目录中的script builder,使用CScriptBuilder,先调用StartNewModule构建一个module,再调用AddSectionFromFile加载脚本文件,然后BuidlModule,编译脚本。这3个函数都有返回值,在开发程序时一定要检验success后再进行下一步。       d.使用编译的module,先使用GetModule,找到需要调用的函数GetFunctionByDecl,创建上下文createContext,然后Prepare,再执行脚本函数Execute     e. 资源释放,释放上下文句柄,释放engine。

注意事项
1

总是检查注册函数的返回值,即调用engine->RegisterGlobalFunction时,要确保注册函数成功,否则函数注册不成功,后面的调用会引发异常。

2

定义Message callback回调函数,用于诊断调试脚本

3

总是检查脚本执行的返回值,即调用execute函数。

推荐信息