【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) 

 

运行截图如下:

QQ20130408-3

 

OK,本篇就到这里。









本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/1174056,如需转载请自行联系原作者
目录
相关文章
|
11天前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
29 6
|
17天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
2月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
37 2
|
3月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
4月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
7月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
268 1
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
247 0
|
7月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
284 0
|
6月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
185 4
|
6月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
214 0