1. 程式人生 > >cocos2d-x 的lua繼承

cocos2d-x 的lua繼承

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