本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua-game/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 ,如下图:
在这个示例中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) |
运行截图如下:
OK,本篇就到这里。