首先,我们说说这个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 第一行。好了什么都不用说了。相信你能明确这个存储了。

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

  1. Mac系统安装Lua(转)

    下载最新版的lua请点击,然后解压 运行“终端”进入到该文件夹下 ,主要是cd [文件夹名] 在“终端”输入 make macosx (回车) 在“终端”输入 make test (回车) 然后再输入 ...

  2. Mac系统安装Lua

    1.下载最新版的lua-5.2.3 请点击,然后解压 2. 运行“终端”进入到该文件夹下,主要是cd [文件夹名] 3.在“终端”输入    make macosx   (回车) 4.在“终端”输入  ...

  3. [寒江孤叶丶的Cocos2d-x之旅_36]用LUA实现UTF8的字符串基本操作 UTF8字符串长度,UTF8字符串剪裁等

    原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 一个用于UTF8字符串操作的类.功能比較 ...

  4. F#之旅0 - 开端

    F#之旅0 - 开端 UWP的学习告一段落,CozyRSS的UWP版本并没有做.UWP跟wpf开发几乎一模一样,然后又引入了很多针对移动设备的东西,这部分有点像android.没啥太大的意思,不难,估 ...

  5. Cocos2d-x 3.x游戏开发之旅

    Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...

  6. Lua windows环境搭建

    Lua语言的小巧和功能强大在朋友做的一个项目中得以验证,自己也尝试着了解一下,首先在window系统上搭建一个学习环境. 官网:https://www.lua.org/ 搭建运行环境提供2种方式,源码 ...

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

    内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的, ...

  8. NodeMCU之旅(四):实现Web配置页面

    引言 利用Web页面做配置可以轻松适应用户的多种设备,如Android, IOS等.本文将介绍如何在NodeMCU中实现配置页面. 接线图请参考NodeMCU之旅(三):响应配置按钮. 配置页面后端 ...

  9. lua c函数注册器

    lua与c的交互 关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数.而这些都是通过lua stack来进行的. c调用lua 在c里面使用lua,主要是通过l ...

随机推荐

  1. 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)

    题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...

  2. Python安装distribute包

    从官网https://pypi.python.org/pypi/distribute/0.6.49#downloads上下载distribute包,解压后进入解压文件的目录下,使用 python se ...

  3. Hadoop Hive概念学习系列之hive与依赖环境的交互(二十一)

    hive与环境的交互,算是一个小知识点,但掌握不菲! 如何在hive里,也达到这样呢? 不需要这样啦,因为,hive是建立在hadoop之上,启动hive,相当于,就是,hadoop jar ** h ...

  4. EasyUI系列学习(一)-入门

    1.什么是jQuery EasyUI jQueryEasyUI是一组基于jQuery的UI插件集合 2.jQueryEasyUI的特点 可以通过html标记来定义用户界面:支持扩展,可根据最近的需求扩 ...

  5. css3通过scale()实现放大功能、通过rotate()实现旋转功能

    css3通过scale()实现放大功能.通过rotate()实现旋转功能,下面有个示例,大家可以参考下 通过scale()实现放大功能 通过rotate()实现旋转功能 而transition则可设置 ...

  6. android shape stroke只绘制一边或者某几边

    <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android=" ...

  7. 设计模式——“signleton”

    那天别人问了我一个问题,关于单例模式的,由于之前了解的都是蜻蜓点水,所以重新复习了一次重新总结. 单例模式的写法总的来说有5种:懒汉,恶汉,枚举,双重校验锁,静态内部类 懒汉 public class ...

  8. sql server 数据库跨服务器备份,复制监视器——快照代理,复制流程

    在做数据库跨服务器复制时,查看复制监视器的快照代理,可以看到复制流程,具体如下: 初始化 连接发布服务器 设置服务器数据库兼容性级别 更新索引的统计信息 在生成快照时锁定已发布的表 复制快照数据(每个 ...

  9. html5——web存储

    基本概念 1.传统方式我们以document.cookie来进行存储的,但是由于其存储大小只有4k左右,并且解析也相当的复杂,给开发带来诸多不便 2.h5存储设置.读取方便,而且容量较大,sessio ...

  10. 4星|《超级技术:改变未来社会和商业的技术趋势》:AI对人友好吗

    超级技术:改变未来社会和商业的技术趋势 多位专家或经济学人编辑关于未来的预测,梅琳达·盖茨写了其中一章.在同类书中属于水平比较高的,专家只写自己熟悉的领域,分析与预测有理有据而不仅仅是畅想性质. 以下 ...