在建立完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...