cocos2dx之使用stdio构造排行榜
大家好,我是Lampard
今天与大家探讨一下如何使用stdio制造一个排行榜
突然收到这个需求,从未使用过cocosstdio的我内心一阵忐忑,还好有这位技术老哥的帮助之下,顺利完成了任务。
从stdio创建UI到导出VS的具体代码,这篇博客写地很全面。我也成功写出了这个东西;
今天主要是分析一下具体的代码(已经加了注释):
local RankView = class("RankView")
function RankView:ctor()
self:init();
end
function RankView:init()
--加载Rank.json文件
self.m_uiRoot = ccs.GUIReader:getInstance():widgetFromJsonFile("ui/Rank.json");
-- 获取整个图层
local panelMain = self.m_uiRoot:getChildByName("Panel_Main");
--获得滚动层
self.m_scrollViewRankList = panelMain:getChildByName("ScrollView_RankList");
--获得列表项
self.m_panelRankItem = self.m_scrollViewRankList:getChildByName("Panel_RankItem");
--引用计数加1,记住retain,必定会release(引用计数减1)
self.m_panelRankItem:retain();
--列表项从父节点中移除,此时减一
self.m_panelRankItem:removeFromParent();
self:resetScrollViewRankList();
end
function RankView:resetScrollViewRankList()
--创建10个列表项
local iTotalNum = 100;
local iTotalHeight = 0; --内容
for i = 1, iTotalNum do
local panelRankItem = self.m_panelRankItem:clone();
local imageRankNum = panelRankItem:getChildByName("Image_RankNum"); --重设置字体
local labelRankNum = imageRankNum:getChildByName("Label_RankNum");
labelRankNum:setString(i);
--getLayoutParameter():getMargin(),得到高度的位置
-- 从0开始添加,然后每一次加一个高度和一定的间隔
iTotalHeight = iTotalHeight + panelRankItem:getContentSize().height + panelRankItem:getLayoutParameter():getMargin().bottom;
--添加到滚动层
self.m_scrollViewRankList:addChild(panelRankItem);
end
--设置滚动层内容的大小
self.m_scrollViewRankList:setInnerContainerSize(cc.size(self.m_scrollViewRankList:getContentSize().width, iTotalHeight));
--别忘了,引用计数减1
self.m_panelRankItem:release();
end
return RankView
首先是调用生成出来的json文件,得到我们通过cocostdio创建的滑动层,滑动层上的界面等。
然后我们把原先滑动层上的界面删除掉,只保留滑动层,我们重新创建新的界面放在滑动层上。
为了节省时间,我们可以通过克隆的方式来复制旧的界面,然后在旧的界面上修改要输出的内容。
大部分的代码我们都能看懂,但是这个retain是干嘛用的呢?
有了解过cocos内存管理方式的同学可能都知道,每个对象在生成出来的时候,该最终父类Ref中有一个参数ReferenceCount会置为一,这个参数可以通过过retain增加和release减少,每当我们在一个帧没有调用这个对象时就会自动调用release函数,参数减一,当参数为0时引擎回收。一开始生成的时候为一,因为我们调用了removeFromParent()这个函数,所以会减一,为了不让lua把这个对象回收,我们要手动的 retain加一。
至于这个iTotalHeight参数,是记录当前滑动块的位置,通过循环递增,把我们要更新的界面都弄上去。
其他问题应该不大,有看不懂的可以一起交流交流,谢谢大家!