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

最新文章

  1. hadoop集群安装无密码登录
  2. Active MQ 传输 ObjectMessage 异常
  3. js中的类数组对象---NodeList
  4. OD使用教程7
  5. [Unity3D]unity3d5.0简单的调用摄像头
  6. linux面试题1
  7. python集合set,frozenset--笔记
  8. [Django](1093, "You can't specify target table 'fee_details_invoices' for update in FROM clause") 错误
  9. [CSS3] 学习笔记-CSS3盒子样式
  10. JVM中判断对象是否存活的方法
  11. Android读写配置2
  12. mpvue前期准备
  13. 字符输出流 FileWriter
  14. maven 内置变量
  15. win10图片打开方式里没有默认照片查看器的解决方法
  16. spark partition 理解 / coalesce 与 repartition的区别
  17. 树莓派 温度监控 PWM 控制风扇 shell python c 语言
  18. BZOJ 4416 【SHOI2013】 阶乘字符串
  19. 函数的应用 "注册" and "登录"
  20. DocX插件

热门文章

  1. 51nod 1340 差分约束
  2. 题解报告:poj 3070 Fibonacci
  3. css为什么叫层叠样式表
  4. Unity学习-碰撞检测(七)
  5. Java系列学习(三)-基础语法
  6. canvas烟花锦集
  7. PHP流程控制语句(if,foreach,break......)
  8. css3 画小蜜蜂
  9. Android项目实战_手机安全卫士splash界面
  10. Android开发之ThreadLocal原理深入理解