溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Lua(3) ——Cocos之_語法糖class

發(fā)布時間:2020-06-08 23:52:16 來源:網絡 閱讀:14080 作者:shahdza 欄目:游戲開發(fā)

【嘮叨】

    在使用Lua的時候,cocos2d-x為我們提供了一個 class(classname, super) 這個函數。

    它可以讓我們很方便的定義一個類,或者繼承cocos2d-x的某個類。

    PS:class()是cocos2d-x為我們封裝的函數,本身Lua沒有這個函數。

    基于Lua 5.1。


【Demo下載】

    https://github.com/shahdza/Cocos_LearningTest/tree/master/Lua%E4%B9%8Bclass%E7%B1%BB 




【class】


    class函數是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定義的。


-- Create an class.

function class(classname, super)

    local superType = type(super)

    local cls


    if superType ~= "function" and superType ~= "table" then

        superType = nil

        super = nil

    end


    if superType == "function" or (super and super.__ctype == 1) then

        -- inherited from native C++ Object

        cls = {}


        if superType == "table" then

            -- copy fields from super

            for k,v in pairs(super) do cls[k] = v end

            cls.__create = super.__create

            cls.super    = super

        else

            cls.__create = super

        end


        cls.ctor    = function() end

        cls.__cname = classname

        cls.__ctype = 1


        function cls.new(...)

            local instance = cls.__create(...)

            -- copy fields from class to native object

            for k,v in pairs(cls) do instance[k] = v end

            instance.class = cls

            instance:ctor(...)

            return instance

        end


    else

        -- inherited from Lua Object

        if super then

            cls = clone(super)

            cls.super = super

        else

            cls = {ctor = function() end}

        end


        cls.__cname = classname

        cls.__ctype = 2 -- lua

        cls.__index = cls


        function cls.new(...)

            local instance = setmetatable({}, cls)

            instance.class = cls

            instance:ctor(...)

            return instance

        end

    end


    return cls

end


    在Lua中類的概念就是table表,而上面的函數代碼主要做的就是對父類super的表進行拷貝,然后再定義了兩個函數 cls.new(...)cls:ctor(...) 。如果我們不了解上面的代碼,也是沒有關系的,只要我們會使用它就夠了。


0、使用方法

    定義一個類:cls = class("類名","父類")

    > 創(chuàng)建實例  :obj = cls.new()

    初始化函數:cls:ctor()    在創(chuàng)建實例的時候,會自動調用

    

    只要掌握這三步驟,對于我們cocos2d-x的開發(fā)已經夠用了!


1、創(chuàng)建基類

    首先創(chuàng)建一個Hero類,然后重寫Hero類的初始化函數Hero:ctor() 。

    再創(chuàng)建一個Hero類的實例對象Hero.new() ,會自動調用初始化函數Hero:ctor() 。

    測試輸出。

    注意:其中ctor()中出現的 self 為實例對象本身,就相當于C++類中的 this


    Lua(3) ——Cocos之_語法糖class



2、繼承父類

    在cocos2d-x開發(fā)中,經常需要繼承引擎中的類,如Layer、Sprite等。

    這里舉例,將上面的Hero類修改一下,繼承自Sprite。

    Lua(3) ——Cocos之_語法糖class



3、再舉個例子:繼承Layer類

    我一般習慣在 ctor() 中只聲明一些類的成員變量。

    然后再自定義一個函數 create() ,將 new() 進行封裝,然后在 create() 中調用 init() 函數進行實例對象的初始化工作。

    這樣的好處就是:在使用上就和我在C++中的使用的方式一樣了。


 3.1、定義一個繼承于Layer的類

Lua(3) ——Cocos之_語法糖class


 3.2、使用方法

    > 創(chuàng)建包含GameLayer層的Scene場景:GameLayer:createScene()

    > 創(chuàng)建一個GameLayer層-----------GameLayer:create()

    > 而在創(chuàng)建GameLayer時,也會調用自定義的初始化函數 init()

    > 類的成員變量,均在 ctor() 中進行聲明即可。



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI