1、从官方下载SDK包,将SDK包解压后,可以看到有add_on,angelscript,docs,samples 4个文件夹。其中angelscript文件目录下projects目录下对应各类编译器的工程文件。选择对应的工程版本,直接打开即可正确编译。本文使用vs2017进行编译,在工程目录下没有,可以打开msvc2015工程升级为vc2017版本。
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 <angelscript.h>#include <scriptstdstring/scriptstdstring.h>#include <scriptbuilder/scriptbuilder.h>#include <cassert>#include <iostream>#include <string>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。