cocos2dx lua class語法糖要注意了

2022-03-21 00:13:18 字數 2578 閱讀 9028

cocos2dx-lua function.lua 定義了class方法,讓lua實現繼承像傳統語言一樣漂亮和方便

看定義

function

class(classname, super)

local supertype = type

(super)

local

cls

--如果父類既不是函式也不是table則說明父類為空

if supertype ~= "

function

"and supertype ~= "

table

"then

supertype = nil

super = nil

end--

如果父類的型別是函式或者是c物件

if supertype == "

function

"or (super and super.__ctype == 1) then

--inherited from native c++ object

cls ={}

--如果父類是表則複製成員並且設定這個類的繼承資訊

--如果是函式型別則設定構造方法並且設定ctor函式

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

cls.ctor = function() end

end--

設定型別的名稱

cls.__cname =classname

cls.__ctype = 1

--定義該型別的建立例項的函式為基類的建構函式後複製到子類例項

--並且呼叫子數的ctor方法

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

endelse

--如果是繼承自普通的lua表,則設定一下原型,並且構造例項後也會呼叫ctor方法

--inherited from lua object

if super then

cls ={}

setmetatable(cls, )

cls.super =super

else

cls =

endcls.__cname =classname

cls.__ctype = 2

--lua

cls.__index =cls

function

cls.new(...)

local instance = setmetatable

({}, cls)

instance.class =cls

instance:ctor(...)

return

instance

endend

return

clsend

寫個測試**,注意出錯的部分

local base = class('

base')

base.__index =base

function

base:ctor(id)

print('

base:ctor

',id)

self.id =id

endlocal extbase = class('

extbase

',base)

extbase.__index =extbase

function

extbase:ctor(id)

--base:ctor(id)

super(self,id)

print('

extbase:ctor

',id)

end

受傳統語言影響,會在子類呼叫基類的建構函式,而事實上,這導致直接將型別本身作為物件例項傳入

導致self指向是那個型別本身(也是個table)

那就只能這麼寫了

base.ctor(self,id)

有點醜了樣,封裝一下super函式,看起來好看一點。。

function

super(o,...)

--if (o and o.super and o.super.ctor) then

o.super.ctor(o,...)

--end

end

cocos2dx CCScrollView使用示例

總的來說,就是有乙個容器container 錨點 0,0 大小 為全部內容的大小 scrollview 大小,錨點,setdelegate 視窗大小 setviewsize 設定容器 setcontainer 方向 ccnode m pmedalcontainer ccscrollview m ps...

cocos2d實現語音 Cocos2d 聲音API

param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...

Cocos2d x教程第 14 講 Cocos2d

cocos2d x 2.2.0之前的版本常用的json解析的三方庫一般是 jsoncpp 2.2.x的版本中已經包含了jsoncpp的庫,但是卻把名字給換了,導致引入jsoncpp庫的同志們發生各種衝突.完成上述操作後就可以盡情發揮了.下面讓我們來認識一下幾個主要的類 value value 類建立...