當前位置:編程學習大全網 - 源碼下載 - 如何重啟lua環境或重啟引擎

如何重啟lua環境或重啟引擎

第壹步:看cocos2dx調用lua的最初切入點:

[cpp] view plain copy

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到底幹了點啥

[cpp] view plain copy

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的區別於聯系

[cpp] view plain copy

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;

};

  • 上一篇:誰能幫我避免殺死灰鴿子VIP2006?
  • 下一篇:SEO霸屏技術有什麽作用
  • copyright 2024編程學習大全網