首先创建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,运行后的接图如下: