在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite 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 // // HSprite.cpp // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #import "HSprite.h" HSprite* HSprite::createHSprite(const char* _name){ HSprite* sp = new HSprite(); if(sp && sp->initWithFile(_name)){ sp->hspriteInit(); sp->autorelease(); return sp; } CC_SAFE_DELETE(sp); return NULL; } void HSprite::hspriteInit(){ CCMessageBox("create HSprite success", "Himi_Lua"); } 以上代码很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit) 下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图: 然后开始添加我们自定义精灵类,让Lua脚本能认识它; 步骤分为3步: 1. 注册我们的自定义类: 在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册: tolua_usertype(tolua_S, "HSprite" );
如下图所示: 第二步:声明我们自定义类的函数: 搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码: tolua_cclass(tolua_S, "HSprite", "HSprite", "CCSprite", NULL); tolua_beginmodule(tolua_S,"HSprite"); tolua_function(tolua_S,"createHSprite",tolua_Himi_HSprite_createHSrpite00); 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 { 5 #ifndef TOLUA_RELEASE 6 tolua_Error tolua_err; 7 if ( 8 !tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) || 9 !tolua_isstring(tolua_S,2,0,&tolua_err) || 10 !tolua_isnoobj(tolua_S,3,&tolua_err) 11 ) 12 goto tolua_lerror; 13 else 14 #endif 15 { 16 const char* pszFileName = ((const char*) tolua_tostring(tolua_S,2,0)); 17 { 18 HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); 19 int nID = (tolua_ret) ? tolua_ret->m_uID : -1; 20 int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; 21 tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite"); 22 } 23 } 24 return 1; 25 #ifndef TOLUA_RELEASE 26 tolua_lerror: 27 tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err); 28 return 0; 29 #endif 30 } 31 #endif //#ifndef TOLUA_DISABLE 这里Himi解释下: 童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看, 首先是375~384之间的代码: #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif 这里是对参数类型的判断: tolua_isusertable 是否为”第三个参数”自定义类型 tolua_isstring 是否为字符串类型 tolua_isnoobj 结束(没有参数的判断) 然后是386~392之间的代码段: const char* pszFileName = ((const char*) tolua_tostring(tolua_S,2,0)); { HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); int nID = (tolua_ret) ? tolua_ret->m_uID : -1; int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite"); } 这里是对脚本代码的解析从而调用的自定义创建的函数 最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件) 在脚本最后”– run”下代码修改如下: -- run local sceneGame = CCScene:create() -- sceneGame:addChild(createLayerFram()) -- sceneGame:addChild(createLayerMenu()) sceneGame:addChild(createHimiLayer()) CCDirector:sharedDirector():runWithScene(sceneGame) 这里Himi注视了另个layer的添加,添加了自己的Layer sceneGame:addChild(createHimiLayer()) 然后将Himi自定义方法添加在脚本中,代码如下: local function createHimiLayer() local layerH = CCLayer:create() local _font = CCLabelTTF:create("Himi_(cocos2dx-Lua)教程","Arial",33) _font:setPosition(230,280) layerH:addChild(_font) --创建自定义类型精灵 local hsprite = HSprite:createHSprite("himi.png") hsprite:setPosition(100,100) hsprite:setScale(1.5) hsprite:setRotation(45) layerH:addChild(hsprite) return layerH end 创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。 ok,运行后的接图如下:
|
请发表评论