如何重启lua环境或重启引擎

第一步:看cocos2dx调用lua的初始入口点:

[cpp]查看普通文本

bool app delegate::applicationDidFinishLaunching()

{

cc director * p director = cc director::shared director();

p director-& gt;setOpenGLView(CCEGLView::sharedopengview());

CCEGLView::sharedopengview()-& gt;setDesignResolutionSize(480,320,kResolutionNoBorder);

p director-& gt;setDisplayStats(true);

p director-& gt;setAnimationInterval(1.0/60);

//注册lua引擎

cclua engine * pen gine = cclua engine::default engine();lua之旅从这里开始。

CCScriptEngineManager::shared manager()-& gt;setScriptEngine(pen gine);//保存新创建的lua引擎对象,以便在其他地方调用。

STD::string path = ccfile utils::shared file utils()-& gt;fullPathForFilename(" hello . Lua ");//CCFileUtils工具类必须封装文件的搜索路径。

//然后直接执行脚本,类似于这里helloCpp项目的实现。

//cc scene * PS scene = hello world::scene();

//p director-& gt;runWithScene(PS cene);

//这样的代码,但是这里没有这样的代码。可以猜到像这样的一些功能一定是在hello.lua中实现的其实一定是这样的。

//-因为需要添加这些东西,scene等节点都是c++类对象。

//既然hello.lua可以完成这些任务,那么lua就必须具备访问和操作这些类和对象的能力。

//换句话说,必须有一个机制让c++公开一些接口让lua调用。

//也就是lua可以访问cocos2dx的内容,而且一定要包装好,不然没人用。

pen gine-& gt;execute script file(path . c _ str());

返回true

}

第二步:看看CCLuaEngine做了什么。

[cpp]查看普通文本

类CCLuaEngine:公共CCScriptEngineProtocol

{

公共:

静态ccluengine * default engine(void);

virtual ~ ccluengine(void);

虚拟ccScriptType getScriptType() {

返回kScriptTypeLua

};

CCLuaStack *getLuaStack(void) {

返回m _ stack

}

// -我的新功能1

虚拟void addSearchPath(const char * path);

// -我的新生活2

虚拟void addluloader(Lua _ CFunction func);

// -从CCScriptEngineProtocol继承-

//= = = = = = = = = = =这些函数看起来都是父类中的纯虚函数= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

//-以下函数基本都是调用CCLuaStack * m _ stack的成员方法。

虚拟void removeScriptObjectByCCObject(cc object * pObj);

虚拟void removeScriptHandler(int n handler);

虚拟int reallocatscripthandler(int nHandler);

虚拟int execute string(const char * codes);

virtual int execute script file(const char * filename);

virtual int execute global function(const char * function name);

// -结束-

虚拟int executeNodeEvent(cc node * pNode,int nAction);

virtual int execute menuitemevent(CCMenuItem * pMenuItem);

virtual int executentificationevent(CCNotificationCenter * pNotificationCenter,const char * pszName);

virtual int executecallfunctionevent(CCCallFunc * pAction,cc object * p target = NULL);

虚拟int executeSchedule(int nHandler,float dt,cc node * pNode = NULL);

虚拟int executeLayerTouchesEvent(cc layer * pLayer,int eventType,cc set * pTouches);

虚拟int executeLayerTouchEvent(cc layer * pLayer,int eventType,cc touch * p touch);

虚拟int executelayerkypadevent(cc layer * pLayer,int event type);

virtual int execute accelerometerevent(cc layer * pLayer,CCAcceleration * packcelerationvalue);

virtual int execute event(int n handler,const char* pEventName,CCObject* pEventSource = NULL,const char * pEventSourceClassName = NULL);

int executeTableViewEvent(int nEventType,cocos2d::extension::cc table view * pTableView,void* pValue = NULL,CCArray * pResultArray = NULL);

virtual int executeEventWithArgs(int n handler,CCArray * pArgs);

虚拟bool handle assert(const char * msg);

虚拟bool parse config(CCScriptEngineProtocol::config type type,const STD::string & amp;str);

// -从CCScriptEngineProtocol end继承-

私人:

ccluengine(void)

:m_stack(空)

{}

bool init(void);

静态CCLuaEngine * m _ defaultEngine

CCLuaStack * m _ stack

};

第三步:CCUAEngine类中有一个指针成员变量m_stack。我们先来看看它的定义,注意一下CCLuaStack和CCUAEngine的区别。

[cpp]查看普通文本

类CCLuaStack:公共CObject

{

公共:

静态CCLuaStack * create(void);

静态CCLuaStack * attach(Lua _ State * L);

lua_State* getLuaState(void) {

返回m _ state

}

虚拟void addSearchPath(const char * path);

虚拟void addluloader(Lua _ c function func);

虚拟void removeScriptObjectByCCObject(cc object * pObj);

虚拟void removeScriptHandler(int n handler);

虚拟int reallocatscripthandler(int nHandler);

虚拟int execute string(const char * codes);

virtual int execute script file(const char * filename);

virtual int execute global function(const char * function name);

虚虚净(void);

虚拟void pushInt(int int value);

虚拟void push float(float float value);

虚拟void push boolean(bool boolValue);

虚拟void pushString(const char * string value);

虚拟void pushString(const char * string value,int length);

虚拟void push nil(void);

虚拟void pushc object(cc object * object value,const char * typeName);

虚拟void pushccluavail(const ccluavail & amp;值);

虚拟void pushCCLuaValueDict(const CCLuaValueDict & amp;dict);

虚拟void pushccluavaluevaluearly(const ccluavaluevaluearly & amp;数组);

虚拟bool pushFunctionByHandler(int n handler);

虚拟int execute function(int numArgs);

虚拟int executeFunctionByHandler(int n handler,int numArgs);

virtual int executeFunctionReturnArray(int n handler,int nNumArgs,int nNummResults,CCArray * pResultArray);

虚拟bool handle assert(const char * msg);

受保护:

CCLuaStack(void)

:m_state(空)

,m_callFromLua(0)

{}

bool init(void);

bool initwithlaustate(Lua _ State * L);

lua _ State * m _ state

int m _ callFromLua

};