cocos2d-x 的lua繼承
阿新 • • 發佈:2019-02-05
lua的類
(1)lua的類實際上就是lua的 table ,類之間的繼承實際上就是吧 table 連到一起了,呼叫方法和屬性,就是先去第一個table搜尋如果沒有再去連在後面的table裡搜尋。
(2)lua裡的self實際上就是table了,也能代表類名
(3)lua繼承
local self = {} setmetatable(self , classA) 在表self基礎上建立classA,classA是一個新表 setmetatable(classB , classA) 在表classA基礎上建立classB,classB是一個新表
(4)表唯一的標示
classA.__index = classA
2dx的lua繼承
(1)class 是 cocos2d-x 的方法
class("A", B) A 繼承 B,B必須是lua檔案裡的類
(2)setmetatable(A, B) 是 lua 的繼承, A 繼承 B
(3)通過 tolua 的繼承 tolua.getpeer(target) target:cc.Sprite:create(img) 是C++的一個物件
再通過 setmetatable(t, ChilSprite) 實現對 C++物件的繼承
local ParentOne = class("ParentOne") function ParentOne:testDemo() print('ParentOne demo') end --父類 ParentOne local ChilSprite = class("ChilSprite", ParentOne) ChilSprite.__index = ChilSprite function ChilSprite.extend(target) local t = tolua.getpeer(target) --tolua的繼承 if not t then t = {} tolua.setpeer(target, t) end setmetatable(t, ChilSprite) return target end function ChilSprite:createS(img) local sprite = ChilSprite.extend(cc.Sprite:create(img)) return sprite end function ChilSprite:myFunc(img) print("ChilSprite myFunc "..img) end function ChilSprite:goFunc() print("ChilSprite goFunc ") end --父類 ChilSprite local ChilLayer = class("ChilLayer", ChilSprite) ChilLayer.__index = ChilLayer function ChilLayer.extend(target) local t = tolua.getpeer(target) if not t then t = {} tolua.setpeer(target, t) end setmetatable(t, ChilLayer) return target end function ChilLayer:createL(img) local sprite = ChilLayer.extend(cc.Sprite:create(img)) return sprite end function ChilLayer:myFunc(img) print("ChilLayer myFunc "..img) end local function testBccLayer( scene ) local ball = ChilLayer:createL("Images/ball.png") ball:setPosition(cc.p(VisibleRect:center().x - 110, VisibleRect:center().y - 110)) ball:setScale(3) scene:addChild(ball, 1111) local cball = ChilLayer:createS("Images/ball.png") --呼叫父類的方法 cball:setPosition(cc.p(VisibleRect:center().x + 110, VisibleRect:center().y + 110)) cball:setScale(3) scene:addChild(cball, 1111) ball:myFunc("1235") --呼叫自己的方法,覆蓋父類的方法 ball:goFunc() --呼叫父類的方法 ball:testDemo() --呼叫父類的父類方法 end function testBcc(scene) testBccLayer(scene) end