黄南藏族自治州网站建设_网站建设公司_域名注册_seo优化
2026/1/16 14:34:12 网站建设 项目流程

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"为结尾的,否则无法继承,脚本识别实际上还是ASControlr = 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);
#elser = context->engine->RegisterObjectType("ASControl_t", sizeof(ASVec2), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CAK | asOBJ_APP_CLASS_ALLFLOATS); assert(r >= 0);
#endifr = context->engine->RegisterObjectMethod("ASControl_t", "string GetClassName()", asMETHODPR(ASControl, GetClassName, (), std::string), asCALL_THISCALL); assert(r >= 0);// Register the object propertiesr = 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);

 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询