Demo講解之Lua和C 牽手

2021-06-27 06:34:53 字數 4652 閱讀 9358

正文:

1. 

引入標頭檔案

我們來看看要在c++

中使用lua

,需要些什麼東西

[cpp]view plain

copy

print?

/* 檔名:    hellolua.h 

描 述:    lua demo

建立人:    笨木頭 (csdn部落格: 

建立日期:   2012.12.24 

*/#ifndef __hello_lua_h_

#define __hello_lua_h_

#include "cocos2d.h"

extern

"c";  

using

namespace

cocos2d;  

class

hellolua : 

public

cclayer ;  

#endif

看到紅色粗體的**了嗎?(旁白:在哪呢?在哪啊?)

在這:extern "c" ;

(旁白:你妹紙的...

你不能先貼出來再問嗎?~!)

記住了,lua是c

語言庫,所以在

c++中使用必須用

extern 「c」宣告,讓編譯器知道。

有了這些,我們就能開始使用lua了。

(旁白:等等,總感覺有點不對勁= =)

啊,對了,還少一樣東西,不過這個不需要我們做了,那就是引入lua

的庫,沒有庫,我們怎麼包含標頭檔案都沒用。

不過沒關係,cocos2d-x

本來就支援

lua,所以這一步我們省下了,為了保險起見,我在新建

demo

專案的時候勾選了支援

lua。

建議大家首先能建立乙個支援lua

的cocos2d-x

專案,並且能編譯執行,然後再繼續往下看~

(旁白:你就不能教我們引入lua

庫麼?= =)

我教?我不懂~

2. 

開始使用

來看看我們的cpp

檔案,我們要開始使用

lua了~!

[cpp]view plain

copy

print?

#include "hellolua.h"

ccscene* hellolua::scene()   

bool

hellolua::init()   

為了不一下子就一大堆**嚇壞大家,我把部分**先刪了,我們來看看現在這個**的情況:

1) hellolua是乙個場景

(旁白:廢話...

)2) hellolua有乙個

init

函式(旁白:你妹紙的,進入正題好不?)

3) 我就喜歡旁白吐槽~

(旁白:....

)4) 要使用lua

,首先要有乙個

lua_state

,這是什麼呢?我引用《遊戲人工智慧程式設計案例精粹》一書的一句話(191

頁):「每乙個執行的指令碼檔案都在乙個動態分配的叫做lua_state

的資料結構中執行」。不明白的話,也沒有關係,我們就把

lua_state

當成是乙個

lua的身體,

lua在做任何事情的時候都不能沒有身體。

5) 接下來看到幾句話:luaopen_base(pl);luaopen_math(pl);luaopen_string(pl);

lua有一些標準庫,要使用這些庫,就要用

luaopen_**

去載入這些庫

6) 然後最後還有一句話:lua_close(pl)

,一看就知道了,用來釋放記憶體的。

7) 旁白呢?(旁白:心情不好...

不想吐槽)

3. 執行lua

指令碼現在我們來一步步完善我們的**,執行lua

指令碼很簡單,看看:

[cpp]view plain

copy

print?

bool

hellolua::init()   

(旁白:不吐槽都不行了。。。你是不是把第2

步也不小心放出來了?

= =)

我們還要新建乙個lua

檔案,很簡單,新建乙個文字檔案,把字尾名改為

lua就行了。現在我們來建立乙個

hellolua.lua

檔案:

[plain]view plain

copy

print?

-- hellolua.lua檔案  

myname = "beauty girl"  

(旁白:別老是忽略我好吧。。。第2

步是怎麼回事?!)

好,lua

檔案也有了,在

c++中只要呼叫

lual_dofile

就能執行

lua指令碼了,注意了,必須把

lua_state

也作為引數傳給

lual_dofile

,前面已經說了,身體不能少。

4. 

重置棧頂索引, 將全域性變數放到堆疊中

大家沒有發現嗎?我把第2

步也放出來了~

(旁白:啊喂~

!我說了好多次了,我發現了啊~!)

lua_settop(pl, 0);是為了確認讓棧頂的索引置為

0,因為我們操作棧的時候是根據索引來操作的。置

0之後,我們入棧的第乙個元素的索引就是1。

那,lua_getglobal(pl, 「myname」);又是什麼呢?咋一看好像是從

lua中取得

myname

這個全域性變數的值,但並不是這樣的,雖然最終也是這樣。

(旁白:你妹紙的,說清楚點)

我們之前說過了,lua

和c++

是不能直接通訊的,要通過堆疊來通訊。

因此,lua_getglobal(pl, 「myname」);只是把

myname

放到了棧中,然後

lua就會通過

myname

去全域性表尋找,找到

myname

對應的字串「

beauty girl

」,再放到棧中。(第

01章的時候介紹過的步驟,還記得嗎?不記得的建議大家去看看~)

(旁白:停!讓我緩衝一下...

)(旁白: 1.

c++把

myname

放到堆疊

2.lua從堆疊取得

myname

3.lua用

myname

去lua

全域性表查詢獲取

myname

對應的字串,得到「

beauty girl

」字串,然後再放回堆疊

4.最後c++

就可以從堆疊中取得「

beauty girl

」字串? 

好~!明白了~)

5. 最後一步,c++

取得字串

我們來看看完整的**:

[cpp]view plain

copy

print?

bool

hellolua::init()   

lua_getglobal已經完成了很多任務作了,現在堆疊上就放著「

beauty girl

」字串,我們只要去取就可以了。

獲取堆疊的值有很多種方法,分別對應不同的變數型別:

lua_toboolean

lua_tonumber

lua_tocfunction

lua_tostring

我就不全部舉例了,現在我們要用lua_tostring

來獲取棧頂的值。

中把預設啟動場景設為我們的

hellolua

場景,用除錯模式執行專案,將看到以下日誌:

open : 0

isstr = 1

getstr = beauty girl

好,本章到此結...

(旁白:等等!第3

步是什麼?你還沒有解釋啊,魂淡~!)

對了對了,lua

還提供了很多函式供我們判斷堆疊中的變數型別,比如

lua_isstring

、lua_isnumber

等等,和

lua_tostring

等函式是對應的。返回非

0值表示型別正確。

一般在取值之前都要判斷一下,不能程式很可能意外崩潰~!

(旁白:嚇 = =!)

好~本章到此結束~

6. 

贈送的

最後再告訴大家乙個笑眯眯~

那就是用lua_pop(pl, 1); 

可以清除指定堆疊上的資料

~

使用lua指令碼操作redis之demo

使用lua指令碼操作redis資料的乙個demo,只是為了入門,以後還會深入.set.lua,redis的set命令使用 redis set key val local key keys 1 local val argv 1 return redis.call set key,val set.lua...

c 呼叫指令碼語言Lua 簡單Demo

c 呼叫指令碼語言lua 簡單demo 混合模式程式集是針對 v2.0.50727 版的執行時生成的,在沒有配置其他資訊的情況下,無法在 4.0 執行時中載入該程式集。呼叫步驟 1.宣告lua虛擬機器 lua m lua new lua 2.將c 的物件方法註冊到lua中,使lua可以呼叫該方法。c...

Lua與C 互動初探之C 呼叫Lua

lua與c 互動初探之c 呼叫lua 一 lua環境的搭建 他包括以下元件 lua examples 包含lua使用的一些例子。luaforwindows documentation luaforwindows這款軟體的一些說明 quickluatour lua快速入門嚮導,沒什麼用,看看就好 do...