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

Vor*_*ico 2 c++ scripting class instance

我无法按照正确的方式遵循AngelScript手册来注册类对象并将类的特定实例传递给脚本.假设我有一个C++类Circle,我想让他知道AngelScript.

class Circle
{
public:
    int getArea();

    int radius;
};
Run Code Online (Sandbox Code Playgroud)

从这里开始,我想创建一个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);
Run Code Online (Sandbox Code Playgroud)

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

circleInstance.getArea();
Run Code Online (Sandbox Code Playgroud)

但是,在上面的代码中,我显然没有circleInstance以任何方式将实例传递给AngelScript引擎,因此脚本环境不知道它的存在.我假设我忽略了一些东西,答案只有一两行C++.如果我注册Circle过等的方法类RegisterObjectType或者RegisterInterface,我需要让Circle继承asIScriptObject这个工作?任何见解都表示赞赏!

mik*_*bal 7

首先注册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);
Run Code Online (Sandbox Code Playgroud)

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

class Circle
{
public:

     void AddRef() { /* do nothing */ }
     void ReleaseRef() { /* do nothing */ }
}
Run Code Online (Sandbox Code Playgroud)

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

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

然后注册全球财产.这是您要在angelscript中使用的实例.

engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance);
Run Code Online (Sandbox Code Playgroud)

现在在你的angelscript文件中

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

 int radius = myCircle.radius; // error. you need to register each member.
Run Code Online (Sandbox Code Playgroud)

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

angelscript很容易嵌入,文档帮助很多.但肯定不会抓住你的手.

这是一个迟到的答案,因为我通过谷歌发现了这一点.我不希望这个问题没有得到答复.有人可能会觉得我的答案很有用.

IMG