Lua中调用C++方法
目前项目,使用了Lua脚本,至于使用Lua的好处不再赘述了。于是对Tolua做了一些小小的学习,总结一下吧。
主要说一下如何在Lua中调用C++方法。
Lua调用C++的桥梁,是tolua。tolua是什么,http://blog.csdn.net/killwd/article/details/1423923 这篇文章介绍的很详细。
我们需要手动做的,其实便是编写中间类,这个类被tolua直接使用,最终的目的是实现lua中对象方法和C++中对象方法的对应。
LuaCocos2d.cpp 完成了所有基本的cocos对象方法的转换,我们把它称之为一个桥梁。LuaCocos2d.cpp 是在CCLuaStack 中的init函数中调用的。
tolua_Cocos2d_open(m_state);
1.CCLuaStack 中调用中间桥梁(比如LuaCocos2d)
2.桥梁里面(比如LuaCocos2d)实现各种方法的转换
这样,整个的重点就是桥梁的生成了。
看一下LuaCocos2d ,最重要的方法我认为是tolua_reg_types。
/* function to register type */ static void tolua_reg_types (lua_State* tolua_S) { tolua_usertype(tolua_S,"CCTransitionProgressOutIn"); tolua_usertype(tolua_S,"CCControlSaturationBrightnessPicker"); tolua_usertype(tolua_S,"CCShaky3D"); tolua_usertype(tolua_S,"CCTransitionTurnOffTiles"); tolua_usertype(tolua_S,"CCTransitionShrinkGrow"); tolua_usertype(tolua_S,"CCFadeOutBLTiles"); tolua_usertype(tolua_S,"CCProgressFromTo"); tolua_usertype(tolua_S,"CCActionCamera"); tolua_usertype(tolua_S,"CCFlipY3D"); tolua_usertype(tolua_S,"CCLinkPosition"); tolua_usertype(tolua_S,"CCEaseExponentialIn"); tolua_usertype(tolua_S,"CCApplication"); tolua_usertype(tolua_S,"CCControlHuePicker"); tolua_usertype(tolua_S,"CCScaleTo"); tolua_usertype(tolua_S,"CCTransitionFlipAngular"); tolua_usertype(tolua_S,"CCEaseElasticOut"); tolua_usertype(tolua_S,"CCAccelDeccelAmplitude"); tolua_usertype(tolua_S,"CCDisplayData"); tolua_usertype(tolua_S,"CCParticleRain"); tolua_usertype(tolua_S,"CCTransitionSlideInB"); tolua_usertype(tolua_S,"CCKeypadDispatcher"); tolua_usertype(tolua_S,"CCDelayTime"); tolua_usertype(tolua_S,"CCOrbitCamera"); tolua_usertype(tolua_S,"CCLabelTTF"); tolua_usertype(tolua_S,"CCScale9Sprite"); tolua_usertype(tolua_S,"CCMoveTo"); tolua_usertype(tolua_S,"CCTransitionSplitRows"); tolua_usertype(tolua_S,"CCFollow"); tolua_usertype(tolua_S,"CCMovementData"); tolua_usertype(tolua_S,"CCBlink"); tolua_usertype(tolua_S,"CCTexture2D"); tolua_usertype(tolua_S,"CCTouch"); tolua_usertype(tolua_S,"CCParticleSystemQuad"); tolua_usertype(tolua_S,"CCTransitionMoveInB"); tolua_usertype(tolua_S,"CCToggleVisibility"); tolua_usertype(tolua_S,"cc_timeval"); tolua_usertype(tolua_S,"CCTMXTilesetInfo"); tolua_usertype(tolua_S,"CCParticleSun"); tolua_usertype(tolua_S,"CCScene"); tolua_usertype(tolua_S,"CCArmatureDataManager"); tolua_usertype(tolua_S,"CCFadeIn"); tolua_usertype(tolua_S,"CCTransitionFadeDown"); tolua_usertype(tolua_S,"CCWavesTiles3D"); tolua_usertype(tolua_S,"CCFadeOutDownTiles"); tolua_usertype(tolua_S,"CCComponentContainer"); tolua_usertype(tolua_S,"CCTMXTiledMap"); tolua_usertype(tolua_S,"CCCardinalSplineBy"); tolua_usertype(tolua_S,"CCTransitionZoomFlipAngular"); tolua_usertype(tolua_S,"CCFlipY"); tolua_usertype(tolua_S,"CCProgressTo"); tolua_usertype(tolua_S,"CCReuseGrid"); tolua_usertype(tolua_S,"CCShow"); tolua_usertype(tolua_S,"CCEaseRateAction"); tolua_usertype(tolua_S,"CCEaseBackIn"); tolua_usertype(tolua_S,"CCTransitionScene"); tolua_usertype(tolua_S,"CCGridAction"); tolua_usertype(tolua_S,"CCFiniteTimeAction"); tolua_usertype(tolua_S,"CCSpriteFrameCache"); tolua_usertype(tolua_S,"CCMotionStreak"); tolua_usertype(tolua_S,"CCAnimate"); tolua_usertype(tolua_S,"CCTiledGrid3DAction"); tolua_usertype(tolua_S,"CCPointArray"); tolua_usertype(tolua_S,"CCTransitionProgressHorizontal"); tolua_usertype(tolua_S,"CCRectShape"); tolua_usertype(tolua_S,"ccColor3B"); tolua_usertype(tolua_S,"CCTextureCache"); tolua_usertype(tolua_S,"CCDevice"); tolua_usertype(tolua_S,"CCFadeOutTRTiles"); tolua_usertype(tolua_S,"CCMenuItemSprite"); tolua_usertype(tolua_S,"CCEaseExponentialInOut"); tolua_usertype(tolua_S,"CCFadeOutUpTiles"); tolua_usertype(tolua_S,"CCWaves3D"); tolua_usertype(tolua_S,"ccBlendFunc"); tolua_usertype(tolua_S,"CCImage"); tolua_usertype(tolua_S,"CCLens3D"); tolua_usertype(tolua_S,"CCTintBy"); tolua_usertype(tolua_S,"CCBool"); tolua_usertype(tolua_S,"CCPoint"); tolua_usertype(tolua_S,"CCParticleMeteor"); tolua_usertype(tolua_S,"CCEaseElasticIn"); tolua_usertype(tolua_S,"CCEaseSineIn"); tolua_usertype(tolua_S,"CCCardinalSplineTo"); tolua_usertype(tolua_S,"CCFloat"); tolua_usertype(tolua_S,"CCWaves"); tolua_usertype(tolua_S,"CCParticleFireworks"); tolua_usertype(tolua_S,"CCEvent"); tolua_usertype(tolua_S,"CCBaseData"); tolua_usertype(tolua_S,"CCActionInterval"); tolua_usertype(tolua_S,"CCRenderTexture"); tolua_usertype(tolua_S,"CCObject"); tolua_usertype(tolua_S,"CCEaseBackInOut"); tolua_usertype(tolua_S,"CCAtlasNode"); tolua_usertype(tolua_S,"CCEaseBackOut"); tolua_usertype(tolua_S,"CCSize"); tolua_usertype(tolua_S,"CCInteger"); tolua_usertype(tolua_S,"CCParticleFlower"); tolua_usertype(tolua_S,"CCLiquid"); tolua_usertype(tolua_S,"CCEaseBounce"); tolua_usertype(tolua_S,"CCSpeed"); tolua_usertype(tolua_S,"CCFrameData"); tolua_usertype(tolua_S,"CCTransitionMoveInL"); tolua_usertype(tolua_S,"CCSpriteFrame"); tolua_usertype(tolua_S,"CCJumpBy"); tolua_usertype(tolua_S,"CCTransitionFadeTR"); tolua_usertype(tolua_S,"CCControlUtils"); tolua_usertype(tolua_S,"CCGridBase"); tolua_usertype(tolua_S,"RGBA"); tolua_usertype(tolua_S,"CCParticleDisplayData"); tolua_usertype(tolua_S,"SimpleAudioEngine"); tolua_usertype(tolua_S,"CCNotificationCenter"); tolua_usertype(tolua_S,"CCPointShape"); tolua_usertype(tolua_S,"CCSpriteBatchNode"); tolua_usertype(tolua_S,"CCEaseSineInOut"); tolua_usertype(tolua_S,"ccFontShadow"); tolua_usertype(tolua_S,"CCTwirl"); tolua_usertype(tolua_S,"CCCircleShape"); tolua_usertype(tolua_S,"CCDrawNode"); tolua_usertype(tolua_S,"CCControlColourPicker"); tolua_usertype(tolua_S,"CCMenuItemLabel"); tolua_usertype(tolua_S,"CCDouble"); tolua_usertype(tolua_S,"CCTargetedAction"); tolua_usertype(tolua_S,"CCGrid3DAction"); tolua_usertype(tolua_S,"CCString"); tolua_usertype(tolua_S,"CCRemoveSelf"); tolua_usertype(tolua_S,"CCAnimationData"); tolua_usertype(tolua_S,"CCTransitionMoveInR"); tolua_usertype(tolua_S,"CCTransitionFade"); tolua_usertype(tolua_S,"CCSkewBy"); tolua_usertype(tolua_S,"CCFlipX"); tolua_usertype(tolua_S,"CCActionManager"); tolua_usertype(tolua_S,"CCTransitionSlideInT"); tolua_usertype(tolua_S,"CCCatmullRomTo"); tolua_usertype(tolua_S,"CCPolygonShape"); tolua_usertype(tolua_S,"CCTransitionSceneOriented"); tolua_usertype(tolua_S,"CCAnimationCache"); tolua_usertype(tolua_S,"CCComponent"); tolua_usertype(tolua_S,"CCTransitionSlideInR"); tolua_usertype(tolua_S,"CCTransitionMoveInT"); tolua_usertype(tolua_S,"CCLayerGradient"); tolua_usertype(tolua_S,"CCShapeNode"); tolua_usertype(tolua_S,"CCStopGrid"); tolua_usertype(tolua_S,"CCTMXMapInfo"); tolua_usertype(tolua_S,"CCConfiguration"); tolua_usertype(tolua_S,"CCLayerColor"); tolua_usertype(tolua_S,"CCMenuItemFont"); tolua_usertype(tolua_S,"CCTransitionFadeUp"); tolua_usertype(tolua_S,"CCTransitionProgressVertical"); tolua_usertype(tolua_S,"CCAccelerometer"); tolua_usertype(tolua_S,"CCProcessBase"); tolua_usertype(tolua_S,"CCRect"); tolua_usertype(tolua_S,"CCActionInstant"); tolua_usertype(tolua_S,"CCTurnOffTiles"); tolua_usertype(tolua_S,"CCParticleSnow"); tolua_usertype(tolua_S,"CCMenuItemImage"); tolua_usertype(tolua_S,"ccTexParams"); tolua_usertype(tolua_S,"CCEaseSineOut"); tolua_usertype(tolua_S,"CCCallFuncN"); tolua_usertype(tolua_S,"CCTransitionPageTurn"); tolua_usertype(tolua_S,"ccFontDefinition"); tolua_usertype(tolua_S,"ccFontStroke"); tolua_usertype(tolua_S,"CCTintTo"); tolua_usertype(tolua_S,"CCTransitionCrossFade"); tolua_usertype(tolua_S,"CCClippingRegionNode"); tolua_usertype(tolua_S,"CCActionEase"); tolua_usertype(tolua_S,"CCBone"); tolua_usertype(tolua_S,"CCParallaxNode"); tolua_usertype(tolua_S,"CCRotateTo"); tolua_usertype(tolua_S,"CCArmature"); tolua_usertype(tolua_S,"CCBatchNode"); tolua_usertype(tolua_S,"CCMovementBoneData"); tolua_usertype(tolua_S,"CCShakyTiles3D"); tolua_usertype(tolua_S,"CCArmatureDisplayData"); tolua_usertype(tolua_S,"CCNode"); tolua_usertype(tolua_S,"CCArmatureData"); tolua_usertype(tolua_S,"CCArmatureAnimation"); tolua_usertype(tolua_S,"CCSpriteDisplayData"); tolua_usertype(tolua_S,"CCBezierTo"); tolua_usertype(tolua_S,"CCDeccelAmplitude"); tolua_usertype(tolua_S,"CCTweenType"); tolua_usertype(tolua_S,"CCBoneData"); tolua_usertype(tolua_S,"CCTableView"); tolua_usertype(tolua_S,"CCTableViewCell"); tolua_usertype(tolua_S,"CCTransitionProgress"); tolua_usertype(tolua_S,"CCEditBox"); tolua_usertype(tolua_S,"HSV"); tolua_usertype(tolua_S,"CCRotateBy"); tolua_usertype(tolua_S,"CCControlStepper"); tolua_usertype(tolua_S,"CCControlSlider"); tolua_usertype(tolua_S,"CCMoveBy"); tolua_usertype(tolua_S,"CCParticleGalaxy"); tolua_usertype(tolua_S,"CCCamera"); tolua_usertype(tolua_S,"CCSequence"); tolua_usertype(tolua_S,"CCTileMapAtlas"); tolua_usertype(tolua_S,"tCCParticle"); tolua_usertype(tolua_S,"CCCatmullRomBy"); tolua_usertype(tolua_S,"CCHide"); tolua_usertype(tolua_S,"CCControlButton"); tolua_usertype(tolua_S,"CCJumpTiles3D"); tolua_usertype(tolua_S,"CCTransitionJumpZoom"); tolua_usertype(tolua_S,"CCTMXLayer"); tolua_usertype(tolua_S,"CCControl"); tolua_usertype(tolua_S,"AssetsManager"); tolua_usertype(tolua_S,"CCScheduler"); tolua_usertype(tolua_S,"CCDirector"); tolua_usertype(tolua_S,"CCMenuItemToggle"); tolua_usertype(tolua_S,"CCEGLView"); tolua_usertype(tolua_S,"ccBezierConfig"); tolua_usertype(tolua_S,"CCFadeTo"); tolua_usertype(tolua_S,"CCTouchDispatcher"); tolua_usertype(tolua_S,"CCMenuItemAtlasFont"); tolua_usertype(tolua_S,"SEL_MenuHandler"); tolua_usertype(tolua_S,"CCEventDispatcher"); tolua_usertype(tolua_S,"CCParticleSystem"); tolua_usertype(tolua_S,"CCJumpTo"); tolua_usertype(tolua_S,"CCMenu"); tolua_usertype(tolua_S,"ccColor4F"); tolua_usertype(tolua_S,"CCEaseExponentialOut"); tolua_usertype(tolua_S,"CCSet"); tolua_usertype(tolua_S,"CCCallFunc"); tolua_usertype(tolua_S,"CCLabelAtlas"); tolua_usertype(tolua_S,"CCLabelBMFont"); tolua_usertype(tolua_S,"CCEaseBounceIn"); tolua_usertype(tolua_S,"CCPlace"); tolua_usertype(tolua_S,"CCSprite"); tolua_usertype(tolua_S,"CCFileUtils"); tolua_usertype(tolua_S,"CCLayer"); tolua_usertype(tolua_S,"CCTransitionSplitCols"); tolua_usertype(tolua_S,"CCPageTurn3D"); tolua_usertype(tolua_S,"CCEaseIn"); tolua_usertype(tolua_S,"CCTransitionProgressRadialCW"); tolua_usertype(tolua_S,"CCEaseElastic"); tolua_usertype(tolua_S,"CCTransitionProgressRadialCCW"); tolua_usertype(tolua_S,"CCEaseOut"); tolua_usertype(tolua_S,"CCBezierBy"); tolua_usertype(tolua_S,"CCScrollView"); tolua_usertype(tolua_S,"CCUserDefault"); tolua_usertype(tolua_S,"CCProgressTimer"); tolua_usertype(tolua_S,"CCDictionary"); tolua_usertype(tolua_S,"CCParticleFire"); tolua_usertype(tolua_S,"CCTransitionFlipY"); tolua_usertype(tolua_S,"CCTMXLayerInfo"); tolua_usertype(tolua_S,"CCTransitionFadeBL"); tolua_usertype(tolua_S,"CCShuffleTiles"); tolua_usertype(tolua_S,"CCTransitionSlideInL"); tolua_usertype(tolua_S,"CCRipple3D"); tolua_usertype(tolua_S,"CCRepeat"); tolua_usertype(tolua_S,"CCClippingNode"); tolua_usertype(tolua_S,"CCTransitionProgressInOut"); tolua_usertype(tolua_S,"CCParticleSpiral"); tolua_usertype(tolua_S,"CCTransitionZoomFlipY"); tolua_usertype(tolua_S,"CCEaseBounceInOut"); tolua_usertype(tolua_S,"CCTransitionZoomFlipX"); tolua_usertype(tolua_S,"CCTransitionFlipX"); tolua_usertype(tolua_S,"CCSpawn"); tolua_usertype(tolua_S,"CCTransitionRotoZoom"); tolua_usertype(tolua_S,"CCEaseInOut"); tolua_usertype(tolua_S,"CCShatteredTiles3D"); tolua_usertype(tolua_S,"CCAccelAmplitude"); tolua_usertype(tolua_S,"CCParticleSmoke"); tolua_usertype(tolua_S,"CCTMXObjectGroup"); tolua_usertype(tolua_S,"CCFadeOut"); tolua_usertype(tolua_S,"CCLayerMultiplex"); tolua_usertype(tolua_S,"CCControlPotentiometer"); tolua_usertype(tolua_S,"CCParticleExplosion"); tolua_usertype(tolua_S,"CCGLProgram"); tolua_usertype(tolua_S,"CCMenuItem"); tolua_usertype(tolua_S,"ccColor4B"); tolua_usertype(tolua_S,"CCFlipX3D"); tolua_usertype(tolua_S,"CCSplitRows"); tolua_usertype(tolua_S,"CCArray"); tolua_usertype(tolua_S,"CCReverseTime"); tolua_usertype(tolua_S,"CCSkewTo"); tolua_usertype(tolua_S,"CCParticleBatchNode"); tolua_usertype(tolua_S,"CCGraySprite"); tolua_usertype(tolua_S,"CCAnimation"); tolua_usertype(tolua_S,"CCRepeatForever"); tolua_usertype(tolua_S,"CCTime"); tolua_usertype(tolua_S,"CCAction"); tolua_usertype(tolua_S,"CCTextFieldTTF"); tolua_usertype(tolua_S,"CCTextureAtlas"); tolua_usertype(tolua_S,"CCScaleBy"); tolua_usertype(tolua_S,"CCEaseElasticInOut"); tolua_usertype(tolua_S,"CCSplitCols"); tolua_usertype(tolua_S,"CCEaseBounceOut"); tolua_usertype(tolua_S,"CCAnimationFrame"); tolua_usertype(tolua_S,"CCControlSwitch"); }
拿CCLabelTTF举例,你在里面搜便可以明白了。第一个参数先不用管,第二个是CCLabelTTF在调用的方法名,第三个参数便是这个文件中定义的方法,你找到一看便会明白了。
#ifdef __cplusplus tolua_cclass(tolua_S,"CCLabelTTF","CCLabelTTF","CCSprite",tolua_collect_CCLabelTTF); #else tolua_cclass(tolua_S,"CCLabelTTF","CCLabelTTF","CCSprite",NULL); #endif 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,"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_function(tolua_S,"initWithString",tolua_Cocos2d_CCLabelTTF_initWithString00); tolua_function(tolua_S,"initWithString",tolua_Cocos2d_CCLabelTTF_initWithString01); tolua_function(tolua_S,"initWithString",tolua_Cocos2d_CCLabelTTF_initWithString02); tolua_function(tolua_S,"initWithStringAndTextDefinition",tolua_Cocos2d_CCLabelTTF_initWithStringAndTextDefinition00); tolua_function(tolua_S,"init",tolua_Cocos2d_CCLabelTTF_init00); tolua_function(tolua_S,"setTextDefinition",tolua_Cocos2d_CCLabelTTF_setTextDefinition00); tolua_function(tolua_S,"getTextDefinition",tolua_Cocos2d_CCLabelTTF_getTextDefinition00); tolua_function(tolua_S,"enableShadow",tolua_Cocos2d_CCLabelTTF_enableShadow00); tolua_function(tolua_S,"disableShadow",tolua_Cocos2d_CCLabelTTF_disableShadow00); tolua_function(tolua_S,"enableStroke",tolua_Cocos2d_CCLabelTTF_enableStroke00); tolua_function(tolua_S,"disableStroke",tolua_Cocos2d_CCLabelTTF_disableStroke00); tolua_function(tolua_S,"setFontFillColor",tolua_Cocos2d_CCLabelTTF_setFontFillColor00); 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_endmodule(tolua_S);
假如我们有自己的C++方法需要在Lua中调用,也按照这两个大步骤完成即可。中间桥梁类参考LuaCocos2d.cpp即可。