上一篇中,向童鞋们介绍了如何自定义类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” 文件,其内容如下所示:
- --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
- clscls.__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” ,如下:
- require "extern" --导入模板,作用调用其class函数
- MySprite = class("MySprite",
- function(fileName)
- return CCSprite:create(fileName)
- end
- )
- MySpriteMySprite.__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代码:
- 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,本篇就到这里。