【COCOS2DX-LUA 脚本开发之五】Lua 使用OOP(面对对象思想编程),免Binding创建自定义lua类

本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua1/1282.html
 

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!


                 

上一篇中,向童鞋们介绍了如何自定义类binding到Lua中供给使用的教程,那么本篇将介绍利用OOP思想在在Lua中进行创建一个自定义类。

   首先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 .
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
         end
 
     else
         - - inherited from Lua Object
         if super then
             cls = clone( super )
             cls . super = super
         else
             cls = {ctor = function() end}
         end
 
         cls .__cname = classname
         cls .__ctype = 2 - - lua
         cls .__index = cls
 
         function cls .new(...)
             local instance = setmetatable({}, cls )
             instance. class = cls
             instance:ctor(...)
             return instance
         end
     end
 
     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
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)
     return sequence
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)
         return CCSprite:create(fileName)
     end
)
 
MySprite.__index = MySprite   - - 用于访问
 
MySprite. type = 0    - - 自定义属性
 
function MySprite:createMS(fileName,_type)      - - 自定义构造函数
     local mySprite = MySprite.new(fileName)
     mySprite:myInit(_type)
     return mySprite
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值