1. 程式人生 > >cocos-lua學習筆記(五)cocos2d-Lua類的實現

cocos-lua學習筆記(五)cocos2d-Lua類的實現

一、cocos2d-lua繼承的程式碼

開啟src->framework->function.lua

**注意:** Lua 繼承類覆蓋的方法並不能從 C++ 呼叫到。也就是說通過 C++ 程式碼呼叫這個 cc.Node 物件的 setPosition() 方法時,並不會執行我們在 Lua 中定義的 Toolbar:setPosition() 方法。

@param string classname 類名
@param [mixed super] 父類或者建立物件例項的函式

@return table

]]

   function class(classname, super)

    local superType = type(super)
    local cls
--superType獲取父類型別,可以使nil、function以及table.
--如果superType 是nil,說明類是獨立的,沒有父類。
    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 從父類copy 欄位
            for k,v in pairs(super) do cls[k] = v end
            cls.__create = super.__create
            cls.super    = super
        else    --父類是函式
            --把當前類的建立函式,改為父類的函式
            cls.__create = super
            cls.ctor = function() end
        end
        --賦值類名
        cls.__cname = classname
        cls.__ctype = 1
        --建立new方法
        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
        --建立物件時,可以通過className.new這種方式來建立
        --如 local MySpriteClass = class("MySpriteClass",cc.Sprite)
        --     return MySpriteClass
        --mySpriteClass 例項建立
        --   local mySprite = MySpriteClass.new(xxx.png)
    else
        --父類是lua物件時,cls.__ctype 不為1 superType不是函式
        -- inherited from Lua Object
        if super then
            cls = {}
            --設定cls 元表是父類表
            setmetatable(cls, {__index = super})
            --儲存父類表
            cls.super = super
        else
            --nil的情況
            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

二、分析兩種繼承

舉個例子  

print(type(cc.Node))
print(type(cc.Node.create()))

cc.Node是table,但它創建出來的例項物件時userdata,userdata描述C建立的新型別。

由於userdata和table不同,所以需要兩種繼承。

UserData(使用者自定義型別)

意義:使用C語言編寫的用於擴充套件Lua的新型別,方便使用指令碼編寫或者提高效率

userdata:提供了一塊原始的記憶體區域,用於儲存任何東西,在Lua中userdata沒有任何預定義操作
生成:void *lua_newuserdata(L,size) 根據指定大小分配一塊記憶體,並將userdata壓入棧中,最後返回這個記憶體塊的地址


來自書上的圖。

classname.new()生成的instance包含一個class屬性。class指向了類原型,並具有super,ctor,__cname和__ctype  4個屬性

繼承C++的類,new方法使用__create函式來建立例項

繼承lua類,new方法使用{ }來建立例項。

繼承Lua的類,new方法使用{ }來建立例項。

不是特別理解,書上寫的這些東西。

日後有更完善的例子,我就加到這下面。 ~~~~~~~~~~

相關推薦

cocos-lua學習筆記()cocos2d-Lua實現

一、cocos2d-lua繼承的程式碼 開啟src->framework->function.lua **注意:** Lua 繼承類覆蓋的方法並不能從 C++ 呼叫到。也就是說通過 C++ 程式碼呼叫這個 cc.Node 物件的 setPosition() 方

cocos-lua學習筆記(六)一個簡單的Button

