我在遵循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或RegisterInterface这样的方法注册Circle类吗?我需要让Circle继承asIScriptObject才能工作吗?任何洞察力都是值得感谢的!
发布于 2012-03-19 01:13:22
首先注册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很容易嵌入,文档帮助很大。但肯定不会握着你的手。
这是一个迟来的答案,因为我是通过谷歌找到的。我不想让这个问题悬而未决。有些人可能会发现我的答案很有用。

https://stackoverflow.com/questions/9600762
复制相似问题