本站文章均為[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/lua-2/985.html](http://www.himigame.com/lua-2/985.html "【Cocos2dX(2.x)_Lua開發之一】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解")
[? 點擊訂閱 ?](http://list.qq.com/cgi-bin/qf_invite?id=acfc24e272cc4a26debf3b3866edb626a9ea3fc80fd8893c)?本博客最新動態!及時將最新博文通知您!
本篇做起來比較累,大家請參考最新篇[【COCOS2DX-LUA 腳本開發之四】使用tolua++編譯pkg,從而創建自定義類讓Lua腳本使用](http://www.himigame.com/lua1/1259.html)
此篇可能會在最新的cocos2dx版本中出現如下問題:
~~~
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腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!](http://www.himigame.com/iphone-cocos2dx/681.html)?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
~~~
如下圖所示:
[](http://www.himigame.com/wp-content/uploads/2012/08/32.jpg)
這里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,運行后的接圖如下:

好了,本篇就到這里,童鞋們感覺本站好的文章記得分享,轉播散播哦
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取"產品付費數量等于0的問題"】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&自定義類細節說明&Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&&Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d­2.0­x­2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)