Quick Cocos2d x UI容器項拷貝

2021-06-28 08:07:34 字數 2891 閱讀 6595

quick-cocos2d-x中,listview:pushbackcustomitem()以及widget:clone(),均會導致模板控制項中事先儲存的自定義屬性消失。這使得我們要每次轉殖時需重新獲取子控制項引用。本文提供乙個解決方案。

問題描述

使用listview時,通常有兩個部分,乙個是list容器本身,另乙個是子項模板templete。templete上有一些控制項與資料相關聯,比如揹包物品的圖示(imageview)、數量(label)等。下面以clone方案為例,假設有乙個面板panelbag.json,它裡面有乙個名為lstitem的listview;另外有乙個揹包項widgetitem.json,它裡面有乙個lbname的label用於標識物件名稱。

理想的寫法1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

function panelbag:initialize()

self._widget = guireader:sharereader():widgetfromjsonfile("res/panelbag.json")

self._lstitem = self._widget:getchildbyname("lstitem")

self:addwidget(self._widget)

self._tplitem = guireader:sharereader():widgetfromjsonfile("res/widgetitem.json")

self._tpltest._lbname = self._tpltest:getchildbyname("lbname")

self:addtest("one")

self:addtest("two")

self:addtest("three")

end

function panelbag:additem(name)

local widgetitem = self._tplitem:clone()

widgetitem._lbname:settext(name)                 -- nil錯誤,_lbname引用丟失

self._lstitem:pushbackcustomitem(widgetitem)

end

改進

如果在clone之後重新用getchildbyname獲取一次子控制項,一旦item項變得多,並且子控制項更加複雜時,瞬間速度受收到影響。下面是改進方案。

1

2

3

4

5

6

7

8

function panelbag:additem(name)

local widgetitem = self._tplitem:clone()    -- 拷貝c++資料

local peer = tolua.getpeer(self._tplitem)   -- 拷貝peertable

tolua.setpeer(widgetitem, peer)

widgetitem._lbname:settext(name)             -- _lbname已經可以訪問了

self._lsttest:pushbackcustomitem(widgetitem)

end

原理

c++函式widget::clone()的返回值是乙個usertype,lua中對ussertype的擴充套件通過peertable實現。也就是說clone呼叫後,我們獲得的是_tpltest丟棄了peertable的乾淨拷貝,這也是_lbname引用丟失的原因。那麼只需將_tpltest的peertable賦予新的widgetitem就可以還原引用。

優點

****:

cocos2dx ui顯示機制

1,a.addchild b a的寬高沒變,還是自己的寬高。層級新增 不會改變原層大小。2.node.addchild sprite node的寬和高也沒變 感覺2dx的顯示不是樹形結構。然後改變node的透明度也不管用,node不是個顯示類,感覺唯一的作用就是操作很多個sprite。一起改變位置 ...

quick cocos2d lua 基礎概念

控制場景的切換,cocos2d lua中把類抽象為導演類。開始 結束遊戲 遊戲場景的切換 設定或獲取一些系統資訊 場景可以包括多個層,層又可以擁有任意個遊戲節點,是其他元素的容器。建立場景 display.newscene name 切換場景 display.replacescene newscen...

QUICK COCOS2DX建立新專案

建立新專案之前,確保已經正確設定了quick cocos2dx root環境變數 啟動 終端 應用程式,然後進入需要放置新專案的目錄 cd desktop執行create project.sh命令,並指定專案的 package name quick cocos2dx root bin create ...