上一篇中,向童鞋們介紹了如何自定義類binding到lua中供給使用的教程,那麼本篇将介紹利用oop思想在在lua中進行建立一個自定義類。
首先himi來向大家講解如何在lua中不binding來自定義lua類,其實這種方式在cocos2dx的lua samples已經為我們做好了例子,就看童鞋們是否認真閱讀了。此示例路徑在你解壓cocos2dx引擎包下的cocos2d-2.1rc0-x-2.1.2/samples/lua/testlua 中的 touchestest ,如下圖:
在這個示例中ball.lua 與 paddle.lua 分别作為對象進行的lua編寫,還沒有看到過的童鞋請自行看下吧。
閑言少叙,下面詳細介紹使用lua來自定義lua類的步驟:
第一步:
我們到cocos2dx引擎目錄下的 samples/lua/testlua/resources/luascript 下找到“extern.lua” 檔案,其内容如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
--create an class.
function class(classname, super)
local supertype = type(super)
local cls
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
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
end
cls.ctor = function() end
cls.__cname = classname
cls.__ctype = 1
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
else
-- inherited from lua object
if super then
cls = clone(super)
cls.super = super
cls = {ctor = function() end}
cls.__ctype = 2 -- lua
cls.__index = cls
local instance = setmetatable({}, cls)
return cls
end
function schedule(node, callback, delay)
local delay = ccdelaytime:create(delay)
local callfunc = cccallfunc:create(callback)
local sequence = ccsequence:createwithtwoactions(delay, callfunc)
local action = ccrepeatforever:create(sequence)
node:runaction(action)
return action
function performwithdelay(node, callback, delay)
node:runaction(sequence)
return sequence
這個lua中提供了3個方法: 第二個函數與第三個函數分别是更新函數與序列動作函數,很easy 不多說。
我們主要關注的是 第一個函數:
class(classname,super) , 此函數可以用于建立我們自定義lua類
第一個參數:自定義類名
第二個參數: 自定義類所繼承的父類
至于其中的實作,大家需要掌握lua的語言與程式設計,比較容易了解的。
第二步:我們自定義一個精靈類,且繼承ccsprite,其檔案名himi這裡随便起的是“mysprite.lua” ,如下:
require "extern" --導入模闆,作用調用其class函數
mysprite = class("mysprite",
function(filename)
return ccsprite:create(filename)
)
mysprite.__index = mysprite -- 用于通路
mysprite.type = 0 -- 自定義屬性
function mysprite:createms(filename,_type) --自定義構造函數
local mysprite = mysprite.new(filename)
mysprite:myinit(_type)
return mysprite
function mysprite:myinit(_type) --自定義函數
self.type =_type
比較簡單不贅述。
測試lua代碼:
local fontt = cclabelttf:create("在lua中使用oop思想建立自定義lua類 -by himi", "verdana-bolditalic", 20)
fontt:setposition( ccp(240,200))
mainlayer:addchild(fontt)
local sp = mysprite:createms("icon.png",1)
sp:setposition( ccp(100,100))
mainlayer:addchild( sp)
運作截圖如下:
ok,本篇就到這裡。