由於quick本身有些東西是不提供的,我們需要加入自己定義的或是第三方的類庫去給lua使用,於是需求就是自己定義一個類提供給lua使用。
需求有了,於是就去找相關的資料,在官方找到一句話:“請參考 quick 項目 lib/cocos2dx_extra 目錄中的文件。大概步驟:1.從 .h 文件創建 .pkg 文件,2.運行 tolua++ 根據 .pkg 創建相應的 .cpp/.h 文件。3. 導入 .cpp/.h 文件到項目中。4. 在 AppDelegate.cpp 中添加 .h 文件包含的 tolua_XXX_open() 函數。”這是在http://dualface.github.io/blog/2013/02/28/from-flash-to-quick/中找到的最有用的提示了。然後我去看相應的源代碼。裏面有一個 lib/cocos2dx-extra/build_luabinding/build.sh看樣子是用這個腳本來生成相應的接口的。進去研究一下
#!/usr/bin/env
bash
DIR=
"$(
cd "
$(
dirname
"${BASH_SOURCE[0]}"
)
"
&& pwd )"
cd
"$DIR"
OUTPUT_DIR=
"$DIR"
MAKE_LUABINDING=
"$QUICK_COCOS2DX_ROOT"
/bin/compile_luabinding
.sh
$MAKE_LUABINDING
-E CCOBJECTS=CCHTTPRequest -d
"$OUTPUT_DIR"
cocos2dx_extra_luabinding.tolua
echo
""
echo
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo
""
$MAKE_LUABINDING
-d
"$OUTPUT_DIR"
cocos2dx_extra_ios_iap_luabinding.tolua
這個是最新版本(20130705master)的腳本
先是定義輸出路徑,輸出路徑在:lib/cocos2dx-extra/extra/luabinding
然後make_luabinding的路徑是bin/compile_luabinding.sh
這個腳本會調用一個PHP腳本bin/lib/complile_luabinding.php
所以用法就是當你要添加自定義的類的時候在lib/cocos2dx_extra中加入自己的類,然後從.h文件創建.tolua文件,然後執行build腳本,它會自動地添加相應的東西。
下面我們來試驗一下
首先創建一個新的文件夾myclass,然後加入自己的類.h,.cpp文件; 然後去cocos2dx_extra_luabinding.tolua中加入pkg文件的內容
測試的代碼我是直接引用http://www.himigame.com/lua-game/1259.html 這裏的代碼,因爲我在做這個嘗試之前已經按文章上成功在cocos2d-x 2.1.4官方那個版本添加了自定義類,成功使用了。在這裏順便貼一下代碼:
MySprite.h
#ifndef
__mtet__MySprite__
#define
__mtet__MySprite__
#include
"cocos2d.h"
using
namespace
cocos2d;
class
MySprite :
public
CCSprite{
public
:
static
MySprite* createMS(
const
char
*
fileName);
};
#endif
/* defined(__mtet__MySprite__) */
MySprite.cpp
#include
"MySprite.h"
MySprite*
MySprite::createMS(
const
char
*
fileName){
MySprite*
sp =
new
MySprite();
if
(sp
&& sp->initWithFile(fileName)){
sp->setPosition(ccp(100,100));
sp->autorelease();
return
sp;
}
CC_SAFE_DELETE(sp);
return
NULL;
}
然後我們去cocos2dx_extra_luabinding.tolua中添加相應的內容,先是在前面添加
$#include
"myclass/MySprite.h"
然後在最後面添加
class
MySprite :
public
CCSprite{
static
MySprite* createMS(
const
char
*
fileName);
};
以上工作都完成了之後就執行build.sh,具體地址是:quick-cocos2d-x/lib/cocos2dx_extra/extra/luabinding/build.sh
然後你會看到一些信息,告訴你這個腳本做了些做事,腳本一下子就跑完了,都不用眨眼。
然後怎麼樣檢驗是不是加上去了呢?
看一下終端中的信息,它是會把相應的代碼加到quick-cocos2d-x/lib/cocos2dx_extra/build_luabinding/../extra/luabinding/cocos2dx_extra_luabinding.cpp中去,我們打開來看一下有沒有MySprite這個類了。看到有如下代碼:
/*
method: createMS of class MySprite */
#ifndef
TOLUA_DISABLE_tolua_cocos2dx_extra_luabinding_MySprite_createMS00
static
int
tolua_cocos2dx_extra_luabinding_MySprite_createMS00(lua_State* tolua_S)
{
#ifndef
TOLUA_RELEASE
tolua_Error
tolua_err;
if
(
!tolua_isusertable(tolua_S,1,
"MySprite"
,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
*
fileName = ((
const
char
*)
tolua_tostring(tolua_S,2,0));
{
MySprite*
tolua_ret = (MySprite*) MySprite::createMS(fileName);
tolua_pushusertype(tolua_S,(
void
*)tolua_ret,
"MySprite"
);
}
}
return
1;
#ifndef
TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,
"#ferror
in function 'createMS'."
,&tolua_err);
return
0;
#endif
}
#endif
//#ifndef TOLUA_DISABLE
這說明加進去了
然後下一步就是要去編譯我們的player了,因爲模擬器是依賴於這些代碼提供功能的,如果不重新針對添加了代碼的工程編譯可執行文件的話是不能支持新的自定義類的。因爲我用的是mac所以用xcode打開player的工程,編譯!然後運行,大功告成!!??等等,編譯出錯了。原來是我們添加了自定義的類之後,沒有在xcode中操作添加這些目標源文件,所以我們需要去手動添加一下
去quickcocos2dx.xcodeproj中找到Build Phases->Compile Sources然後點左下角的“+”號來添加剛纔我們的兩個文件。然後再次編譯,這次就真的是成功了。
終於到最後了,我們要新建一個工程來試驗一下是不是可以使用我們的自定義類了
去到我們想創建工程的目錄下然後執行創建工程的命令:sh ~/quick-cocos2d-x/bin/create_project.sh com.codeo4.myclass
然後進去找到MainScene.lua把ctor的方法改成這樣:
function
MainScene
:ctor
()
local
label = ui.newTTFLabel({
text
=
"Hello,
World"
,
size
=
64
,
x
= display.cx,
y
= display.cy,
align
= ui.
TEXT_ALIGN_CENTER
})
self
:addChild
(label)
local
ms = MySprite
:createMS
(
"Icon.png"
)
self
:addChild
(ms)
end
其實就是加上倒數的第三行後面兩行,同時copy一個文件到res目錄下。
然後用模擬器打開我們這個工程吧,最後的樣子是這樣的:
有朋友說想把程序發佈到手機上看看效果出錯了。如果想把上面的修改放到手機上看效果的話,如果是android手機,那需要修改一下Android.mk文件,具體就是quick-cocos2d-x/lib/cocos2dx_extra/proj.android/Android.mk,你需要在第13行後面加多一行:../extra/myclass/MySprite.cpp \
修改之後再編譯如果報錯就先clean一下吧,我試過是沒有問題的了,可以發佈到手機上運行無誤。