lua 在一个scene调到另一个scenecocos2dx c 调用lua的函数有哪些

cocos2dx(13)
cocostudio
原博客地址:http://blog.csdn.net/qq
上篇文中说道如何导出LUA文件,下边来说一下LUA文件怎么使用!
首先导出的LUA文件是这样的
箭头指向的位置有个Create函数。就是调用这个函数进行创建。(至于这个参数是啥玩意,后边会讲到)
首先,先将导出的这个文件require进来,进来之后呢,调用create方法,就会返回Cocos创建的Scene了~
代码如下:
然后create 方法返回的结果是一个table,通过csLuaScene['root']来获得创建的Scene,接着replaceScene就可以了!对于“图层”和“节点”也是类似的操作!
最后通过一系列的getChildByName 和 GetChildByTag 获取子节点进行操作就可以了!
啊,对了,获取动画的方式和获取Scene的方式相似&csLuaScene['animation']!
接下来,create函数的那个参数是什么东西呢?
来看这个图 ,我给Button_1添加了一个叫做btn2的Click事件
生成LUA代码之后,能够发现有如下代码段
这段代码,首先判断callBackProvider是否为空,然后呢,将他的返回值设置为Button_1的Click回调函数。
这样就很明白了。create时候需要传入的参数callBackProvider是一个函数,他的功能是根据传入的3个参数进行判断,最终返回一个函数最为Button(或者其他node)的回调函数!
callBackProvider的三个参数,分别是,当前LUA文件的路径,所绑定的Node(可以通过name或者tag来判断是哪个node),最后是回调函数的名字,通过这三个参数可以很容易的知道是哪个按钮的回调事件,从而返回该按钮所需要的回调函数。
所以,在create时候应该是这样的:
也许大家看第一篇文章时候,注意到 我这里提示了一个错误,版本不兼容。是时候更新到3.5了!如果不想更新的话,就把3.5的UI的部分替换过来吧…………
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10452次
排名:千里之外
原创:10篇
转载:61篇
(2)(11)(3)(4)(9)(1)(1)(1)(7)(26)(5)(2)cocos2dxlua面试题
cocos2dxlua面试题
cocos2dxlua面试题篇一:coco2d-x面试题(无脑码农) Cocos2d-x面试题 (无脑码农) 1,阐述cocos2d-x 中CCScene CCLayer CCSprite CCNodeCCScene: CCScene是app工作流程上独立块,一个app可能拥有多个scene,但是在任何时候只能有一个是激活状态的。一个CCScene对象由一个或多个CCLayer组成,layer之间是前后相连的。Layer提供了scene的外观和行为。通常的用法是直接用一个或多个layer实例化一个scene CCScene的子类CCTrasitionScene实现移动transitions,提供两个scene之间的转移效果,由于scene是CCNode的子类,所以scene可以手工或者用aciton来转变坐标。所有层和精灵都是他的(子节点)children。 CCScene的4个基本方法: runWithScene(运行画面),replaceScene(替换场景 例如从主菜单进入游戏界面), pushScene(暂停界面), popScene(从暂停的界面还原到游戏界面) Layers: CCLayer同样是CCNode的子类,通常用addChild方法添加子节点。 CCLayer对象定义了可描绘的区域,定义了描绘的规则。CCLayer可以实现半透明的效果, 层的事件相应机制 : 最外层最先接受到事件(屏幕触碰),最后是底层,如果在某层处理了该事件,则后面的层不会在接受到事件信号 Sprites cocos2d的sprite对象就是一个可以移动、选择、伸缩、动画的2d图形,CCSprite 对象的子成员中可以包含其它的CCSprite 对象。当CCSprite 对象转换坐标系的时候,它所包含的CCSprite 对象也会转换转换坐标系。sprites 是CCNode 的子类, 所以他们也可以使用actions来转换坐标. See Actions for more detail about actions.
CCNode是场景、层、菜单、精灵等所有节点的父类,它是一个抽象类,没有可视化表示形式,定义了所有node共有的属性和方法。 2,说一下CCAction和CCActionMessager CCAction是动作的基类,主要使用CCFiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束; CCFiniteTimeAction又分为CCActionInstanse(瞬时动作的基类)和CCActionInterval(延时动作的基类)。CCActionInstanse:没什么特别,跟CCActionInterval主要区别是没有执行过程,动作瞬间就执行完成了;CCActionInterval:执行需要一定的时间(或者说一个过程)。我们用的最多的就是延时动作,下面对它进行单独介绍。
CCActionMessage是管理所有Action的单例,一般情况下并不直接使用这个单例,而是使用CCNode的接口,但是假如你想操作的目标不是CCNode的子类或者你想暂停/恢复行动就要使用到CCActionMessager 3,你常用的cocos2d-x工具 TiledMap (地图编辑器)ParticleEditor(粒子编辑器)cocosBuilder(可视化编辑)Texture Packer(图片组合工具)等
4,简述:CCDirector CCEGLView CCEGLViewProtocol CCDirector是singleton模式的共享的对象。它知道当前哪个scene是激活。 CCDirector以stack的方式处理scenes的调用(当另一个scene进入的时候,暂停当前的scene,完成之后再返回原来的 scene),CCDirector 负责更换CCScene,在 CCLayer 被push的时候,更换或结束当前的scene。另外:CCDirector 负责初始化OpenGL ES。 作用: 1.访问和改变场景 2.访问cocos2d的配置细节 3.访问视图,(openGL, UIView, UIWindow) 4.暂停,恢复和结束游戏 5.在UIKit和OpenGL之间转换坐标 CCEGLView是CCEGLViewProtocol的子类,是用于屏幕适配(这个问题还没全解决啊)
5,简述CCSpriteframeCache CCSpriteBatchNode,并说出CCNode,CCSprite是如何实现绘制的? CCSpriteFrameCache 缓存了所有CCSpriteFrame. 可以一下方式获取特定frame并设定给Sprite. 前提是文件已经缓存 CCSpriteBatchNode 中的所有CCSprite只会被渲染1次,因此可以提高游戏的FPS。 限制:加入到 CCSpriteBatchNode 中的CCSprite必须使用同一张纹理图。比如游戏中的子弹 就很适合用它,因为子弹都是一个样子。通过TexturePacker生成的纹理图也适合使用它。 (第二问不会) 6,cocos2d-x的屏幕适配解决方案 Cocos2d-x2.0.4之后 pEGLView-&setDesignResolutionSize(480, 320, kResolutionNoBorder);第三个参数,找到定义: 讲得很清楚了: kResolutionExactFit:会靠拉伸来填满屏幕,本例来说背景图会变形来填充屏幕,因为.3, 480:320=1.5,宽高比不同,图片也就无法等比缩放来填满屏幕,只能变形了。 kResolutionNoBorder: 看不到黑边,实际就是宽高等比缩放,但缩放比例取宽比和高比之中大的那一个。 kResolutionShowAll:全部显示,可以理解为保证内容都显示在屏幕之内,实际也是宽高等比缩放,但缩放比例取宽比和高比之中小的那一个。 一般来说,我们希望设计时一屏的内容,用户在实际设备上也能在一屏内看到,拿本例来说,分辨率时,右下角的按钮却跑到屏幕外去了。看完上面的分析,你应该知道如何解决了: 对了,改变pEGLView-&setDesignResolutionSize(480, 320, kResolutionNoBorder);第三个参数为kResolutionShowAll。
7,cocos2d-x聊天的实现,对话框 字符集 字体描边 输入法
8,cocos2d-x游戏储存 CCUserDefault和SQList CCUserDefalt存在的的问题 1.没有记录和表的概念 你会发现,如果要设置多存档,必须自己操作,而且代码会变得复杂,容易出错。 对于简单的游戏可以使用CCUserDefalt,但是对于复杂游戏,可以考虑使用SQLite。 2.没有数据类型安全 比如,如果你错写把一个Integer按Bool读取,是没有错误提示的 3.没有存档数据完整性的校验 我们找到之前的存档记录,用CCUserDefault::getXMLFilePath()可以获得存档位置,打开它
9,cocos2d-x内存管理 cocos2d-x最初移植自cocos2d的objective C版本。因此,在内存管理上,使用了和NSObject类似的引用计数器方法,相关接口放置在CCObject类中。 引用计数器――手动管理内存 CCObject的及其子类的对象在创建时,引用计数自动设置为1。之后每次调用retain,引用计数+1。每次调用release,引用计数-1;若引用计数=0,则直接delete this。 retain是在指针传递和赋值时使用的,他的含义是表示拥有。这经常用在指针赋值上。 自动释放池――自动管理内存 对于使用autorelease的对象,不必管它,每帧结束后会自动释放。 CCNode节点管理 cocos2d-x使用节点组成一棵树,渲染的时候要遍历这棵树。CCNode是所有节点类的父类,他内部使用了一个CCArray对象管理他的所有子节点,当对象被添加为子节点时,实际上是被添加到CCArray对象中,同时会调用这cocos2dxlua面试题篇二:lua笔试题 笔试题
1. local abc = {&yoyo&, yoyo = &yoyou&}; print(abc [abc[1]]) 结果是?
2. 语句local value = print(value == false);的结果是?
3. string.sub(“123456”,2,-2) 结果是?
4. 请写出lua中table库常用的函数有哪些?
5. require 与 dofile的区别是什么?
6. 请用一句lua代码 实现C语言中的a ? b : c
7. Cocos2d中内存管理机制是什么,程序开发中如何减少内存的开销?
8. cocos2d的渲染机制是什么?
9. 说说Cocos2d的屏幕适配方案
10. 请用lua 实现一个求1加到10的函数,用递归方式实现
11. 如何用lua实现C++中的类机制,说明并用代码举例cocos2dxlua面试题篇三:Cocos2d-x开发:Lua篇 Cocos2d-x初体验之Lua篇
Lua以其出色的跨平台性和速度最快的嵌入式脚本语言,当仁不让的占据了游戏插件开发的头把交椅。你也想制作一个和大脚一样闻名天下的工具和游戏么?
导师简介 徐波老师,痴迷于新兴技术黑魔法,斩杀万千BUG于黑暗中,救众人于各类花式巨坑,希望有朝一日自动化开发技术拯救人类。信条:不玩游戏的技术,不是好讲师。
课程简介 Lua以其出色的跨平台性和速度最快的嵌入式脚本语言,当仁不让的占据了游戏插件开发的头把交椅。你也想制作一个和大脚一样闻名天下的工具和游戏么?快来吧.
课程须知 需要有c语言基础.你能学到什么? 游戏开发的过程 Lua环境搭建 Cocos2d-x的环境搭建
大纲一览 第1章 学习指南
? 1-1 学习指南 (02:55) 第2章 游戏简介 2-1 游戏开发流程 (05:30) 2-2 游戏的构成 (04:05) 第3章 Cocos2d-x的开发环境搭建
3-1 主流引擎特性对比 (04:23)
3-2 Cocos2d-x引擎简介 (02:39)
3-3 Cocos2d-x开发包选择 (03:00)
3-4 Cocos2d-x开发环境搭建 (03:31)
3-5 创建自己的Cocos2d-x工程 (04:10)
3-6 图片,动起来! (02:46) 第4章 后记 4-1 运行示例项目 (05:15)
学习链接:/view/448
cocos2dxlua面试题 相关文章:cocos3.x导出自定义类到Lua以及手动绑定要回调的函数 - cocos-lua -
cocos3.x导出自定义类到Lua以及手动绑定要回调的函数
1、安装必要的工具包和库,以及配置相关环境变量,按照../cocos2d-x 3.x/tools/tolua/README.mdown所说的安装,注意, & & & & & & &不同操作系统有不同的安装内容。
2、写C++测试类(可以用../cocos2d-x-3x/tests/cpp-empty-test/Classes/HelloWorldScene.cpp作为测试类),在头文件中加入 & & &void&registerChangeScriptFunc(int&onChangeCallback); & &在后面手动绑定Lua函数用到
3、写Python脚本 & & &a、在../cocos2d-x 3.x/tools/tolua中找到genbindings.py文件复制一份,重命名为genbindings_hello.py & & &b、修改脚本里面的生成路径以及命令参数 & & & & & &output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root & && & & & & & &这是绑定后文件的生成目录,这个不改的话要在生成之后拖到自己的项目文件夹中,我们这里默认这样 & & & & & &然后把 & & & & & &cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \ &&&&&&&&&&&&&&&&&&& 'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \ &&&&&&&&&&&&&&&&&&& 'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \ &&&&&&&&&&&&&&&&&&& 'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \ &&&&&&&&&&&&&&&&&&& 'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \ &&&&&&&&&&&&&&&&&&& 'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \ &&&&&&&&&&&&&&&&&&& } & & & & & & 改成 & & & & & &&cmd_args = {'hello.ini' : ('hello', 'lua_hello_auto') } & & & & & & “hello.ini” 是接下来要写的文件
4、写ini文件 & & & 跟写python脚本一样,复制一份cocos2dx.ini,重命名为hello.ini & & & 然后按照下面改动文件 & & &&[hello] & & &&prefix = hello & & &&target_namespace = & & &&headers = %(cocosdir)s/tests/cpp-empty-test/Classes/HelloWorldScene.h & & &&classes = HelloWorld & & &&skip = & & &&abstract_classes = & & & 至于里面的其它参数自己可以去研究,这里就不多说了
5、执行py文件 & & & cd到tolua文件夹下,输入命令 & & & python genbindings_hello.py & & & 如果没什么问题的话会在生成目录里找到lua_hello_auto.cpp和lua_hello_auto.hpp文件,然后拖拽到我们的项目文件夹中。
6、编辑AppDelegate.cpp,添加lua_hello_auto.hpp头文件 & & & 然后加上 & & &&auto&engine =&LuaEngine::getInstance(); &&&register_all_hello(engine-&getLuaStack()-&getLuaState()); & &进行注册
7、编译运行,这样我们就把HelloWorld类导入到Lua了。 & & &在我们的Lua文件main.lua中加入 & & &local hello = HelloWorld:create() & & &local sceneGame = cc.Scene:create() & & &sceneGame:addChild(hello) & & &… & & &再次运行出现HelloWorld就表示导出成功
---------------------------------------------------
接下来是手动绑定Lua函数的操作。 由于引擎没有提供接口让我们可以把一个Lua函数注册给C++调用,所以我们要手动绑定。
HelloWorldScene.h(声明Lua函数所调用的ID)
&&&&int&handleID;
HelloWorldScene.cpp
void&HelloWorld::registerChangeScriptFunc(int& onChangeCallback)
&&&&this-&handleID& = onChangeC
在menuCloseCallback()函数中添加:
auto&engine =&LuaEngine&::getInstance()-&getLuaStack();& & & & & & & & & & & & engine-&executeFunctionByHandler(handlerId, 2); & & & & & & & & & & & & & & &
在main.lua注册被调用的函数
hello:registerChangeScriptFunc(function () & & & & & & & & & & & & & & & & & & & & & & & & & & & & & print(&hello&) & & & & & & & & & & & & & & & & & & & & & & & & & & end & & & & & & & & & & & & & & & & & & & & & & & & & & ) 现在还不能执行,这是因为Lua绑定时候没有把我们要回调的函数进行相应类型的转换,需要把Lua函数转换为整形Id值才能够提供给C++调用。
打开lua_hello_auto.cpp文件,找到
ok &= luaval_to_int32(tolua_S, 2, (&int&*)&arg0); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(!ok) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&0;
arg0 = toluafix_ref_function(tolua_S,2,0);
找到此时Lua函数就被转换为int值能够提供给C++调用了。点击关闭按钮,就会看到”hello”输出了。
而在Cocos-2dx 3.0中,Lua回调使用了ScriptHandlerMgr新的机制,通过创建C++对象,HandlerType和lua函数(handlerID)一一对应的映射关系,应用ScriptHandlerMgr进行统一管理。 接下来我们看看如何使用ScriptHandlerMgr:
我们已经使用tolua导出自定义类了,&void&registerChangeScriptFunc(int&onChangeCallback)对应lua_hello_auto.cpp中的int&lua_hello_HelloWorld_registerChangeScriptFunc(lua_State* tolua_S)函数
然后把 ok &= luaval_to_int32(tolua_S,&2,(int& *)&arg0);
&&&&return& 0;
改成 if&(!toluafix_isfunction(tolua_S,&2,&&LUA_FUNCTION&,&0 , &tolua_err)) {
&&&&&&&&&&&&goto& tolua_
LUA_FUNCTION&handler = (toluafix_ref_function(tolua_S,&2,&0 ));
ScriptHandlerMgr::HandlerType&handlerType = (ScriptHandlerMgr::HandlerType)(int)ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM ;
ScriptHandlerMgr::getInstance()-&addObjectHandler((void*) cobj, handler, handlerType);
其中,Lua_Function是在CCLuaValue.h定义(typedef&int&LUA_FUNCTION);其实就是int类型。 接下来就是定义回调函数的类型,我们这里设置的是EVENT_CUSTIOM类型。 然后就把它添加到管理器中,第一个参数是调用对象,第二个是函数句柄ID,第三个是定义的类型。
然后Lua注册函数跟上述一样,我们看看C++要怎么调用 同样menuCloseCallback()函数中添加:
auto&engine =&LuaEngine::getInstance ();
EventCustom&value(&HelloCallback& );
BasicScriptData&data(this, (void *)& value);
engine-&handleEvent(ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM, (void*)&data);
其中,EventCustom实例化对象用来传入Userdata,BasicScriptData第一个参数是事件所绑定的对象,第二个是传入的UserData,最后一句是来通过LuaEngine发送Event事件,执行lua函数。
至此,手动绑定Lua函数就大功告成了。
1、安装必要的工具包和库,以及配置相关环境变量,按照../cocos2d-x 3.x/tools/tolua/README.mdown所说的安装,注意,
不同操作系统有不同的安装内容。2、写C++测试类...
相关阅读排行
相关内容推荐
请激活账号
为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。
您的注册邮箱:
如果您没有收到激活邮件,请注意检查垃圾箱。2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2011年11月 专题开发/技术/项目大版内专家分月排行榜第二2011年8月 专题开发/技术/项目大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。cocos2d-x LUA Binding实现C++里访问LUA的自定义对象-提供留学,移民,理财,培训,美容,整形,高考,外汇,印刷,健康,建材等信息_突袭网
当前位置&:&&&&cocos2d-x LUA Binding实现C++里访问LUA的自定义对象
热门标签:&
cocos2d-x LUA Binding实现C++里访问LUA的自定义对象
来源: 由用户
编辑:王亮
LUA Binding比JSBinding要简单,无论是使用脚本自动绑定还是手动写绑定代码,都能很轻松实现在LUA访问C++的类和对象。但如果想在C++里访问LUA里的自定义类和对象,则需要再自己修改一下C++的代码了。
&&&&&&&& 应用场景:
1、& 假设在LUA里有一个类MyLayer,继承了CCLayer,并添加了a,b,c,d这4个属性。
2、在LUA里,创建一个MyLayer的实例对象,并添加到当前的Scene中,然后通过Scene.getChildByTag方法拿出这个MyLayer的实例对象时,会发现自定义属性a,b,c,d都消失了,原因在于调用了toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"CCNode");返回的是一个CCNode,下面是LuaCocos2d.cpp里的代码
static int tolua_Cocos2d_CCNode_getChildByTag00(lua_State* tolua_S)
#ifndef TOLUA_RELEASE
tolua_Error tolua_
!tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
goto tolua_
CCNode* self = (CCNode*)
tolua_tousertype(tolua_S,1,0);
int tag = ((int)
tolua_tonumber(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'getChildByTag'", NULL);
CCNode* tolua_ret = (CCNode*)
self-&getChildByTag(tag);
int nID = (tolua_ret) ? (int)tolua_ret-&m_uID : -1;
int* pLuaID = (tolua_ret) ? &tolua_ret-&m_nLuaID : NULL;
toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"CCNode");
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'getChildByTag'.",&tolua_err);
3、& 解决的方法很简单,说穿了一文不值,
a)、首先先调用tolua_usertype(tolua_S,"MyLayer");,注册自定义类,这句代码可以加在任何可以调用lua_State*这个指针的地方,但必须在初始化时只调用一次即可。
b)、将以下代码写在LuaCocos2d.cpp里,自己看着位置来放:
//扩展了getChildByTag,可以返回lua的对象,by lizc
/* method: getChildByTag of class
#ifndef TOLUA_DISABLE_tolua_Cocos2d_CCNode_getChildByTag01
static int tolua_Cocos2d_CCNode_getChildByTag01(lua_State* tolua_S)
#ifndef TOLUA_RELEASE
tolua_Error tolua_
!tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
(!tolua_isvaluenil(tolua_S,3,&tolua_err) && !tolua_isstring(tolua_S,3,0,&tolua_err)) ||
!tolua_isnoobj(tolua_S,4,&tolua_err)
goto tolua_
CCNode* self = (CCNode*)
tolua_tousertype(tolua_S,1,0);
int tag = ((int)
tolua_tonumber(tolua_S,2,0));
const char* userTypeName = ((const char*)
tolua_tostring(tolua_S,3,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'getChildByTag'", NULL);
CCNode* tolua_ret = (CCNode*)
self-&getChildByTag(tag);
int nID = (tolua_ret) ? (int)tolua_ret-&m_uID : -1;
int* pLuaID = (tolua_ret) ? &tolua_ret-&m_nLuaID : NULL;
toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret, userTypeName);
#ifndef TOLUA_RELEASE
tolua_lerror:
return tolua_Cocos2d_CCNode_getChildByTag00(tolua_S);
#endif //#ifndef TOLUA_DISABLE
c)、再添加
tolua_function(tolua_S,"getChildByTag",tolua_Cocos2d_CCNode_getChildByTag01);到tolua_function(tolua_S,"getChildByTag",tolua_Cocos2d_CCNode_getChildByTag00);下面,方便管理。
4、& 使用方法
--MyLayer必须继承自C++的某个类,这里就是继承CCLayer
local myLayer = MyLayer:create()
myLayer.a = 1
myLayer.b = 2
local scene = CCScene:create()
scene:addChild(myLayer, 0, 0)
myLayer = scene:getChildByTag(0, “MyLayer”)
myLayer = tolua.cast(myLayer, “MyLayer”)
cclog(“myLayer.a” .. myLayer.a)
cclog(“myLayer.b” .. myLayer.b)
更多精彩 >>>

我要回帖

更多关于 cocos2dx c 调用lua 的文章

 

随机推荐