如何使用AngelScript
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。