【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 ,如下图:

在这个示例中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,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)

运行截图如下:

OK,本篇就到这里。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...