天天看點

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

隻是擷取一個全局變量什麼的太沒意思了,今天我們來玩個高難度的——擷取Lua表結構的資料。

(旁白:O O!我是不是該說點什麼?)

上一章傳送門:http://blog.csdn.net/musicvs/article/details/8445027

笨木頭花心貢獻,啥?花心?不呢,是用心~

轉載請注明,原文位址:http://blog.csdn.net/musicvs/article/details/8445079

正文:

1. 什麼是table

table是Lua裡最強大的資料類型,我們可以當成是數組,但是它又和數組有點不一樣,建議大家看看Lua的文法教程,因為我對table也沒有熟悉到可以給大家解釋的程度。

(旁白:那你還寫什麼教程。。。)

2. 擷取table變量

現在,我們給helloLua.lua檔案添加一個table全局變量:

-- helloLua.lua檔案
myName = "beauty girl"

helloTable = {name = "mutou", IQ = 125}
           

我們看到,多了一個helloTable的變量,它和數組十分相似,又和HashMap有點類似,總之它很強大。

(旁白:我覺得亮點是,你的IQ有125?我覺得乘以2的話,還有點可能~!)

話說,125乘以2等于多少?...250 ....O O!

擷取helloTable變量的方式和以前是一樣的:

/* 取得table變量,在棧頂 */
    lua_getglobal(pL, "helloTable");
           

這樣,helloTable變量就被存放到棧頂。

可我們并不是要取table變量,因為C++中是無法識别Lua的table類型的,是以我們要取得table中具體的值,也就是name和IQ的值。

3. lua_gettable函數

有一個和lua_getglobal類似的函數,叫做lua_gettable,顧名思義,它是用來取得table相關的資料的。

(旁白:廢話少點好吧= =)

lua_gettable函數會從棧頂取得一個值,然後根據這個值去table中尋找對應的值,最後把找到的值放到棧頂。

lua_pushstring()函數可以把C++中的字元串存放到Lua的棧裡;

然後再用lua_gettable()取執行前面所說的步驟,lua_gettable的第二個參數是指定的table變量在棧中的索引。

(旁白:小笨木,我被你繞暈了。。。)

為了照顧旁白這個笨蛋,我們畫個圖來了解:

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

這是初始狀态,堆棧裡還沒有任何東西,那麼,現在要先把helloTable變量放到棧頂:

/* 取得table變量,在棧頂 */
    lua_getglobal(pL, "helloTable");
           

然後就變成了這樣:

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

接着,我們要取得table的name對應的值,那麼,先要做的就是把”name”字元串入棧:

/* 将C++的字元串放到Lua的棧中,此時,棧頂變為“name”, helloTable對象變為棧底 */
    lua_pushstring(pL, "name");
           

然後變成這樣:

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

(旁白:不帶這樣啊,你偷偷加上了棧的索引~!)

注意了,我把棧的索引也加上了,因為我們即将要使用,這次我們用負數索引(不了解負數的索引的朋友請閱讀第03章的教程哈~)。

由于”name”的入棧,現在helloTable變量已經不在棧頂了。

接着,我們調用要做最重要的一步了,取得name在table中對應的值:

/* 
        從table對象尋找“name”對應的值(table對象現在在索引為-2的棧中,也就是目前的棧底),
        取得對應值之後,将值放回棧頂
    */
    lua_gettable(pL, -2);
           

此時,棧變成這樣:

【木頭Cocos2d-x 029】Lua篇(第04章):來點高難度的,擷取Lua表結構資料

(旁白:發生什麼事?為什麼“mutou”突然出現在棧頂?!為毛!是你自己畫上去的吧!)

lua_gettable倒底做了什麼事情?

首先,我們來解釋一下lua_gettable的第二個參數,-2是什麼意思,-2就是剛剛helloTable變量在棧中的索引。

然後,Lua會去取得棧頂的值(之前的棧頂是”name”),然後拿着這個值去helloTable變量中尋找對應的值,當然就找到”mutou”了。

最後,Lua會把找到的值入棧,于是”mutou”就到了棧頂了。

(旁白:你妹紙的。。。沒事,我就罵罵人)

最後我們隻需要取出棧頂的資料就可以了,完整代碼如下:

/* 初始化 */
    lua_State* pL = lua_open();
    luaopen_base(pL);

    /* 執行腳本 */
    luaL_dofile(pL, "helloLua.lua");

    /* 取得table變量,在棧頂 */
    lua_getglobal(pL, "helloTable");

    /* 将C++的字元串放到Lua的棧中,此時,棧頂變為“name”, helloTable對象變為棧底 */
    lua_pushstring(pL, "name");

    /* 
        從table對象尋找“name”對應的值(table對象現在在索引為-2的棧中,也就是目前的棧底),
        取得對應值之後,将值放回棧頂
    */
    lua_gettable(pL, -2);

    /* 現在表的name對應的值已經在棧頂了,直接取出即可 */
    const char* sName = lua_tostring(pL, -1);
    CCLOG("name = %s", sName);
           

好了,本章到此結束。

.