【Cocos2dX(2.x)_Lua开发之一】★重要必看篇★Lua脚本与自创建类之间的访问

简介:

最近Himi都没有更新博文了,其实也是犹豫写本cocos2d(x)引擎书籍在做准备,目录的草稿都写好了,目录中包含的大家最感兴趣的cocos2d/x动作编辑器的详细制作流程与源码! 但是遗憾的是Himi还是腾不出时间去写;

放弃去写的另外一个原因就是因为支持我的童鞋门,在7月份就说过要为大家奉上关于cocos2dx-lua的系列教程,但是一直由于时间等问题一再拖到现在,如果Himi真要准备写书估计半年内都基本很难有时间更新博客的,当然也考虑到公司项目,最终放弃;暂时放弃,以后有可能的话还是会写的  )  :xl:

顺便说一句,关于Himi9个技术群,不论是cocos2d-iphone、cocos2dx、android还是以后陆续公布的Unity3D群,周期性的Himi和管理员们会定期清理(一切都是为了更多想学习的新童鞋考虑),希望大家进群冒泡,积极讨论。好了,废话就不多说了,从今天开始Himi为童鞋们出cocos2dx-lua的系列开发教程,希望大家还一如既往得支持;3Q  :bb:

Himi 当前开发工具等版本如下:

mac: 10.8      xcode:4.4.1       cocos2dx :cocos2d-2.0-rc2-x-2.0.1

本篇介绍两个知识点:  1. Lua基础         2.在lua脚本中使用我们自定义的精灵类     

    一:lua基础

关于Lua的其实很早前Himi写过一篇关于cocos2dx-Lua 的基础博文了,但是是cocos2dx 1.x版本的,对于不是很熟悉的童鞋,Himi还是建议去看一看,连接:【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! Himi以后更新的Lua系列都是基于Cocos2dx 2.x版本的了。

     二:在lua脚本中使用我们自定义的精灵类

首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite

HSprite.h:

 

 

 
 
  1. // 
  2. //  HSprite.h 
  3. //  cocos2dx_lua_tests_by_Himi 
  4. // 
  5. //  Created by Himi on 12-8-30. 
  6. // 
  7. // 
  8.   
  9. #ifndef cocos2dx_lua_tests_by_Himi_HSprite_h 
  10. #define cocos2dx_lua_tests_by_Himi_HSprite_h 
  11.   
  12. #include "cocos2d.h" 
  13. using namespace cocos2d; 
  14.   
  15. class HSprite : public cocos2d::CCSprite{ 
  16.   
  17. public
  18.     static HSprite* createHSprite(const char* _name); 
  19.     void hspriteInit(); 
  20. }; 
  21. #endif 

HSprite.cpp:

 

 
 
  1. // 
  2. //  HSprite.cpp 
  3. //  cocos2dx_lua_tests_by_Himi 
  4. // 
  5. //  Created by Himi on 12-8-30. 
  6. // 
  7. // 
  8.   
  9. #import "HSprite.h" 
  10.   
  11. HSprite* HSprite::createHSprite(const char* _name){ 
  12.     HSprite* sp = new HSprite(); 
  13.     if(sp && sp->initWithFile(_name)){ 
  14.         sp->hspriteInit(); 
  15.         sp->autorelease(); 
  16.         return sp; 
  17.     } 
  18.     CC_SAFE_DELETE(sp); 
  19.     return NULL; 
  20.   
  21. void HSprite::hspriteInit(){ 
  22.     CCMessageBox("create HSprite success""Himi_Lua"); 
 

以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)

下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:

 

然后开始添加我们自定义精灵类,让Lua脚本能认识它;

 步骤分为3步:

 1. 注册我们的自定义类:

在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:

 

 
 
  1. tolua_usertype(tolua_S,"HSprite"); 
 

如下图所示:

 

第二步:声明我们自定义类的函数:

搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:

 

 

 
 
  1. tolua_cclass(tolua_S, "HSprite""HSprite""CCSprite", NULL); 
  2.     tolua_beginmodule(tolua_S,"HSprite"); 
  3.     tolua_function(tolua_S,"createHSprite",tolua_Himi_HSprite_createHSrpite00); 
  4.     tolua_endmodule(tolua_S); 

如下图:

 

这里开始解释:

首先定义能让脚本认识的类函数,遵循如下:

a)  tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);

tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S

后两个参数:是自定义类类名

再往后是继承的父类类名

b)添加参数开始声明:

tolua_beginmodule(tolua_S,”HSprite”);

c)  添加自定类函数:

tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);

第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数

注意,这里有多个函数,可以继续写;

d) 结束自定义函数:

tolua_endmodule(tolua_S);

 

第三步:实现我们的脚本之间转换函数  tolua_Himi_HSprite_createHSrpite00

