• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
CentOS上配置lua的服务器环境(enet)发布时间:2022-07-22
下一篇:
Unicode与UTF-8互转(c语言和lua语言)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap