Lua 使用OOP(面对对象思想编程),免Binding创建自定义lua类

来源:互联网 发布:广告相册制作软件 编辑:程序博客网 时间:2024/06/16 17:23

首先Himi来向大家讲解如何在Lua中不binding来自定义lua类,其实这种方式在Cocos2dx的Lua Samples已经为我们做好了例子,就看童鞋们是否认真阅读了。此示例路径在你解压cocos2dx引擎包下的cocos2d-2.1rc0-x-2.1.2/samples/Lua/TestLua 中的 TouchesTest ,如下图:

 QQ20130408-1

     在这个示例中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.
functionclass(classname,super)
    local superType =type(super)
    localcls
 
    ifsuperType ~="function" and superType ~="table" then
        superType=nil
        super= nil
    end
 
    ifsuperType =="function" or (superand super.__ctype==1) then
        --inherited fromnative C++Object
        cls= {}
 
        ifsuperType =="table" then
            --copy fields fromsuper
            fork,v inpairs(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
 
        functioncls.new(...)
            local instance =cls.__create(...)
            --copy fields fromclass to native object
            fork,v inpairs(cls) do instance[k] =v end
            instance.class= cls
            instance:ctor(...)
            returninstance
        end
 
    else
        --inherited fromLua Object
        ifsuper then
            cls= clone(super)
            cls.super= super
        else
            cls= {ctor =function() end}
        end
 
        cls.__cname=classname
        cls.__ctype=2 --lua
        cls.__index=cls
 
        functioncls.new(...)
            local instance =setmetatable({}, cls)
            instance.class= cls
            instance:ctor(...)
            returninstance
        end
    end
 
    returncls
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)
    returnaction
end
 
function performWithDelay(node, callback, delay)
    local delay =CCDelayTime:create(delay)
    local callfunc =CCCallFunc:create(callback)
    local sequence =CCSequence:createWithTwoActions(delay, callfunc)
    node:runAction(sequence)
    returnsequence
end

 

这个Lua中提供了3个方法: 第二个函数与第三个函数分别是更新函数与序列动作函数,很easy 不多说。

我们主要关注的是 第一个函数:

       class(classname,super)   ,  此函数可以用于创建我们自定义lua类

 第一个参数:自定义类名

       第二个参数: 自定义类所继承的父类

至于其中的实现,大家需要掌握Lua的语言与程序设计,比较容易理解的。

 

第二步:我们自定义一个精灵类,且继承CCSprite,其文件名Himi这里随便起的是“MySprite.lua” ,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require"extern"  --导入模板,作用调用其class函数
 
MySprite=class("MySprite",
    function(fileName)
        returnCCSprite:create(fileName)
    end
)
 
MySprite.__index=MySprite   --用于访问
 
MySprite.type= 0    --自定义属性
 
function MySprite:createMS(fileName,_type)      --自定义构造函数
    local mySprite =MySprite.new(fileName)
    mySprite:myInit(_type)
    returnmySprite
end
 
function MySprite:myInit(_type)    --自定义函数
    self.type=_type
end

 

比较简单不赘述。

测试Lua代码:

1
2
3
4
5
6
7
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)

 

运行截图如下:

QQ20130408-3

 

OK,本篇就到这里。

0 0
原创粉丝点击