• 游戏人生(一),我的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 第一行。好了什么都不用说了。相信你能明确这个存储了。

  • 相关阅读:
    sql分页查询
    SQL语句优化技术分析
    大型数据库的设计原则与开发技巧
    Microsoft SharePoint Server 2010 的新增功能
    Installing SharePoint 2010 on Windows 7
    Missing the ManageContent and structure in MOSS 2010
    Simple SharePoint 2010 + Silverlight + Client Object Model Example
    SharePoint 2010 Central AdminCreate/Extend Web Application button on Ribbon are disabled
    利用SharePoint Designer 修改列表页面实例
    数据库设计中的14个技巧
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6915035.html
Copyright © 2020-2023  润新知