首页 > 代码库 > 游戏人生(一),我的lua之旅:那些坑爹的CCBReaderLoad
游戏人生(一),我的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‘
执行结果发现果然不再报错了。日志显示了我们的123123.显然这里出了问题,我们看看什么情况:67行if 是 function 显然我们的回调方法有的不被觉得是方法。
根本原因是注冊的selector与回调方法数量不一致。细致检查就会发现了。
最后我们在说说
TestMenusLayer = TestMenusLayer or {}
ccb["TestMenusLayer"] = TestMenusLayer
CCBReaderLoad 第一行。好了什么都不用说了。相信你能明确这个存储了。
游戏人生(一),我的lua之旅:那些坑爹的CCBReaderLoad