第9月第13天 传递lua匿名函数到c/c++
1.
lua函数都在refid_fun
refid_fun[refid] = fun
TOLUA_API int toluafix_ref_function(lua_State* L, int lo, int def)
{
// function at lo
if (!lua_isfunction(L, lo)) return ; s_function_ref_id++; lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);
lua_rawget(L, LUA_REGISTRYINDEX); /* stack: fun ... refid_fun */
lua_pushinteger(L, s_function_ref_id); /* stack: fun ... refid_fun refid */
lua_pushvalue(L, lo); /* stack: fun ... refid_fun refid fun */ lua_rawset(L, -); /* refid_fun[refid] = fun, stack: fun ... refid_ptr */
lua_pop(L, ); /* stack: fun ... */ return s_function_ref_id; // lua_pushvalue(L, lo); /* stack: ... func */
// return luaL_ref(L, LUA_REGISTRYINDEX);
}
static int tolua_Cocos2d_CCScriptEventDispatcher_addNodeEventListener00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,,"CCScriptEventDispatcher",,&tolua_err) ||
!tolua_isnumber(tolua_S,,,&tolua_err) ||
(tolua_isvaluenil(tolua_S,,&tolua_err) || !toluafix_isfunction(tolua_S,,"LUA_FUNCTION",,&tolua_err)) ||
!tolua_isnumber(tolua_S,,,&tolua_err) ||
!tolua_isnoobj(tolua_S,,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
CCScriptEventDispatcher* self = (CCScriptEventDispatcher*) tolua_tousertype(tolua_S,,);
int event = ((int) tolua_tonumber(tolua_S,,));
LUA_FUNCTION listener = ( toluafix_ref_function(tolua_S,,));
int tag = ((int) tolua_tonumber(tolua_S,,));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'addScriptEventListener'", NULL);
#endif
{
int tolua_ret = (int) self->addScriptEventListener(event,listener,tag);
tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
}
}
return ;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'addNodeEventListener'.",&tolua_err);
return ;
#endif
}
比如;lua代码item:addNodeEventListener,CCScriptEventDispatcher* self===item,int event===cc.MENU_ITEM_CLICKED_EVENT,
LUA_FUNCTION listener =
function(tag)
if sound then audio.playSound(sound) end
listener(tag)
end
--[[-- 创建一个文字标签菜单项,并返回 CCMenuItemLabel 对象。 可用参数: - listener: 回调函数
- tag: 按钮的 Tag,会传入回调函数。多个按钮使用同一个回调函数时,可根据 Tag 区分哪一个按钮被按下(可选)
- x, y: 坐标(可选)
- sound: 按钮按下时播放什么音效(可选) 以及所有可以用于 ui.newTTFLabel() 的参数。 @param table params 参数表格对象 @return CCMenuItemLabel CCMenuItemLabel对象 ]] function ui.newTTFLabelMenuItem(params)
local p = clone(params)
p.x, p.y = nil, nil
local label = ui.newTTFLabel(p) local listener = params.listener
local tag = params.tag
local x = params.x
local y = params.y
local sound = params.sound local item = CCMenuItemLabel:create(label)
if item then
if type(listener) == "function" then
item:addNodeEventListener(cc.MENU_ITEM_CLICKED_EVENT, function(tag)
if sound then audio.playSound(sound) end
listener(tag)
end)
end
if x and y then item:setPosition(x, y) end
if tag then item:setTag(tag) end
end return item
end self.item1 = ui.newTTFLabelMenuItem({text = "计时模式", size = , align = ui.TEXT_ALIGN_CENTER,
x = display.cx, y = display.cy + , color = display.COLOR_GREEN,
listener = function()
app:setData("currentLv", )
app:enterScene("MainScene",)
end})
int CCLuaStack::executeFunctionByHandler(int nHandler, int numArgs)
{
int ret = ;
if (pushFunctionByHandler(nHandler)) /* L: ... arg1 arg2 ... func */
{
if (numArgs > )
{
lua_insert(m_state, -(numArgs + )); /* L: ... func arg1 arg2 ... */
}
ret = executeFunction(numArgs);
}
return ret;
}
http://blog.csdn.net/linchaolong/article/details/37657077
http://www.cppblog.com/kevinlynx/archive/2011/04/24/144905.html
http://blog.csdn.net/rain_qingtian/article/details/48573981
http://blog.csdn.net/lightxm/article/details/38435067
http://www.cnblogs.com/boliu/p/4091274.html
第9月第13天 传递lua匿名函数到c/c++的更多相关文章
- 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值
遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...
- Lua基础 函数(一)
转自: http://blog.csdn.net/wzzfeitian/article/details/8653101 在Lua中,函数是对语句和表达式进行抽象的主要方法.既可以用来处理一些特殊的工作 ...
- 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda
一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...
- lua基础---函数
Lua的函数功能很强大,保留了C语言的一些基本的特性,但是也有C语言没有的特性,比如,lua可以在一个函数返回多个值,我们来看看下面这个案例: 解释运行: lua test5.lua --定义一个函数 ...
- lua的函数初识
学习到Lua的函数.认为有必要记下来. 參考教程:Programming in Lua 函数能够以表达式或陈述语句出现,例如以下所看到的: print(8*9, 9/8) a = math.sin(3 ...
- Lua 常用函数 一
lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数.如果 ud 不是 NULL ,Lua ...
- lua闭合函数
function count( ... ) return function( ... ) i = i+ return i end end local func = count(...) print(f ...
- Lua function 函数
Lua支持面向对象,操作符为冒号‘:’.o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数.Lua基础库中的所有函数都是用C实现的.但这些细 ...
- lua API函数大全
Lua5.1中的API函数 lua_State* luaL_newstate()Lua脚本的编译执行是相互独立的,在不同的线程上执行.通过luaL_newstate()函数可以申请一个虚拟机,返回指针 ...
随机推荐
- Grin v0.5在Ubuntu下的安装和启动
Grin和bitcoin一样也是一种点对点的现金交易系统,但它通过零和验证算法,使得双方的交易金额不会被第三方知晓,让它在隐私保护方面更强.其官方的介绍是: 所有人的电子交易,没有审查或限制.并提出它 ...
- PHP学习笔记2
PHP Switch语句 用于根据多个不同条件执行不同动作.如果不在每个条件后加break,将会输出所有结果. <?php $language="java"; switch( ...
- 20135220谈愈敏Blog3_构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1 ...
- linux C单元测试工具CUnit的编译安装及使用
1 下载CUnit安装包CUnit-2.1-3.tar.bz2保存至/home/用户/ (安装包版本为文章做成时2016-05-25的最新版本) https://sourceforge.NET/pro ...
- Citrix Merchandising Server 配置
获取Citrix Merchandising Server虚拟镜像: 我们可以从Citrix官网上下载Citrix Merchandising Server(分为XenServer和vSphere), ...
- c++中冒号(:)和双冒号(::)的用法
1.冒号(:)的用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; ...
- 使用Java语言递归删除目录下面产生的临时文件
背景:项目copy的过程中,在项目的目录文件夹下面都产生了一个固定的文件,很是讨厌.手动删除的话比较费力,所以写了一个简单的Java程序去删除: public static void main(Str ...
- 异步查询json传日期格式到前台,变成了时间戳的格式
问题: 使用mybatis 查询mysql数据库,其中一个日期格式的字段,由异步查询使用 json传递到前台,变成了时间戳,而不是日期格式了.如何使查询出的日期展示成日期格式呢 解决办法: 1.尝试使 ...
- File类里的静态字段
我们都知道windows操作系统和Linux操作系统中的路径分隔符是不一样的,当我们直接使用绝对路径的时候,程序会报错误:No such file or diretory”的异常 File类有几个类似 ...
- 特殊符号 UNICODE编码
特殊符号 UNICODE编码 =================== Start ⇠ 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ & ...