AngelScript笔记
1.c++类导出到angelscript,并且使用angelscript继承
void ASControl::ExportToAngelScript(ASContext* context) { if (context == nullptr) return; int r; // Register the type #if AS_CAN_USE_CPP11 //注意这里注册脚本以"_t"为结尾的,否则无法继承,脚本识别实际上还是ASControl r = context->engine->RegisterObjectType("ASControl_t", 0, asOBJ_REF); assert(r >= 0); r = context->engine->RegisterObjectBehaviour("ASControl_t", asBEHAVE_FACTORY, "ASControl_t@ f()", asFUNCTION(Factory), asCALL_CDECL); //r = context->engine->RegisterObjectType("ASControl", sizeof(ASControl), asOBJ_REF| asOBJ_POD); assert(r >= 0); //r = context->engine->RegisterObjectBehaviour("ASControl", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(ASControl_Destruct), asCALL_CDECL_OBJLAST); assert(r >= 0); //r = context->engine->RegisterObjectBehaviour("ASControl", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(DefaultConstructorASControl), asCALL_CDECL_OBJLAST); assert(r >= 0); r = context->engine->RegisterObjectBehaviour("ASControl_t", asBEHAVE_ADDREF, "void f()", asMETHOD(ASControl, AddRef), asCALL_THISCALL); r = context->engine->RegisterObjectBehaviour("ASControl_t", asBEHAVE_RELEASE, "void f()", asMETHOD(ASControl, Release), asCALL_THISCALL); #else r = context->engine->RegisterObjectType("ASControl_t", sizeof(ASVec2), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CAK | asOBJ_APP_CLASS_ALLFLOATS); assert(r >= 0); #endif r = context->engine->RegisterObjectMethod("ASControl_t", "string GetClassName()", asMETHODPR(ASControl, GetClassName, (), std::string), asCALL_THISCALL); assert(r >= 0); // Register the object properties r = context->engine->RegisterObjectProperty("ASControl_t", "vec2 pos", asOFFSET(ASControl, pos)); assert(r >= 0); r = context->engine->RegisterObjectProperty("ASControl_t", "vec2 size", asOFFSET(ASControl, size)); assert(r >= 0); }
2.注册委托:
as脚本注册委托:funcdef void OnClickDelegate(int,int y);
c++通过api注册委托:r = engine->RegisterFuncdef("void OnClickDelegate_Native(int x,int y)");
3.委托的传递:
OnClickDelegate_Native@ ab = OnClick1;而OnClick1实际上是所使用的函数
4.可变参数
c++声明如下:
static void AS_Generic_Print(asIScriptGeneric* gen) { int c = gen->GetArgCount(); va_list va; std::string data; char* fmt = nullptr; int argType = 0; char buff[1024]; for (asUINT i = 0; i < c; i++) { argType = gen->GetArgTypeId(i); if (argType == asTYPEID_INT32) { //data += sscanf("%d,", (int)gen->GetArgQWord(i)); data += std::to_string((gen->GetArgQWord(i)))+","; //va_arg(va, int); }else if (argType == asTYPEID_FLOAT) { //va_arg(va, float); data += std::to_string((gen->GetArgFloat(i))) + ",";//scanf("%.2f,",gen->GetArgFloat(i)); }else if (argType == asTYPEID_DOUBLE) { //va_arg(va, double); data += std::to_string((gen->GetArgFloat(i))) + ","; //scanf("%.2f,", gen->GetArgDouble(i)); } else { //data += std::string((char*)gen->GetArgAddress(i)) + ","; fmt = (char*)gen->GetArgAddress(i); } // va_arg(va, gen->GetAddressOfArg(0)); } //int* a = (int*)gen->GetAddressOfArg(0); //int* b = (int*)gen->GetAddressOfArg(1); const char* cha = "111,222"; va_list v=(va_list)cha; printf("---%d,%d\r\n", v); //printf(fmt,(va_list)data.data()); //gen->SetReturnDWord((asDWORD)(*a + *b)); }
而注册的时候根据需要提供形参:
r = engine->RegisterGlobalFunction("void AS_Generic_Print(const string& in,int x,int y)", asFUNCTION(AS_Generic_Print), asCALL_GENERIC);
浙公网安备 33010602011771号