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

 QQ20130408-1

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

 





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/1174056,如需转载请自行联系原作者
目录
相关文章
|
26天前
|
API 开发者 Kotlin
Kotlin 中如何使用 Fuel 库进行代理切换?
Kotlin 中如何使用 Fuel 库进行代理切换?
|
4月前
|
存储 API C语言
Lua C接口编程(一)
Lua C接口编程(一)
|
4月前
|
消息中间件 Kubernetes NoSQL
Lua C接口编程(二)
Lua C接口编程(二)
|
C# 图形学 C++
原生实现C#和Lua相互调用-Unity3D可用【下】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
327 0
|
API C# Android开发
原生实现C#和Lua相互调用-Unity3D可用【上】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
279 0
|
C# 图形学 Windows
原生实现C#和Lua相互调用-Unity3D可用【中】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
166 0