2013-04-16 77 views
0

比方说,我有一个回叫函数,当指定玩家死亡时执行该函数。将C函数转换为Lua函数

function OnPlayerDeath(playerid) 

end 

我想被称为Lua的C模块中内部此功能,而不把它LUA脚本里面:

static int l_OnPlayerConnect (lua_State * L) { 
    enum { lc_nformalargs = 1 }; 
    lua_settop(L,1); 

    // so here I can use playerid argument - 1 arg 

    return 0; 
} 

这在某种程度上可以接收C这个回调参数?

#define LUA extern "C" __declspec(dllexport) int __cdecl 

LUA luaopen_mymodule(lua_State *L) 
{ 
    /* function OnPlayerConnect(playerid) 
    *  
    * end */ 
    lua_pushcfunction(L,l_OnPlayerConnect); 
    lua_setfield(L,LUA_GLOBALSINDEX,"OnPlayerConnect"); //there's already OnPlayerConnect I just want to also call it here but I don't know how. 
    assert(lua_gettop(L) - lc_nextra == 0); 

    return 1; 
} 

我不想把这个函数推到lua栈上,因为这个func已经存在。 我只是希望它已经是现有的Lua功能。

回答

0

已解决。这可能是W.B.

解决方案:从C调用负载字符串。

+0

正确,但是推动堆栈上的函数/块... –

1

如果您想从C API的Lua中运行它,您需要以某种方式将它推到堆栈上。如果它已经存在于全局表中某处,可以通过调用lua_getglobal来进行推送。 lua_call(lua_pcall)要求在调用之前调用函数并将其参数存放在堆栈顶部。

如果你喜欢它,你可以检查LuaJIT ffi回调功能,但它不是简单的Lua。