从C++类继承Angelscript
Angelscript inheritance from C++ class
我已经为这件事挠头好几天了,觉得你们可能有更好的主意。
本质上,我想定义一个标准接口,然后可以从Angelscript类中继承。例如,假设我有一个像魔术聚会这样的纸牌游戏,我的基类可能看起来像:
class Card
{
public:
virtual void PreDrawPhase() = 0;
virtual void PostDrawPhase() = 0;
// etc....
};
然后,我希望能够在Angelscript中定义新卡及其各自的行为,同时能够在C++中处理它们(通过处理接口)。我怎样才能做到这一点?
免责声明:我从未在任何"真实"项目中使用过Angelscript,这就是为什么以下答案应该持怀疑态度。它在我为它设置的小测试代码中起作用,大多数代码片段在官方手册中都有详细解释,但这绝对不能保证它是一个合理的设计,可以在游戏中合理使用
我相信,实现您目标的相关部分在官方手册中描述得很好:
-
介绍了如何定义和使用接口。
-
这描述了如何在C++中实例化和使用"脚本类"。
使用这些信息,我们可以潜在地编写一个简单的包装类,在构造时创建某个类的实例并在销毁时释放它,同时提供调用脚本类的各个成员的成员函数:
(注意:为了简洁起见,我省略了所有的错误处理和其他一些重要的实践,比如树规则(下面的类不能在不破坏很多的情况下复制…))
标题:
class Card
{
public:
Card(asIScriptEngine *engine, asIScriptContext *ctx, const std::string &module_name, const std::string &class_name);
~Card();
void PreDrawPhase();
void PostDrawPhase();
private:
asIScriptContext *ctx;
asIScriptObject *obj;
asIScriptFunction *PreDrawPhaseFunc, *PostDrawPhaseFunc;
};
实施:
Card::Card(asIScriptEngine *engine, asIScriptContext *ctx, const std::string &module_name, const std::string &class_name):
ctx(ctx)
{
asIScriptModule *module = engine->GetModule(module_name.c_str());
auto type_id=module->GetTypeIdByDecl(class_name.c_str());
asIObjectType *type = engine->GetObjectTypeById(type_id);
PreDrawPhaseFunc=type->GetMethodByDecl("void PreDrawPhase()");
PostDrawPhaseFunc=type->GetMethodByDecl("void PostDrawPhase()");
asIScriptFunction *factory = type->GetFactoryByDecl((class_name+" @"+class_name+"()").c_str());
ctx->Prepare(factory);
ctx->Execute();
obj=*(asIScriptObject**)ctx->GetAddressOfReturnValue();
obj->AddRef();
}
Card::~Card()
{
obj->Release();
}
void Card::PreDrawPhase()
{
ctx->Prepare(PreDrawPhaseFunc);
ctx->SetObject(obj);
ctx->Execute();
}
void Card::PostDrawPhase()
{
ctx->Prepare(PostDrawPhaseFunc);
ctx->SetObject(obj);
ctx->Execute();
}
我相信代码是非常不言自明的(如果我错了,请纠正我,我会努力详细说明),因此我只描述基本想法:
- Card的每个实例都有一个指向某个Angelscript对象的指针,该对象是实现所需接口的任意类型(目前唯一的强制方法是在出现问题时崩溃,这有点糟糕)
- 在构造时,它是创建的(从传入的引擎、上下文和名称),指向其成员函数的指针是累积的,在销毁时,它被释放
- 每当调用一个成员时,它都会转发到Angelscript对象的相应成员
正如开头所提到的,我对Angelscript几乎没有任何经验,所以这可能确实是一种非常次优的方法,而且确实存在更好的解决方案。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 如何使用AngelScript注册SFML Vector2运算符
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- Angelscript从C++传输数组
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 从C++类继承Angelscript