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之類的輸入進去時候,命令列給出相應的反饋結果。這個過程和互動模式是類似的。 互動嘛,就是你輸入命令或者程式碼,它給你反饋,然後你再接著往下操作...