yang131

导航

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);

 

posted on 2026-01-03 17:39  NoNight  阅读(6)  评论(0)    收藏  举报