• luaPlus


     luastate

    lua的各种变量放 luastate里面  luastate作为  函数的参数传递

    luaobject

    luastack

    由于这是个静态函数,所以第一个参数就是脚本里传入的参数。如果是成员变量则第一个参数是this对象,第二个参数才是从脚本传入的参数。

    int LWindow::subscribeEvent(LuaState* L)

    {

           LuaStack  arg(L);

           if (arg[2].IsString()&& arg[3].IsString())

           {

                  ScriptFunctorfunctor(arg[3].GetString());

                  d_window->subscribeEvent(arg[2].GetString(),Event::Subscriber(functor));

           }

           return0;

    }

    客户端lua脚本调试   AxTrace(0, 0, "Pitch:%f", obj.fCameraPitch);这样      2011.1.4

    =======================================================================

    之前认识有错误的地方

    一个LuaState代表一个Lua语言的执行环境,一个程序里可以同时存在多个Lua的环境(如果需要的话)

     

    INT PlayerPackage::EnumItem(LuaPlus::LuaState* state)
    {
    LuaStack args(state);

    //检查参数
    if (!(args[2].IsString()))
    {
    KLThrow(
    "LUA: PlayerPackage::EnumItem Wrong Param1"
    );
    }
    if(nOffIndex >= 0)
    {
    tActionItem
    * pActionItem = CActionSystem::GetMe()->EnumAction(nIndex + nOffIndex, 
    NAMETYPE_PACKAGEITEM);
    if(pActionItem)
    {
    LuaObject objReturn
    = state->BoxPointer(pActionItem);
    objReturn.SetMetaTable(
    *
    CActionItem::s_pMetaTable);
    objReturn.PushStack();

    if(((tObject_Item*)pActionItem->GetImpl())->IsLocked())
    state
    ->PushInteger(1);
    else
    state
    ->PushInteger(0);
    return 2;
    }
    }

    传参的那种用法

    另外复杂的:

    LUA_API void lua_newuserdatabox (lua_State *L, void *ptr) {
    Udata
    *u;
    lua_lock(L);
    u
    = luaS_newudata(L, 4);
    u
    ->uv.len = 1; // user data box bit is set.
    *(void**)(u + 1) = ptr;
    setuvalue(L
    ->top, u);
    api_incr_top(L);
    lua_unlock(L);
    }
    LUAPLUS_INLINE LuaStackObject LuaState::BoxPointer(void* u)
    {
    lua_boxpointer(m_state, u);
    return LuaStackObject(*this, lua_gettop(m_state));
    }
    #define lua_boxpointer(L,u) \
    (lua_newuserdatabox(L, (u)))
    Udata *luaS_newudata (lua_State *L, size_t s) {
    Udata
    *u;
    s
    = (s+1) & (~(size_t)1); /* make sure size is multiple of 2 */
    u
    = cast(Udata *, luaM_malloc(L, sizeudata(s)));
    u
    ->uv.marked = (1<<1); /* is not finalized */
    u
    ->uv.tt = LUA_TUSERDATA;
    #if LUA_REFCOUNT
    u
    ->uv.ref = 0;
    #endif /* LUA_REFCOUNT */
    u
    ->uv.len = s;
    u
    ->uv.metatable = hvalue(defaultmetatypes(L, LUA_TUSERDATA));
    lua_addreftable(u
    ->uv.metatable);
    /* chain it on udata list */
    #if LUA_REFCOUNT
    u
    ->uv.prev = (GCObject*)&G(L)->rootudata;
    #endif /* LUA_REFCOUNT */
    u
    ->uv.next = G(L)->rootudata;
    G(L)
    ->rootudata = valtogco(u);
    #if LUA_REFCOUNT
    if (u->uv.next)
    u
    ->uv.next->uv.prev = valtogco(u);
    #endif /* LUA_REFCOUNT */
    return u;
    }

    上面那部分不容易找到的代码,位于依赖库里,(despensy).inl,.c等文件里,原因是c和c++的兼容问题

    设置返回值为pActionItem

    SetMetaTable设置元表(是pActionItem的)

    压栈

    然后把block的值(0或者1)压栈

  • 相关阅读:
    Arduino 各种模块篇 DHT11 温度湿度 数字模块 单总线
    Arduino 各种模块篇 火焰传感器
    exception
    google c++ code style
    昙花一现
    晏才宏
    win 2003 玩3D游戏设置
    生成多文件的Assembly 的两种方法
    怎样使自己写的程序集出现在Visual Studio Add Reference 的 .NET Tab页中
    安装将仅在管理模式下运行,安装终止
  • 原文地址:https://www.cnblogs.com/minggoddess/p/1925872.html
Copyright © 2020-2023  润新知