游戏人生(一),我的lua之旅:那些坑爹的CCBReaderLoad

首先,我们说说这个CCBReaderLoad。

这个脚本是cocos2dx自带的一个lua+cocosbuilder 的工具,详细功能呐,往下看。

先来看下我遇到的一个问题:

————美工给了我一个.ccbi文件。让我放到游戏里去。

然后我们说说这个ccbi。ccbi是cocosbuilder绘制界面导出的文件,有兴趣的同学能够自行去百度。

我们来讨论下怎样用这个ccbi,以及ccbi中的坑。

先来看一段testlua的代码

TestMenusLayer = TestMenusLayer or {}

ccb["TestMenusLayer"] = TestMenusLayer

local function onMenuItemAClicked()

if nil ~= TestMenusLayer["mMenuItemStatusLabelBMFont"] then

local labelBmFt = tolua.cast(TestMenusLayer["mMenuItemStatusLabelBMFont"],"CCLabelBMFont")

if nil ~= labelBmFt then

labelBmFt:setString("Menu Item A clicked.");

end

end

end

local function onMenuItemBClicked()

if nil ~= TestMenusLayer["mMenuItemStatusLabelBMFont"] then

local labelBmFt = tolua.cast(TestMenusLayer["mMenuItemStatusLabelBMFont"],"CCLabelBMFont")

if nil ~= labelBmFt then

labelBmFt:setString("Menu Item B clicked.");

end

end

end

local function pressedC( ... )

if nil ~= TestMenusLayer["mMenuItemStatusLabelBMFont"] then

local labelBmFt = tolua.cast(TestMenusLayer["mMenuItemStatusLabelBMFont"],"CCLabelBMFont")

if nil ~= labelBmFt then

labelBmFt:setString("Menu Item C clicked.");

end

end

end

local function onMenuTestClicked()

cclog("CCBMenuTest");

local scene = CCScene:create()

local  proxy = CCBProxy:create()

local  node  = CCBuilderReaderLoad("cocosbuilderRes/ccb/ccb/TestMenus.ccbi",proxy,HelloCocosBuilderLayer)

local  layer = tolua.cast(node,"CCLayer")

if nil ~= HelloCocosBuilderLayer["mTestTitleLabelTTF"] then

local ccLabelTTF = tolua.cast(HelloCocosBuilderLayer["mTestTitleLabelTTF"],"CCLabelTTF")

if nil ~= ccLabelTTF then

ccLabelTTF:setString("ccb/ccb/TestMenus.ccbi")

end

end

if nil ~= scene then

scene:addChild(layer)

scene:addChild(CreateBackMenuItem())

CCDirector:sharedDirector():pushScene(CCTransitionFade:create(0.5, scene, ccc3(0,0,0)));

end

end

TestMenusLayer["onMenuItemAClicked"] = onMenuItemAClicked

TestMenusLayer["onMenuItemBClicked"] = onMenuItemBClicked

TestMenusLayer["pressedC:"] = pressedC

看不懂没关系,我们来解释下这个段代码:

首先解释

TestMenusLayer = TestMenusLayer or {}

ccb["TestMenusLayer"] = TestMenusLayer

这个是将ccbi元素存储到TestMenusLayer这个table里。详细实现我们后面在说。

注意的是这个ccb["TestMenusLayer"] 就是ccbi结构中的根节点

然后再看

TestMenusLayer["onMenuItemAClicked"] = onMenuItemAClicked

TestMenusLayer["onMenuItemBClicked"] = onMenuItemBClicked

TestMenusLayer["pressedC:"] = pressedC

onMenuItemAClicked,onMenuItemBClicked。pressedC 这个不用多说是上面的回调方法。

lua中变量能够是方法。

TestMenusLayer["pressedC:"]

其它两个同理。这个是回调须要的selector

须要注意下面几点:

1、以上代码仅仅适用于 doucment root/doc root var。

2、selector在ccbi中的数量要与方法中回调数量一直。多或者少都会造成异常

3、假设出现界面显示成功可是回调失败的情况,请检測根节点是否书写错误。

典型问题

Cocos2d: [LUA-print] LUA ERROR: [string "CCBReaderLoad.lua"]:73: attempt to concatenate local ‘callbackName‘ (a userdata value)

Cocos2d: [LUA-print] stack traceback:

...1330379-BE60-47BF-8151-D8068E8D1DEB/Sok.app/src/main.lua:11: in function ‘__concat‘

[string "CCBReaderLoad.lua"]:73: in function ‘CCBuilderReaderLoad‘

这个问题烦了我好几天,搞的我头的大了。

我们分析下这个东西。非常明显CCBReaderLoad.lua 73行,走起

73行。一行print,和日志报的内容也不一样,无论他,先凝视掉,然后再print(“123123”);

