分析cocos2d x的lua專案中的工具方法

2021-06-22 00:43:46 字數 3167 閱讀 6643

在建立完cocos2d-x的lua專案後,開啟專案的resources中的extern.lua檔案。裡面有兩個用於物件導向的方法,乙個是用於轉殖,乙個是用於繼承。**分析如下

--轉殖乙個物件

function clone(object)

--用於儲存被訪問過的物件的表

local lookup_table = {}

local function _copy(object)

if type(object) ~= "table" then--如果類別不等於table,返回當前引數

return object

elseif lookup_table[object] then--如果備份表中存在該物件,則直接返回

return lookup_table[object]

endlocal new_table = {}--建立乙個新的表

lookup_table[object] = new_table--把即將被訪問過的表存到備份表

for key, value in pairs(object) do--遍歷,賦值

new_table[_copy(key)] = _copy(value)

endreturn setmetatable(new_table, getmetatable(object))--設定元表,用於繼承

endreturn _copy(object)

end--create an class.

--建立類(類名, 父類)

function class(classname, super)

local supertype = type(super)--獲取父類的型別

local cls--定義乙個變數,用來儲存新建立的類的屬性和函式

if supertype ~= "function" and supertype ~= "table" then--如果父類不是function類別或表類別,父類置空

supertype = nil

super = nil

endif supertype == "function" or (super and super.__ctype == 1) then--如果父型別是個function或者來自是c++的類

-- inherited from native c++ object

print(supertype)

cls = {}

if supertype == "table" then--來自引擎自帶的c++類

-- copy fields from super

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

cls.__create = super.__create

cls.super = super

else--function

cls.__create = super

endcls.ctor = function() end--構造

cls.__cname = classname--類名

cls.__ctype = 1--指明派生與c++的類

--建立乙個用於建立類的例項的方法

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--建立乙個屬性,指向cls

instance:ctor(...)--構造

return instance

endelse

-- inherited from lua object

if super then--如果父類不為空

cls = clone(super)--把類轉殖,放到cls中

cls.super = super--建立乙個屬性,指向父類

else

cls = --否則建立乙個空的建構函式

endcls.__cname = classname--建立乙個屬性,指明類的名稱

cls.__ctype = 2 -- lua 指明繼承自lua自定義的表

cls.__index = cls --把__index指向自己,用於形成乙個繼承的原型鏈

--建立乙個用於建立類的例項的方法

function cls.new(...)

local instance = setmetatable({}, cls)--建立乙個空表,並設定它的元表為cls,即繼承cls

instance.class = cls--建立乙個屬性,指向cls

instance:ctor(...)--呼叫建構函式

return instance

endend

return cls

end

測試用例如下

在hello.lua檔案中加入如下**

--引入extern.lua

require "extern"

--test

local function test()

local luatable =

local n = class("n", luatable)

cclog("繼承lua自定義的表,訪問父類的x屬性值:x="..n.x)

cclog("用c++本地類的方式繼承,訪問父類修改後的屬性:"..m:getopacity())

cclog("訪問子類屬性:"..m:getopacity())

endtest()

執行,結果如下

cocos2dx戰爭迷霧實現 lua

tilemap的美術資源 戰爭迷霧 戰爭迷霧的原理在網上已經有相關資料,就不補充了。戰爭迷霧用 t1中索引與tilemap的gid對應,右邊值 表 與tilemap的資源對應。p.t1 2 3 5 6 8 13 15 7 12 4 14 9 11 10 1 t2索引與t1的右邊的表的數字的和對應,值...

cocos2dx動作框架分析

cocos2dx提供了豐富的動作實現的類。其中最主要的兩個類是 ccaction和 ccactionmanager,ccaction是所有動作的基類,類中有幾個很重要的方法 virtual void startwithtarget ccnode ptarget 設定動作的目標virtual void...

cocos2d x 觸控簡單分析

cclayer中的settouchenabled true 會開啟多點觸控。如果使用ccdirector shareddirector gettouchdispatcher addtargeteddelegate this,0,true 只會開啟乙個點的觸控。當helloworld cctouchb...