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这个工作?任何见解都表示赞赏!
首先注册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很容易嵌入,文档帮助很多.但肯定不会抓住你的手.
这是一个迟到的答案,因为我通过谷歌发现了这一点.我不希望这个问题没有得到答复.有人可能会觉得我的答案很有用.