执行结果发现果然不再报错了。日志显示了我们的123123.显然这里出了问题,我们看看什么情况:67行if 是 function 显然我们的回调方法有的不被觉得是方法。

根本原因是注冊的selector与回调方法数量不一致。细致检查就会发现了。

最后我们在说说

TestMenusLayer = TestMenusLayer or {}

ccb["TestMenusLayer"] = TestMenusLayer

CCBReaderLoad 第一行。好了什么都不用说了。相信你能明确这个存储了。

时间: 2024-12-18 11:12:17

游戏人生(一),我的lua之旅:那些坑爹的CCBReaderLoad的相关文章

centos下安装lua环境

lua的官方网址: http://www.lua.org/start.html 在lua官网中有介绍linux下lua环境的安装方法如下: 如果遇到问题,看下载文件中的readme文件: README文件内容如下: 用浏览器打开readme.html文件,你会看到很详细的解决办法 以上应该可以解决你遇到的所有问题了,下面看看你是否安装成功,敲入lua命令,进入lua的shell中执行: 如果用文件执行lua脚本,可以这样: 好啦,可以开始学习lua之旅了--

Mac系统安装Lua(转)

下载最新版的lua请点击,然后解压 运行“终端”进入到该文件夹下 ,主要是cd [文件夹名] 在“终端”输入 make macosx (回车) 在“终端”输入 make test (回车) 然后再输入“sudo make install”命令,会要求输入Password: 输入相应密码(你的密码),然后回车就自动安装了 待安装完成后可输入lua -v,回车就会看到 :Lua 5.2.0 Copyright (C) 1994-2011 Lua.org, PUC-Rio OK ,已经安装成功!然后你

为什么RPP比lua更适合做脚本语言?

1.RPP以静态类型为主,最终的效率肯定比动态类型的lua要高,并且不会引起GC停顿.(目前与luaJIT性能接近) 2.RPP没有GC(自动垃圾回收),与C/C++互相调用简单直接,而且他们共享进程内存空间,RPP变量和C++变量生命周期相同,不会出现像lua一样的这里变量已经GC了那边还在使用. 3.RPP目前兼容50%的C++语法,70%的C语法,因此它天生就更亲近C++系的语法,所以C++程序员几乎无需学习即可使用. 4.RPP支持指针和内联汇编,底层操作更方便. 当然lua已经发展了许

微软私有云分享(R2)5-域升级造成Hyper-V主机无法实时迁移

这次介绍的案例是一个很有意思的故障,说它有意思是因为这个问题从Windows Server 2003到Windows Server 2012 R2,都有可能出现------具有广谱.杀伤力大.崩溃指数高等特点. 具体故障描述是这样的:当Active Directory域从2003升级至2008或更高版本,或其他级别的升级或其他不知道什么样但是对Active Directory域进行了某些操作后,Hyper-V(Windows Server 2012和Windows Server 2012 R2都

[寒江孤叶丶的Cocos2d-x之旅_26]重大喜讯!CocoStudio终于支持导出LUA文件了!

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 CocoStudio虽然好用,但是使用该工具导出的文件加载速度实在是慢,Json版本的文件慢的感人,二进制版本虽然相比之下快很多,但是依旧差强人意.这导致很多公司放弃CocoStudio,而采用程序员手写代码的形式开发UI,虽然这对程序造成了很大的压力,但是为了游戏的运行效果,只得妥协(其中包括我们公司). 今天Cocos的发布会发布了最

高频访问IP限制 --Openresty(nginx + lua) [反爬虫之旅]

嗯-.本人是从写爬虫开始编程的,不过后面做web写网站去了,好了,最近web要搞反爬虫了,哈哈哈,总算有机会把之以前做爬虫时候见识过的反爬一点点给现在的网站用上了~ 做爬虫的同志,有怪莫怪喽~还有求别打死 > < 首先要提一下AJAX,现在普天下网页几乎都是往特定的数据接口请求数据了,除了什么首屏渲染这种服务端渲染好html以外,几乎没有什么静态网页了.我看了有一些帖子说AJAX让爬虫难做,可是我觉得结合一些工具(比如chrome的开发者工具),找到AJAX所请求的后端数据接口一点也不难,而且

【Linux学习之旅】之Ubuntu 14.04下的Wireshark出现Wireshark - Lua: Error during loading...

Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:46: dofile has been disabled due to running Wireshark as superuser. See http://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

【C++探索之旅】开宗明义+第一部分第一课:什么是C++?

内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的,你不知道如何入门? 别担心,这个系列教程就是为C++初学者准备的. 不可否认,C++是一门非常著名的语言.几乎学计算机的同学都难免要碰一下C++,中国的大学课堂一般也是先学C语言入门,然后就是Java或者C++. C++ 这门语言的使用很广泛,特别是在游戏开发领域,C++的性能和无限可能性使得其几乎