正文:
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...