【Cocos2dX(2.x)_Lua开发之三】
【Cocos2dX(2.x)_Lua開發之三】在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
本站文章均為 李華明Himi 原創,轉載務必在明顯處注明:(作者新浪微博: @李華明Himi )
轉載自【黑米GameDev街區】 原文鏈接: http://www.himigame.com/lua-game/985.html
? 點擊訂閱 ? 本博客最新動態!及時將最新博文通知您!
?
本篇做起來比較累,大家請參考最新篇【COCOS2DX-LUA 腳本開發之四】使用tolua++編譯pkg,從而創建自定義類讓Lua腳本使用
此篇可能會在最新的cocos2dx版本中出現如下問題:
| 1 2 | LUA ERROR: ...24F82-1230-41FE-8A04-C445FB7D1BAB/mtet.app/hello.lua:35: ?error in function 'addChild'. argument #2 is 'MySprite'; 'CCNode' expected. |
?
最近Himi都沒有更新博文了,其實也是猶豫寫本cocos2d(x)引擎書籍在做準備,目錄的草稿都寫好了,目錄中包含的大家最感興趣的cocos2d/x動作編輯器的詳細制作流程與源碼! 但是遺憾的是Himi還是騰不出時間去寫;
放棄去寫的另外一個原因就是因為支持我的童鞋門,在7月份就說過要為大家奉上關于cocos2dx-lua的系列教程,但是一直由于時間等問題一再拖到現在,如果Himi真要準備寫書估計半年內都基本很難有時間更新博客的,當然也考慮到公司項目,最終放棄;?
順便說一句,關于Himi9個技術群,不論是cocos2d-iphone、cocos2dx、android還是以后陸續公布的Unity3D群,周期性的Himi和管理員們會定期清理(一切都是為了更多想學習的新童鞋考慮),希望大家進群冒泡,積極討論。好了,廢話就不多說了,從今天開始Himi為童鞋們出cocos2dx-lua的系列開發教程,希望大家還一如既往得支持;3Q?
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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // //? 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:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // //? 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”這個函數,然后在其中進行注冊:
| 1 | tolua_usertype(tolua_S,"HSprite"); |
如下圖所示:
?
第二步:聲明我們自定義類的函數:
搜索“tolua_Cocos2d_open”這個函數,然后在其中添加如下代碼:
| 1 2 3 4 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* 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之間的代碼:
| 1 2 3 4 5 6 7 8 9 10 | #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之間的代碼段:
| 1 2 3 4 5 6 7 | 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”下代碼修改如下:
| 1 2 3 4 5 6 | -- run local sceneGame = CCScene:create() -- sceneGame:addChild(createLayerFram()) -- sceneGame:addChild(createLayerMenu()) sceneGame:addChild(createHimiLayer()) CCDirector:sharedDirector():runWithScene(sceneGame) |
這里Himi注視了另個layer的添加,添加了自己的Layer
| 1 | sceneGame:addChild(createHimiLayer()) |
然后將Himi自定義方法添加在腳本中,代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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,運行后的接圖如下:
?
本站文章均為 李華明Himi 原創,轉載務必在明顯處注明:(作者新浪微博: @李華明Himi )
轉載自【黑米GameDev街區】 原文鏈接: http://www.himigame.com/lua-game/985.html
? 點擊訂閱 ? 本博客最新動態!及時將最新博文通知您!
?
本篇做起來比較累,大家請參考最新篇【COCOS2DX-LUA 腳本開發之四】使用tolua++編譯pkg,從而創建自定義類讓Lua腳本使用
此篇可能會在最新的cocos2dx版本中出現如下問題:
| 1 2 | LUA ERROR: ...24F82-1230-41FE-8A04-C445FB7D1BAB/mtet.app/hello.lua:35: ?error in function 'addChild'. argument #2 is 'MySprite'; 'CCNode' expected. |
?
最近Himi都沒有更新博文了,其實也是猶豫寫本cocos2d(x)引擎書籍在做準備,目錄的草稿都寫好了,目錄中包含的大家最感興趣的cocos2d/x動作編輯器的詳細制作流程與源碼! 但是遺憾的是Himi還是騰不出時間去寫;
放棄去寫的另外一個原因就是因為支持我的童鞋門,在7月份就說過要為大家奉上關于cocos2dx-lua的系列教程,但是一直由于時間等問題一再拖到現在,如果Himi真要準備寫書估計半年內都基本很難有時間更新博客的,當然也考慮到公司項目,最終放棄;?
順便說一句,關于Himi9個技術群,不論是cocos2d-iphone、cocos2dx、android還是以后陸續公布的Unity3D群,周期性的Himi和管理員們會定期清理(一切都是為了更多想學習的新童鞋考慮),希望大家進群冒泡,積極討論。好了,廢話就不多說了,從今天開始Himi為童鞋們出cocos2dx-lua的系列開發教程,希望大家還一如既往得支持;3Q?
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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // //? 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:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // //? 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”這個函數,然后在其中進行注冊:
| 1 | tolua_usertype(tolua_S,"HSprite"); |
如下圖所示:
?
第二步:聲明我們自定義類的函數:
搜索“tolua_Cocos2d_open”這個函數,然后在其中添加如下代碼:
| 1 2 3 4 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* 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之間的代碼:
| 1 2 3 4 5 6 7 8 9 10 | #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之間的代碼段:
| 1 2 3 4 5 6 7 | 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”下代碼修改如下:
| 1 2 3 4 5 6 | -- run local sceneGame = CCScene:create() -- sceneGame:addChild(createLayerFram()) -- sceneGame:addChild(createLayerMenu()) sceneGame:addChild(createHimiLayer()) CCDirector:sharedDirector():runWithScene(sceneGame) |
這里Himi注視了另個layer的添加,添加了自己的Layer
| 1 | sceneGame:addChild(createHimiLayer()) |
然后將Himi自定義方法添加在腳本中,代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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,運行后的接圖如下:
?
轉載于:https://www.cnblogs.com/lifesteven/p/3897871.html
總結
以上是生活随笔為你收集整理的【Cocos2dX(2.x)_Lua开发之三】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MM系列】SAP里批量设置采购信息记录
- 下一篇: JQuery播放器代理--IE下支持wm