将变量从 AngelScript 传递给 C++
Passing Variables from AngelScript to C++
我想将一个变量从 AngelScript 传递给 C++。
我已经设法将函数从 AngelScript 传递给C++反之亦然。
我也可以将变量从C++传递到 AngelScript,但是我不知道如何反过来做到这一点。
手册对我没有帮助,或者我已经监督了那部分。
你能给我一个提示吗?
编辑:
正如评论中提到的,这是我已经设法做到的。
在我的 test.as 文件中:
int add(int a, int b)
{
print("Hello World, I'm AngelScriptn");
multi(5, 13);
print("c is " + c + "n");
return (a + b);
}
我的测试.cpp文件:
int multi(int x, int y)
{
int z = x * y;
cout << "x aus dem Skript: " << x << endl;
cout << "y aus dem Skript: " << y << endl;
printf("Ergebnis von multi x * y: %dn", z);
return z;
}
void print(string &msg)
{
printf("%s", msg.c_str());
}
int _tmain(int argc, _TCHAR* argv[])
{
int r;
int c = 42;
asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
RegisterStdString(engine);
// pass function print to angelscript
r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert(r >= 0);
// pass function multi to angelscript
r = engine->RegisterGlobalFunction("int multi(int, int)", asFUNCTION(multi), asCALL_CDECL); assert(r >= 0);
// pass variable c to angelscript
r = engine->RegisterGlobalProperty("int c", &c); assert(r >= 0);
FILE *f = fopen("test.as", "rb");
fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);
string script;
script.resize(len);
fread(&script[0], len, 1, f);
fclose(f);
mod->AddScriptSection("script", &script[0], len);
mod->Build();
asIScriptContext *ctx = engine->CreateContext();
// get function add from angelscript
asIScriptFunction *func = engine->GetModule("test.as")->GetFunctionByDecl("int add(int, int)");
ctx->Prepare(func);
ctx->SetArgDWord(0, 7);
ctx->SetArgDWord(1, 20);
if (ctx->Execute() == asEXECUTION_FINISHED)
{
asDWORD returnValue = ctx->GetReturnDWord();
cout << "Result of a + b is: " << returnValue << endl;
}
ctx->Release();
engine->Release();
return 0;
}
这是我在
进行一些小修改后运行您发布的代码时的输出。
https://gyazo.com/cb264842efa76d153f9f5c0f962b391d
这是添加小更改后的代码,我将解释我添加的内容。
int multi(int x, int y)
{
int z = x * y;
cout << "x aus dem Skript: " << x << endl;
cout << "y aus dem Skript: " << y << endl;
printf("Ergebnis von multi x * y: %dn", z);
return z;
}
void print(string &msg)
{
printf("%s", msg.c_str());
}
int _tmain(int argc, _TCHAR* argv[])
{
int r;
int c = 42;
asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
RegisterStdString(engine);
// pass function print to angelscript
r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert(r >= 0);
// pass function multi to angelscript
r = engine->RegisterGlobalFunction("int multi(int, int)", asFUNCTION(multi), asCALL_CDECL); assert(r >= 0);
// pass variable c to angelscript
r = engine->RegisterGlobalProperty("int c", &c); assert(r >= 0);
FILE *f = fopen("test.as", "rb");
fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);
string script;
script.resize(len);
fread(&script[0], len, 1, f);
fclose(f);
// create our module and add our script section to it then build!
asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE);
r = mod->AddScriptSection("script", &script[0], len); assert(r >= 0);
r = mod->Build(); assert(r >= 0);
asIScriptContext *ctx = engine->CreateContext();
// get function add from angelscript
asIScriptFunction *func = mod->GetFunctionByDecl("int add(int, int)");
ctx->Prepare(func);
ctx->SetArgDWord(0, 7);
ctx->SetArgDWord(1, 20);
if (ctx->Execute() == asEXECUTION_FINISHED)
{
asDWORD returnValue = ctx->GetReturnDWord();
cout << "Result of a + b is: " << returnValue << endl;
}
ctx->Release();
engine->Release();
return 0;
}
我所要改变的只是我构建模块的方式,因为您没有发布您如何创建模块。如果您复制并粘贴我所拥有的内容,它可以完美运行
// create our module and add our script section to it then build!
asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE);
r = mod->AddScriptSection("script", &script[0], len); assert(r >= 0);
r = mod->Build(); assert(r >= 0);
另外,现在我有了模块指针,在通过声明获取函数时可以直接使用它
// get function add from angelscript
asIScriptFunction *func = mod->GetFunctionByDecl("int add(int, int)");
您定义多功能的方式是正确的,以及应该如何完成。我不确定您的问题到底在哪里,但我猜这是您创建模块的方式,并且可能您用错误的名称加载了它。我希望这有所帮助!