实现如下:

 

 
 
  1. /* method: create of class  HSprite */ 
  2. #ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00 
  3. static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S) 
  4. #ifndef TOLUA_RELEASE 
  5.     tolua_Error tolua_err; 
  6.     if ( 
  7.         !tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) || 
  8.         !tolua_isstring(tolua_S,2,0,&tolua_err) || 
  9.         !tolua_isnoobj(tolua_S,3,&tolua_err) 
  10.         ) 
  11.         goto tolua_lerror; 
  12.     else 
  13. #endif 
  14.     { 
  15.         const char* pszFileName = ((const char*)  tolua_tostring(tolua_S,2,0)); 
  16.         { 
  17.             HSprite* tolua_ret = (HSprite*)  HSprite::createHSprite(pszFileName); 
  18.             int nID = (tolua_ret) ? tolua_ret->m_uID : -1; 
  19.             int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; 
  20.             tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite"); 
  21.         } 
  22.     } 
  23.     return 1; 
  24. #ifndef TOLUA_RELEASE 
  25. tolua_lerror: 
  26.     tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err); 
  27.     return 0; 
  28. #endif 
  29. #endif //#ifndef TOLUA_DISABLE 
 

如下图所示:

 

这里Himi解释下:

童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,

首先是375~384之间的代码:

 

 

 
 
  1. #ifndef TOLUA_RELEASE 
  2.     tolua_Error tolua_err; 
  3.     if ( 
  4.         !tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) || 
  5.         !tolua_isstring(tolua_S,2,0,&tolua_err) || 
  6.         !tolua_isnoobj(tolua_S,3,&tolua_err) 
  7.         ) 
  8.         goto tolua_lerror; 
  9.     else 
  10. #endif 

这里是对参数类型的判断:

tolua_isusertable  是否为”第三个参数”自定义类型

tolua_isstring  是否为字符串类型

tolua_isnoobj  结束(没有参数的判断)

 

然后是386~392之间的代码段:

 

这里是对脚本代码的解析从而调用的自定义创建的函数

最后我们修改  hello2.lua  脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)

在脚本最后”– run”下代码修改如下:

 

 
 
  1. -- run 
  2. local sceneGame = CCScene:create() 
  3. -- sceneGame:addChild(createLayerFram()) 
  4. -- sceneGame:addChild(createLayerMenu()) 
  5. sceneGame:addChild(createHimiLayer()) 
  6. CCDirector:sharedDirector():runWithScene(sceneGame) 
 

这里Himi注视了另个layer的添加,添加了自己的Layer

 

 
 
  1. sceneGame:addChild(createHimiLayer()) 
 

然后将Himi自定义方法添加在脚本中,代码如下:

 

 
 
  1. local function createHimiLayer() 
  2.     local layerH = CCLayer:create() 
  3.       
  4.       
  5.     local _font = CCLabelTTF:create("Himi_(cocos2dx-Lua)教程","Arial",33) 
  6.     _font:setPosition(230,280) 
  7.     layerH:addChild(_font) 
  8.       
  9.     --创建自定义类型精灵 
  10.     local hsprite = HSprite:createHSprite("himi.png"
  11.     hsprite:setPosition(100,100) 
  12.     hsprite:setScale(1.5) 
  13.     hsprite:setRotation(45) 
  14.     layerH:addChild(hsprite) 
  15.     return layerH 
  16. end 

创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。

ok,运行后的接图如下:

 

好了,本篇就到这里,童鞋们感觉本站好的文章记得分享,转播散播哦









本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/980439,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
60 0
|
20天前
|
NoSQL Java Redis
lua脚本做redis的锁
这段内容是关于使用Redis实现分布式锁的Java代码示例。`RedisLock`类包含`lock`和`unlock`方法,使用`StringRedisTemplate`和Lua脚本进行操作。代码展示了两种加锁方式:一种带有过期时间,另一种不带。还提到了在加锁和解锁过程中的异常处理,并提供了相关参考资料链接。
17 3
|
22天前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
|
1月前
|
监控
通过Lua脚本实现禁止员工上班玩游戏的软件的自动化任务管理
使用Lua脚本,企业可以自动化管理员工行为,防止上班时间玩游戏。Lua是一种轻量级脚本语言,适合编写监控任务。示例脚本展示了如何检测工作时间内员工是否玩游戏,并在发现时执行相应操作,如关闭游戏或发送警告。此外,另一脚本演示了如何将监控数据通过HTTP POST自动提交到网站,以实现有效的行为管理。这种解决方案灵活且可定制,有助于提升工作效率。
117 1
|
1月前
|
NoSQL Java 数据库
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
|
1月前
|
Java API Maven
|
2月前
|
NoSQL Java 数据处理
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
55 0
|
3月前
|
存储 NoSQL 关系型数据库
使用lua脚本操作redis
使用lua脚本操作redis
50 0
|
3月前
|
NoSQL Java Redis
Redis进阶-lua脚本
Redis进阶-lua脚本
59 0
|
2月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
75 0