cocos2dx是怎么使用lua引擎的
来源:互联网 发布:unity3d demo 下载 编辑:程序博客网 时间:2024/06/03 00:14
第一步:看cocos2dx调用lua的最初切入点:
bool AppDelegate::applicationDidFinishLaunching(){ CCDirector *pDirector = CCDirector::sharedDirector(); pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480, 320, kResolutionNoBorder); pDirector->setDisplayStats(true); pDirector->setAnimationInterval(1.0 / 60); // register lua engine CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();//从这里开始了lua旅程。 CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);//保存刚才新建的lua引擎对象,以便别处调用。 std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("hello.lua");//CCFileUtils工具类一定封装了文件的搜索路径。 //接下来直接执行了脚本,跟句helloCpp工程的实现,这里本该是类似 //CCScene *pScene = HelloWorld::scene(); //pDirector->runWithScene(pScene); //这样的代码,但这里并没有这样的代码,可以猜测:hello.lua中一定是实现了类似这样的一些功能,事实上,一定是这样。 //---因为需要添加的这些东西scene、other nodes都是一些c++类的对象, //既然hello.lua能完成这些工作,那么lua也一定是有能力访问并操作了这些类与对象, //换句话说,也就是一定存在一种机制,让c++暴漏一些接口供lua调用, //亦即:lua可以访问cocos2dx里面的东西,并且,一定封装的很好用,否则没人用了。 pEngine->executeScriptFile(path.c_str()); return true;}
第二步:看看CCLuaEngine到底干了点啥
class CCLuaEngine : public CCScriptEngineProtocol{public: static CCLuaEngine* defaultEngine(void); virtual ~CCLuaEngine(void); virtual ccScriptType getScriptType() { return kScriptTypeLua; }; CCLuaStack *getLuaStack(void) { return m_stack; } //-----------new in me 1 virtual void addSearchPath(const char* path); //-----------new in me 2 virtual void addLuaLoader(lua_CFunction func); //----------------------------inherit from CCScriptEngineProtocol------------------ //==================这些函数好像都是纯虚函数在父类中=========================== //--------下面这几个函数基本都是调用【CCLuaStack *m_stack;】的成员方法来实现的 virtual void removeScriptObjectByCCObject(CCObject* pObj); virtual void removeScriptHandler(int nHandler); virtual int reallocateScriptHandler(int nHandler); virtual int executeString(const char* codes); virtual int executeScriptFile(const char* filename); virtual int executeGlobalFunction(const char* functionName); //--------------------------------end-------------------------------- virtual int executeNodeEvent(CCNode* pNode, int nAction); virtual int executeMenuItemEvent(CCMenuItem* pMenuItem); virtual int executeNotificationEvent(CCNotificationCenter* pNotificationCenter, const char* pszName); virtual int executeCallFuncActionEvent(CCCallFunc* pAction, CCObject* pTarget = NULL); virtual int executeSchedule(int nHandler, float dt, CCNode* pNode = NULL); virtual int executeLayerTouchesEvent(CCLayer* pLayer, int eventType, CCSet *pTouches); virtual int executeLayerTouchEvent(CCLayer* pLayer, int eventType, CCTouch *pTouch); virtual int executeLayerKeypadEvent(CCLayer* pLayer, int eventType); virtual int executeAccelerometerEvent(CCLayer* pLayer, CCAcceleration* pAccelerationValue); virtual int executeEvent(int nHandler, const char* pEventName, CCObject* pEventSource = NULL, const char* pEventSourceClassName = NULL); int executeTableViewEvent(int nEventType,cocos2d::extension::CCTableView* pTableView,void* pValue = NULL, CCArray* pResultArray = NULL); virtual int executeEventWithArgs(int nHandler, CCArray* pArgs); virtual bool handleAssert(const char *msg); virtual bool parseConfig(CCScriptEngineProtocol::ConfigType type, const std::string& str); //----------------------------inherit from CCScriptEngineProtocol end--------------private: CCLuaEngine(void) : m_stack(NULL) {} bool init(void); static CCLuaEngine* m_defaultEngine; CCLuaStack *m_stack;};
第三步:CCLuaEngine类中有一个指针成员变量m_stack,我们先来看看它的定义,注意下CCLuaStack和CCLuaEngine的区别于联系
class CCLuaStack : public CCObject{public: static CCLuaStack *create(void); static CCLuaStack *attach(lua_State *L); lua_State* getLuaState(void) { return m_state; } virtual void addSearchPath(const char* path); virtual void addLuaLoader(lua_CFunction func); virtual void removeScriptObjectByCCObject(CCObject* pObj); virtual void removeScriptHandler(int nHandler); virtual int reallocateScriptHandler(int nHandler); virtual int executeString(const char* codes); virtual int executeScriptFile(const char* filename); virtual int executeGlobalFunction(const char* functionName); virtual void clean(void); virtual void pushInt(int intValue); virtual void pushFloat(float floatValue); virtual void pushBoolean(bool boolValue); virtual void pushString(const char* stringValue); virtual void pushString(const char* stringValue, int length); virtual void pushNil(void); virtual void pushCCObject(CCObject* objectValue, const char* typeName); virtual void pushCCLuaValue(const CCLuaValue& value); virtual void pushCCLuaValueDict(const CCLuaValueDict& dict); virtual void pushCCLuaValueArray(const CCLuaValueArray& array); virtual bool pushFunctionByHandler(int nHandler); virtual int executeFunction(int numArgs); virtual int executeFunctionByHandler(int nHandler, int numArgs); virtual int executeFunctionReturnArray(int nHandler,int nNumArgs,int nNummResults,CCArray* pResultArray); virtual bool handleAssert(const char *msg);protected: CCLuaStack(void) : m_state(NULL) , m_callFromLua(0) {} bool init(void); bool initWithLuaState(lua_State *L); lua_State *m_state; int m_callFromLua;};
0 0
- cocos2dx是怎么使用lua引擎的
- lua教程九---使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- cocos2dx引擎中lua使用加密sqlite数据库
- [cocos2dx]cocos2dx3.x+lua中使用物理引擎
- 【COCOS2DX-LUA 脚本开发之九】使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- 【COCOS2DX-LUA 脚本开发之九】使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- 【COCOS2DX-LUA 脚本开发之九】使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- 使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- lua面向对象是怎么实现的
- lua面向对象是怎么实现的
- cocos2dx中protobuf的lua使用
- cocos2dx lua图集的使用
- lua源码分析4(lua是怎么执行的)
- cocos2dx-lua sqlite3使用
- cocos2dx修改引擎代码进行lua绑定
- cocos2dx的lua绑定
- cocos2dx的lua绑定
- cocos2dx的lua绑定
- eclipse的tomcat运行mave web项目
- Dijstra算法
- 埋线双眼皮痛吗
- IOS 动态更新 waxpatch (lua in iOS App)
- android PopupWindow嵌套ListView(模仿分类下拉菜单效果)
- cocos2dx是怎么使用lua引擎的
- v4l2,camera笔记
- ajax传递二维数组到前台
- java日期格式化
- Time Warp in Animation
- 推荐大家使用的CSS书写规范、顺序
- 单向关系中的JoinColumn
- Delphi操作XML
- 安卓程序如何控制闪光灯开关