首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AngelScript中注册C++类并传递类实例

在AngelScript中注册C++类并传递类实例
EN

Stack Overflow用户
提问于 2012-03-07 19:36:36
回答 1查看 4.2K关注 0票数 2

我在遵循AngelScript手册中关于注册类对象和将类的特定实例传递给脚本的正确方法时遇到了问题。假设我有一个C++类Circle,我想让AngelScript知道它。

代码语言:javascript
复制
class Circle
{
public:
    int getArea();

    int radius;
};

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

代码语言:javascript
复制
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++函数的结果。

代码语言:javascript
复制
circleInstance.getArea();

但是,在上面的代码中,我显然没有以任何方式将实例circleInstance传递给AngelScript引擎,因此脚本环境不知道它的存在。我假设我忽略了一些东西,并且答案只有一两行C++。我应该通过RegisterObjectTypeRegisterInterface这样的方法注册Circle类吗?我需要让Circle继承asIScriptObject才能工作吗?任何洞察力都是值得感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-19 01:13:22

首先注册Circle对象。

代码语言:javascript
复制
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在需要时从内存中释放它们。您不需要像在示例中那样实际实现它们,您只需要使用一个引用。只需像这样声明

代码语言:javascript
复制
class Circle
{
public:

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

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

代码语言:javascript
复制
engine->RegisterObjectMethod("Circle", "int getArea()", asMETHOD(Circle, getArea), asCALL_THISCALL); // asCALL_THISCALL means we will call function using myCircle.getArea()

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

代码语言:javascript
复制
engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance);

现在在您的angelscript文件中

代码语言:javascript
复制
 int value = myCircle.getArea(); // remember you registered myCircle as Circle reference

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

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

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

这是一个迟来的答案,因为我是通过谷歌找到的。我不想让这个问题悬而未决。有些人可能会发现我的答案很有用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9600762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档