標籤:quick-cocos2d-x lua cocos2d-x
最近做的一個quick-cocos2d-x 3.3 final項目中使用到了曲線運動CardinalSpline,發現cc.CardinalSplineBy:create是可以使用的,但是cc.CardinalSplineTo:create卻是一個空值報錯,讓我感到有些疑惑,後來發現有朋友跟我的問題一樣,http://www.cocoachina.com/bbs/read.php?tid-273815.html,的確是cc.CardinalSplineTo:create沒有匯出給lua,但是它的實現都已經在c++端做好了。
如果我們要在模擬器上運行cc.CardinalSplineTo:create,那麼我們先找到 quick-3.3\cocos\scripting\lua-bindings\manual\cocos2d目錄下的lua_cocos2dx_manual.cpp檔案,開啟之後全域搜尋CardinalSplineTo,發現沒有搜尋到,但是CardinalSplineBy卻可以搜到,所以我們可以仿照CardinalSplineBy,將CardinalSplineTo匯出給lua端使用。下面共有三處需要添加修改:
1.
int register_all_cocos2dx_manual(lua_State* tolua_S){ if (NULL == tolua_S) return 0; extendNode(tolua_S); extendScene(tolua_S); extendLayer(tolua_S); extendMenuItem(tolua_S); extendMenuItemImage(tolua_S); extendMenuItemLabel(tolua_S); extendMenuItemFont(tolua_S); extendMenuItemSprite(tolua_S); extendMenuItemToggle(tolua_S); extendMenu(tolua_S); extendScheduler(tolua_S); extendSequence(tolua_S); extendCallFunc(tolua_S); extendSpawn(tolua_S); extendCardinalSplineBy(tolua_S); extendCardinalSplineTo(tolua_S); //這一行是添加進去的 extendCatmullRomBy(tolua_S); extendCatmullRomTo(tolua_S); extendBezierBy(tolua_S); extendBezierTo(tolua_S); extendDrawNode(tolua_S); extendSprite(tolua_S); extendLayerColor(tolua_S); extendLayerMultiplex(tolua_S); extendParticleSystem(tolua_S); extendFileUtils(tolua_S); extendUserDefault(tolua_S); extendGLProgram(tolua_S); extendTexture2D(tolua_S); extendSpriteBatchNode(tolua_S); extendEventListenerKeyboard(tolua_S); extendEventListenerTouchOneByOne(tolua_S); extendEventListenerTouchAllAtOnce(tolua_S); extendEventListenerMouse(tolua_S); extendEventListenerCustom(tolua_S); extendEventListenerAcceleration(tolua_S); extendActionCamera(tolua_S); extendGridAction(tolua_S); extendMotionStreak(tolua_S); extendAtlasNode(tolua_S); extendParticleBatchNode(tolua_S); extendLabel(tolua_S); extendTMXTiledMap(tolua_S); extendConsole(tolua_S); extendGLProgramState(tolua_S); extendOrbitCamera(tolua_S); extendTMXLayer(tolua_S); extendApplication(tolua_S); extendTextureCache(tolua_S); extendGLView(tolua_S); extendCamera(tolua_S); return 0;}
2.
int lua_cocos2d_CardinalSplineTo_create(lua_State* tolua_S){ if (NULL == tolua_S) return 0; int argc = 0; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; if (!tolua_isusertable(tolua_S,1,"cc.CardinalSplineTo",0,&tolua_err)) goto tolua_lerror;#endif argc = lua_gettop(tolua_S) - 1; if (argc == 3) { double dur = 0.0; ok &= luaval_to_number(tolua_S, 2, &dur, "cc.CardinalSplineTo:create"); if (!ok) return 0; int num = 0; cocos2d::Vec2 *arr = NULL; ok &= luaval_to_array_of_vec2(tolua_S, 3, &arr, &num, "cc.CardinalSplineTo:create"); if (!ok) return 0; double ten = 0.0; ok &= luaval_to_number(tolua_S, 4, &ten, "cc.CardinalSplineTo:create"); if (!ok) { CC_SAFE_DELETE_ARRAY(arr); return 0; } if (num > 0) { PointArray* points = PointArray::create(num); if (NULL == points) { CC_SAFE_DELETE_ARRAY(arr); return 0; } for( int i = 0; i < num; i++) { points->addControlPoint(arr[i]); } CC_SAFE_DELETE_ARRAY(arr); CardinalSplineTo* tolua_ret = CardinalSplineTo::create(dur, points, ten); if (NULL != tolua_ret) { int nID = (tolua_ret) ? (int)tolua_ret->_ID : -1; int* pLuaID = (tolua_ret) ? &tolua_ret->_luaID : NULL; toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"cc.CardinalSplineTo"); return 1; } } } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n", "cc.CardinalSplineTo:create", argc, 3); return 0; #if COCOS2D_DEBUG >= 1tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2d_CardinalSplineTo_create'.",&tolua_err); return 0;#endif}
3.
static void extendCardinalSplineTo(lua_State* tolua_S){ lua_pushstring(tolua_S,"cc.CardinalSplineTo"); lua_rawget(tolua_S,LUA_REGISTRYINDEX); if (lua_istable(tolua_S,-1)) { lua_pushstring(tolua_S,"create"); lua_pushcfunction(tolua_S,lua_cocos2d_CardinalSplineTo_create); lua_rawset(tolua_S,-3); } lua_pop(tolua_S, 1);}
其中,1步驟加註釋的那一行加在相應的位置,2和3都是直接添加到檔案中。
現在我們開啟 quick-3.3\quick\player\proj.win32\player.sln檔案,產生項目,進行編譯,就可以發現我們的player中CardinalSplineTo不再是控制了。
如果要在android上編包運行,那麼我們可以在當前項目下的 \frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\cocos2d目錄中開啟lua_cocos2dx_manual.cpp檔案,按照之前的三個步驟進行修改添加,然後重新編譯,運行build_native.bat,打包在手機上即可。
quick-cocos2d-x 3.3 final 中cc.CardinalSplineTo:create匯出到lua