本站文章均为 李华明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 ,如下图:

 

     在这个示例中Ball.lua 与 Paddle.lua 分别作为对象进行的Lua编写,还没有看到过的童鞋请自行看下吧。

闲言少叙,下面详细介绍使用Lua来自定义lua类的步骤:

 第一步:

     我们到Cocos2dx引擎目录下的 samples/Lua/TestLua/Resources/luaScript  下找到“extern.lua” 文件,其内容如下所示:

 

   
   
   
   
  1. --Create an class. 
  2. function class(classname, super) 
  3.     local superType = type(super) 
  4.     local cls 
  5.   
  6.     if superType ~= "function" and superType ~= "table" then 
  7.         superType = nil 
  8.         super = nil 
  9.     end 
  10.   
  11.     if superType == "function" or (super and super.__ctype == 1) then 
  12.         -- inherited from native C++ Object 
  13.         cls = {} 
  14.   
  15.         if superType == "table" then 
  16.             -- copy fields from super 
  17.             for k,v in pairs(super) do cls[k] = v end 
  18.             cls.__create = super.__create 
  19.             cls.super    = super 
  20.         else 
  21.             cls.__create = super 
  22.         end 
  23.   
  24.         cls.ctor    = function() end 
  25.         cls.__cname = classname 
  26.         cls.__ctype = 1 
  27.   
  28.         function cls.new(...) 
  29.             local instance = cls.__create(...) 
  30.             -- copy fields from class to native object 
  31.             for k,v in pairs(cls) do instance[k] = v end 
  32.             instance.class = cls 
  33.             instance:ctor(...) 
  34.             return instance 
  35.         end 
  36.   
  37.     else 
  38.         -- inherited from Lua Object 
  39.         if super then 
  40.             cls = clone(super) 
  41.             cls.super = super 
  42.         else 
  43.             cls = {ctor = function() end} 
  44.         end 
  45.   
  46.         cls.__cname = classname 
  47.         cls.__ctype = 2 -- lua 
  48.         clscls.__index = cls 
  49.   
  50.         function cls.new(...) 
  51.             local instance = setmetatable({}, cls) 
  52.             instance.class = cls 
  53.             instance:ctor(...) 
  54.             return instance 
  55.         end 
  56.     end 
  57.   
  58.     return cls 
  59. end 
  60.   
  61. function schedule(node, callback, delay) 
  62.     local delay = CCDelayTime:create(delay) 
  63.     local callfunc = CCCallFunc:create(callback) 
  64.     local sequence = CCSequence:createWithTwoActions(delay, callfunc) 
  65.     local action = CCRepeatForever:create(sequence) 
  66.     node:runAction(action) 
  67.     return action 
  68. end 
  69.   
  70. function performWithDelay(node, callback, delay) 
  71.     local delay = CCDelayTime:create(delay) 
  72.     local callfunc = CCCallFunc:create(callback) 
  73.     local sequence = CCSequence:createWithTwoActions(delay, callfunc) 
  74.     node:runAction(sequence) 
  75.     return sequence 
  76. end 

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

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

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

 第一个参数:自定义类名

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

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

 

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

 

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

 

比较简单不赘述。

测试Lua代码:

 

   
   
   
   
  1. local fontT = CCLabelTTF:create("在Lua中使用OOP思想创建自定义lua类 -by Himi", "Verdana-BoldItalic", 20) 
  2.  fontT:setPosition( ccp(240,200)) 
  3.  mainLayer:addChild(fontT) 
  4.   
  5.  local sp = MySprite:createMS("Icon.png",1) 
  6.  sp:setPosition( ccp(100,100)) 
  7.  mainLayer:addChild( sp) 

 

运行截图如下:

 

OK,本篇就到这里。