quick-cocos2d-x 踩坑日记(一)------ NodeEx 与 shortcodes

    今天在模仿一个demo,想自己去完善一些功能,自己写的时候就遇见了一个坑。。。先看代码:

    

local label = cc.ui.UILabel.new({	
    UILabelType = 1,
    text = "Max Score 10",
    font = "fonts/font-issue1343.fnt",
    x = boardSize.width / 2,
    y = boardSize.height * 0.4,
    }):addTo(self.overboard)
      :setAnchorPoint(0.5, 0.5)

    当我调用label:setString()的时候,竟然没变化,看输出信息,发现label是nil!!!我就奇怪来了,后来去找源码样例,看看是不是我哪写错了。代码如下:

local label = cc.ui.UILabel.new({
    text = "",
    size = 14,
    color = display.COLOR_BLACK
    }):align(display.LEFT_CENTER, display.left + 60, display.top - 60)
      :addTo(self)

    这个代码中的label就不为nil,都是用cc.ui.UILabel.new创建的为什么不一样呢?原来问题出在后面函数的调用上。看源码:

function Node:addTo(target, zorder, tag)
    target:addChild(self, zorder or self:getLocalZOrder(), tag or self:getTag())
    return self
end
function Node:align(anchorPoint, x, y)
    self:setAnchorPoint(display.ANCHOR_POINTS[anchorPoint])
    if x and y then self:setPosition(x, y) end
    return self
end

    addTo和align都会返回调用对象,而setAnchorPoint没有返回值,在第一段代码中执行完setAnchorPoint()后没有对label赋值,所以为nil;在第二段代码中调用的函数一直返回调用对象,所以对label赋值了。

    addTo是在shortcodes文件里,align在NodeEx文件里。shortcodes里的函数都会返回调用对象本身。

    这次踩坑让我明白,addTo与addChild的区别,也学到shortcodes使用技巧。例如当你创建一个对象不需要在以后改动时,用shortcodes里封装的函数,可以省去取名字的过程。(大家也遇见过在同一文件代码多了,名字难取的情况吧-_-!)

    踩坑结束!如有不足之处,请大家指出,一起交流成长!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章