【Cocos2dX(2.x)_Lua开发之一】★重要必看篇★Lua脚本
本篇先容两个知识点: 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:
// // HSprite.h // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #ifndef cocos2dx_lua_tests_by_Himi_HSprite_h #define cocos2dx_lua_tests_by_Himi_HSprite_h #include "cocos2d.h" using namespace cocos2d; class HSprite : public cocos2d::CCSprite{ public: static HSprite* createHSprite(const char* _name); void hspriteInit(); }; #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
完成如下:
/* method: create of class HSprite */ #ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00 static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S) { #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 { 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"); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err); return 0; #endif } #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之间的代码段:
这里是对剧本代码的解析从而挪用的自界说创立的函数
最后我们修改 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,运行后的接图如下:
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|