在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
刚开始接触cocos2d-x 下的Lua编程,主要参看了李华明大神的博客中的介绍,http://blog.csdn.net/xiaominghimi/article/category/1155088 大概了解了一下,下面这篇博客主要记录一下如何在Cocos2d-x项目中使用Lua进行开发,还有在Lua中如何使用自定义的精灵类(Lua脚本和自创建类之间的访问)这两个内容;这些内容在李华明大神的博客中都有详细的介绍,个人看我觉得有点乱,所以写下这篇入门博客。 一、如何在Cocos2d-x项目中使用Lua进行开发 首先创建一个带有Lua的Cocos2d-x项目,在资源目录下就会看到两个lua文件,hello.lua和hello2.lua,在hello.lua这个文件中就实现了一个简单的demo,关于这个文件中的内容结构大致如下 其中的xpcall就是程序的入口,官方解释如下: xpcall(f,err):
This function is similar to
至于hello2.lua这个文件,没有什么内容(只有一个函数),主要是为了体现require的用法。 那么项目中是如何调用lua代码的呢?-----在Classes目录下的AppDelegate.m文件中的 applicationDidFinishLaunching 方法中,就可以看到是如何进行调用的了。
// register lua engine CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("hello.lua"); pEngine->executeScriptFile(path.c_str());
下面用以下代码替换hello.lua文件中的所以代码:
--这是一个简单的demo --这个函数用于创建layer local function creatLayer() visibleSize = CCDirector:sharedDirector():getWinSize() origin = CCDirector:sharedDirector():getVisibleOrigin() local layer = CCLayer:create() local myLabel = CCLabelTTF:create("This is a demo!","Arial",35) myLabel:setPosition(origin.x + visibleSize.width / 2 , origin.y + visibleSize.height / 2) layer:addChild(myLabel) local sprite = CCSprite:create("Icon.png") sprite:setPosition(origin.x + visibleSize.width / 2 , origin.y + visibleSize.height / 2+50) layer:addChild(sprite) return layer end --创建一个scene并调用上面的函数添加一个layer local sceneGame = CCScene:create() sceneGame:addChild(creatLayer()) -- run CCDirector:sharedDirector():runWithScene(sceneGame)
这段代码很简单吧!运行程序,在界面中显示一个label和一个sprite。 脚本lua等一般都示通过中间层(解析)进行与前端代码(Cocos2dX封装的引擎类库)交互,所以很多方法名称可能发生了改变,假如我们不知道它的构造函数是否有修改,或者说参数忘记都是什么了,那么请打开下图中的 LuaCocos2d.cpp文件,(注意这个文件代码很多,打开较慢)然后你会看到很多方法的定义与实现! 我们搜索 CCLabelTTF的构造方法,那么搜一下如下语句:tolua_beginmodule(tolua_S,"CCLabelTTF"); 这样就可以看到大批类似的方法:
tolua_beginmodule(tolua_S,"CCLabelTTF"); tolua_function(tolua_S,"new",tolua_Cocos2d_CCLabelTTF_new00); tolua_function(tolua_S,"new_local",tolua_Cocos2d_CCLabelTTF_new00_local); tolua_function(tolua_S,".call",tolua_Cocos2d_CCLabelTTF_new00_local); tolua_function(tolua_S,"delete",tolua_Cocos2d_CCLabelTTF_delete00); tolua_function(tolua_S,"init",tolua_Cocos2d_CCLabelTTF_init00); tolua_function(tolua_S,"setString",tolua_Cocos2d_CCLabelTTF_setString00); tolua_function(tolua_S,"getString",tolua_Cocos2d_CCLabelTTF_getString00); tolua_function(tolua_S,"getHorizontalAlignment",tolua_Cocos2d_CCLabelTTF_getHorizontalAlignment00); tolua_function(tolua_S,"setHorizontalAlignment",tolua_Cocos2d_CCLabelTTF_setHorizontalAlignment00); tolua_function(tolua_S,"getVerticalAlignment",tolua_Cocos2d_CCLabelTTF_getVerticalAlignment00); tolua_function(tolua_S,"setVerticalAlignment",tolua_Cocos2d_CCLabelTTF_setVerticalAlignment00); tolua_function(tolua_S,"getDimensions",tolua_Cocos2d_CCLabelTTF_getDimensions00); tolua_function(tolua_S,"setDimensions",tolua_Cocos2d_CCLabelTTF_setDimensions00); tolua_function(tolua_S,"getFontSize",tolua_Cocos2d_CCLabelTTF_getFontSize00); tolua_function(tolua_S,"setFontSize",tolua_Cocos2d_CCLabelTTF_setFontSize00); tolua_function(tolua_S,"getFontName",tolua_Cocos2d_CCLabelTTF_getFontName00); tolua_function(tolua_S,"setFontName",tolua_Cocos2d_CCLabelTTF_setFontName00); tolua_function(tolua_S,"create",tolua_Cocos2d_CCLabelTTF_create00); tolua_function(tolua_S,"create",tolua_Cocos2d_CCLabelTTF_create01); tolua_function(tolua_S,"create",tolua_Cocos2d_CCLabelTTF_create02); tolua_function(tolua_S,"create",tolua_Cocos2d_CCLabelTTF_create03); tolua_endmodule(tolua_S);
tolua_function(tolua_S,"setString",tolua_Cocos2d_CCLabelTTF_setString00);
/* method: setString of class CCLabelTTF */ #ifndef TOLUA_DISABLE_tolua_Cocos2d_CCLabelTTF_setString00 static int tolua_Cocos2d_CCLabelTTF_setString00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertype(tolua_S,1,"CCLabelTTF",0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif { CCLabelTTF* self = (CCLabelTTF*) tolua_tousertype(tolua_S,1,0); const char* label = ((const char*) tolua_tostring(tolua_S,2,0)); #ifndef TOLUA_RELEASE if (!self) tolua_error(tolua_S,"invalid 'self' in function 'setString'", NULL); #endif { self->setString(label); } } return 0; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'setString'.",&tolua_err); return 0; #endif }
从上面的这个过程来看,执行lua程序的过程大致是:解析lua脚本中的一句代码->通过解析层代码->将其转换并转到前端代码进行使用。
二、在Lua中如何使用自定义的精灵类(Lua脚本和自创建类之间的访问) 关于这个问题,在李华明的文章中进行了详细的介绍(个人觉得有点乱)http://blog.csdn.net/xiaominghimi/article/details/7936395 和 http://blog.csdn.net/xiaominghimi/article/details/8770396 ,这里只是个人练习的时候的一些记录。 (1)首先在项目中添加一个自定义的精灵类HSprite(向layer添加这样的一个精灵后,会弹出一个提示框,显示"create HSprite success","Himi_Lua")
#ifndef __luademo__HSprite__ #define __luademo__HSprite__ #include <iostream> #include "cocos2d.h" using namespace cocos2d; class HSprite : public cocos2d::CCSprite{ public: static HSprite* createHSprite(const char* _name); void hspriteInit(); }; #endif /* defined(__luademo__HSprite__) */
#include "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"); }
①在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册: 添加这一行代码: tolua_usertype(tolua_S,"HSprite"); 如下:
/* function to register type */ static void tolua_reg_types (lua_State* tolua_S) { tolua_usertype(tolua_S,"HSprite"); tolua_usertype(tolua_S,"kmMat4"); tolua_usertype(tolua_S,"CCControlSaturationBrightnessPicker"); tolua_usertype(tolua_S,"CCShaky3D"); ......
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);
/* Open function */ TOLUA_API int tolua_Cocos2d_open (lua_State* tolua_S) { tolua_open(tolua_S); tolua_reg_types(tolua_S); tolua_module(tolua_S,NULL,0); tolua_beginmodule(tolua_S,NULL); tolua_cclass(tolua_S,"kmMat4","kmMat4","",NULL); tolua_beginmodule(tolua_S,"kmMat4"); tolua_array(tolua_S,"mat",tolua_get_Cocos2d_kmMat4_mat,tolua_set_Cocos2d_kmMat4_mat); tolua_endmodule(tolua_S); //添加的内容 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); ...
③实现tolua_Himi_HSprite_createHSrpite00这个lua---cocos2dx之间的转换函数 直接添加如下代码即可。
/* 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; toluafix_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
在hello.lua文件中的代码全部修改为:
local function createLayer() visibleSize = CCDirector:sharedDirector():getWinSize() origin = CCDirector:sharedDirector():getVisibleOrigin() local layer = CCLayer:create() --创建自定义类型精灵 local hsprite = HSprite:createHSprite("Icon.png") hsprite:setPosition(origin.x + visibleSize.width / 2 , origin.y + visibleSize.height / 2+50) hsprite:setScale(1.5) hsprite:setRotation(45) layer:addChild(hsprite) return layer end -- run local sceneGame = CCScene:create() sceneGame:addChild(createLayer()) CCDirector:sharedDirector():runWithScene(sceneGame)
但是在终端 中会有如下的提示信息:
Cocos2d: [LUA ERROR] ...B74443-4D75-4C9D-83C8-582D665693AC/luademo.app/hello.lua:9: error in function 'setPosition'. argument #1 is 'HSprite'; 'CCNode' expected.
|
请发表评论