gpt4 book ai didi

c++ - 在 AngelScript 中注册一个 C++ 类并传递一个类实例

转载 作者:太空狗 更新时间:2023-10-29 23:53:41 32 4
gpt4 key购买 nike

我在按照 AngelScript 手册正确注册类对象并将类的特定实例传递给脚本时遇到了问题。假设我有一个 C++ 类 Circle,我想让 AngelScript 知道它。

class Circle
{
public:
int getArea();

int radius;
};

从这里开始,我想创建一个 Circle 类的实例,将 getArea() 方法注册到 AngelScript 引擎(或注册所有方法如果可能的话自动创建类),并将类实例本身传递给 AngelScript 环境。

Circle circleInstance;
circleInstance.radius = 10;

// Initialize AngelScript engine

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);

engine->RegisterObjectMethod("Circle", "int getArea()",
asMETHOD(Circle, getArea), asCALL_THISCALL);

在 AngelScript 中,我希望能够从实例变量调用方法并返回 C++ 函数的结果。

circleInstance.getArea();

但是,在上面的代码中,我显然没有以任何方式将实例 circleInstance 传递给 AngelScript 引擎,因此脚本环境不知道它的存在。我假设我忽略了一些东西,答案只是大约一两行 C++。我应该通过 RegisterObjectType 这样的方法注册 Circle 类吗?或 RegisterInterface ,我是否需要让 Circle 继承 asIScriptObject为了这个工作?感谢任何见解!

最佳答案

首先注册 Circle 对象。

engine->RegisterObjectType("Circle",0, asOBJ_REF); // asOBJ_REF because you wanted a reference call
engine->RegisterObjectBehaviour("Circle", asBEHAVE_ADDREF, "void f()", asMETHOD(Circle, AddRef), asCALL_THISCALL);
engine->RegisterObjectBehaviour("Circle", asBEHAVE_RELEASE, "void f()", asMETHOD(Circle, ReleaseRef), asCALL_THISCALL);

注意 AddRef 和 ReleaseRef 函数。这些是允许 Angelscript 在需要时从内存中释放它们的强制函数。您不需要实际实现它们,因为在您的示例中您只想使用引用。就这样声明

class Circle
{
public:

void AddRef() { /* do nothing */ }
void ReleaseRef() { /* do nothing */ }
}

现在注册对象方法。 (你的 getArea() 函数)

engine->RegisterObjectMethod("Circle", "int getArea()", asMETHOD(Circle, getArea), asCALL_THISCALL); // asCALL_THISCALL means we will call function using myCircle.getArea()

然后注册全局属性。这是您要在 angelscript 中使用的实例。

engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance);

现在在你的 angelscript 文件中

 int value = myCircle.getArea(); // remember you registered myCircle as Circle reference

int radius = myCircle.radius; // error. you need to register each member.

我建议您从头到尾阅读文档。对象句柄、引用计数等……是您需要掌握的非常重要的概念。

angelscript 很容易嵌入,文档帮助很大。但肯定不会牵你的手。

这是一个迟到的答案,因为我是通过谷歌找到的。我不想让这个问题无人回答。有些人可能会觉得我的回答很有用。

img

关于c++ - 在 AngelScript 中注册一个 C++ 类并传递一个类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9600762/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com