天天看點

【COCOS2DX-LUA 腳本開發之五】LUA 使用OOP(面對對象思想程式設計),免BINDING建立自定義LUA類

上一篇中,向童鞋們介紹了如何自定義類binding到lua中供給使用的教程,那麼本篇将介紹利用oop思想在在lua中進行建立一個自定義類。

   首先himi來向大家講解如何在lua中不binding來自定義lua類,其實這種方式在cocos2dx的lua samples已經為我們做好了例子,就看童鞋們是否認真閱讀了。此示例路徑在你解壓cocos2dx引擎包下的cocos2d-2.1rc0-x-2.1.2/samples/lua/testlua 中的 touchestest ,如下圖:

【COCOS2DX-LUA 腳本開發之五】LUA 使用OOP(面對對象思想程式設計),免BINDING建立自定義LUA類

     在這個示例中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)

運作截圖如下:

【COCOS2DX-LUA 腳本開發之五】LUA 使用OOP(面對對象思想程式設計),免BINDING建立自定義LUA類

ok,本篇就到這裡。