注意:使用版本為3.7.1版本,最新版本。 舊版本使用cc.ui,新版本直接使用ccui。 local MainScene = class("MainScene", function()

cocos-lua學習筆記(四)HelloWorld結構分析

版本:Quick-Cocos2dx-Community 3.7.1 注意:win32 player 使用 vs2015 編譯,如果你的系統沒有安裝 vs2015,需要安裝 vs2015 執行庫方能正確啟動 player。執行庫下載地址:VS2015 執行庫。 點選set

lua學習筆記】——2在sublime中配置Lua運行環境

author command ges () 作者 ctrl+ bindings text inf 一、讓Sublime可以運行lua腳本 打開sublime 選擇tools-->Build System-->New Build System 在新出現的文件中

lua學習筆記1 環境配置

http windows 安裝完成 顯示 get 技術分享 開發平臺 org www 1 開發平臺 windows7 64位 2 下載鏈接 http://www.lua.org/download.html 3 安裝完成-環境配置 4 運行 WIN+R 運行

Python學習筆記_數據型(字符串)

rep 字母 HERE () sdi 內置 一個 XP orm 已經學習過的數據類型包括:int、float、list、tuple、dict。這篇來單獨記錄下字符串。單獨將字符串這種數據類型寫出來,是因為python裏有很多非常有用的字符串內置方法。 一、字符串定義 字符串

csdn學習筆記一:lua 迭代器

  無狀態的迭代器(不使用閉包方式), ipairs函式 a = {10,20,30,40,50,60} for k,v in ipairs(a) do print(k,v); end ----------------------------- output: 1

redis lua 學習筆記

   最近工作中要做一個秒殺系統,使用者的秒殺次數、分享數、優惠券的餘額等都存放在了redis中,所以需要對redis的操作保證原子性。    當然可以在伺服器端做鎖操作,不過更為方便的是在redis端操作。    於是想到了redis的lua指

Lua學習筆記(1): HelloWorld和資料型別

Lua是一個輕量級的指令碼語言,由c語言編寫,容易嵌入到應用中,深受遊戲開發者的青睞 環境安裝 選用SciTE作為lua的IDE 可以在github找到這個開源的軟體 SciTE下載連結 安裝好之後開啟 環境搭建完成 HelloWorld Fil

Lua學習筆記(2): 流程控制與迴圈

條件判斷語句 --if...語句 if (表示式) then --表示式為1時執行的語句 end --if...else語句 if (表示式) then --表示式為1時執行的語句 else --表示式為0時執行的語句 end

Lua學習筆記(6): 函式

Lua的函式 函式用於簡化程式,當某些工作需要重複執行的時候就可以使用函式減輕工作量(雖然複製貼上也行) 語法: function 函式名(引數列表) 函式體 return 返回值 end --結束標誌 function識別符號用於宣告函式,函式的返回

lua學習筆記---流程控制語句(if else)

其實這些在使用熟練之後都無需記錄,目前這些也很熟練了。擔心後面長時間不用lua,忘了基本的格式,所以記錄一下。 if(布林表示式) then --1 elseif(布林表示式)then --2 else --3 end 例子: c=10 if(c>1

lua學習筆記----table操作

1.table的連線 table.concat(mytable," ",begin,end)   返回值是一個字串 引數1:要進行操作的表,引數2:某個元素之間以什麼分割, 引數3:起始元素,終止元素 mytable={"banana","apple","orange"

lua學習筆記---元表(Metatable)

元表的作用在於對於兩個表之間的操作,改變table的行為。 1.設定/獲取元表 mytable={} mymetatable={} mytable=setmetatable(mytable,mymetatable) 將mymetatable設定為mytable的元表

Lua學習筆記(總結Runoob.com)上

Lua學習筆記(總結Runoob.com) 概述 文章是對Rounoob.com所有的Lua文章進行學習的個人總結筆記,有些是Runoob.com抄寫的內容,主要是自己看來一遍,把裡面的東西都實現了,然後手打了一遍知識點,進行遷移到這裡,由於文章比較長,所以對其進行拆分,這是

Lua學習筆記

最近準備把lua應用到之前寫過的Unity專案中,所以先學一下Lua,在這裡做點筆記,自己沒事翻翻看就好。 lua學習記錄 lua的變數型別 nil string number boolean table(“表”,lua的面向物件由表實現) function

Typescript 學習筆記

中文網:https://www.tslang.cn/ 官網:http://www.typescriptlang.org/ 目錄: Typescript 學習筆記一:介紹、安裝、編譯 Typescript 學習筆記二:資料型別 Typescript 學習筆記三:函式 Type

lua 學習筆記

1.1 一個程式塊就是一連串的語句或命令 幾條連續的lua語句之間不需要分隔符,但用分號來分隔語句也是合法的。 退出lua直譯器互動模式使用os。exit(); 使用-i引數啟動lua直譯器,直譯器會在執行完指定程式後進入互動模式 使用dofile執行程式塊 1,載入lua

lua 學習筆記

11.0 lua中的習慣一般是以1作為陣列的起始索引,lua庫和長度操作符都遵循這個約定。 對於稀疏矩陣,存在大量的“空洞(nil值)”,遍歷矩陣的效率很低,通常使用pairs且只遍歷非nil元素。訪問順序是無序的。P118 字串緩衝問題可能導致對字串的操作消耗大量的時間,

lua學習筆記--互動模式簡單說明

互動模式,就是你用命令驅動執行lua程式碼。你用過dos或者shell的話,那個裡面的命令ls cd之類的輸入進去時候,命令列給出相應的反饋結果。這個過程和互動模式是類似的。 互動嘛,就是你輸入命令或者程式碼,它給你反饋,然後你再接著往下操作...