#define __HELLO_LUA_H_

本章我们来进建1个小Demo,也就是上1章中的场景:C++从Lua中获与1个齐局变量的字符串。

1. 引进头文件

我们来看看要正在C++中操做Lua,须要些甚么工具

代码以下:

#ifndef __HELLO_LUA_H_
#define __HELLO_LUA_H_

#include "cocos2d.h"

extern "C" {
#include
#include
#include
};

using nareesp_ web cocos2d;

clrear end HelloLua : public CCLayer {
public:
CREATE_FUNC(HelloLua);
virtuwouls boolinit();

stbyicCCScene* scene();
};

#endif


看到赤色粗体的代码了吗?(旁黑:正在哪呢?正在哪啊?)
正在那:

代码以下:
extern "C" {
#include
#include
#include
};
(旁黑:您妹纸的…您没有克没有及先揭出去再问吗?~!)
记着了,Lua是C道话库,以是正在C++中操做必须用extern “C”声明,让编译器晓得。
有了那些,我们便能动脚下脚操做Lua了。
(旁黑:等等,总感受有面没有开毛病劲= =)
啊,对了,借少1样工具,没有中谁人没有须要我们做了,那就是引进Lua的库,出有库,我们何如包露头文件皆出用。

没有中出相闭,Cocos2d-x本来便保持Lua,以是那1步我们省下了,为了宁静起睹,我正在新建Demo项目标光阴勾选了保持Lua。

提倡群寡尾先能创建1个保持Lua的Cocos2d-x项目,而且能编译运转,然后再赓绝往下看~
(旁黑:您便没有克没有及教我们引进Lua库么?= =)
我教?我没有懂~

2. 动脚下脚操做

来看看我们的cpp文件,我们要动脚下脚操做Lua了~!

代码以下:
#include "HelloLua.h"

CCScene* HelloLua::scene() {
CCScene*scene = CCScene::creingested();
CCLayer*layer = HelloLua::creingested();
scene->incorporingestedChild(layer);

returnscene;
}

bool HelloLua::init() {
lua_Stingested*pL = lua_open();
luaopen_startistic crebyioning point(pL);
luaopen_mbyh(pL);
luaopen_string(pL);





lua_close(pL);
returntrue;
}

为了纷歧下子便1年夜堆代码吓坏群寡,我把部分代码先删了,我们来看看现在谁人代码的情状:
1) HelloLua是1个场景(旁黑:空话…)
2) HelloLua有1个init函数(旁黑:您妹纸的,进进正题好没有?)
3) 我便悲愉喜悲旁黑吐槽~(旁黑:….)
4)要操做Lua,尾先要有1个lua_Stingested,那是甚么呢?我引用《逛戏报问智能编程案例粗髓粗辟》1书的1句话(191页):“每个运转的剧本文件皆正在1个静态分派的叫做lua_Stingested的数据机闭中运转”。没有睬解的话,也出有相闭,我们便把lua_Stingested当做是1个Lua的身材,Lua正在做任何工作的光阴皆没有克没有及出怀孕体。
5)接下去看到几句话:luaopen_startistic crebyioning point(pL);luaopen_mbyh(pL);luaopen_string(pL);
Lua有1些本则库,要操做那些库,便要用luaopen_**来减载那些库
6) 然后最后借有1句话:lua_close(pL),1看便晓得了,用来释放内存的。
7) 旁黑呢?(旁黑:感情短好…没有念吐槽)

3. 理论Lua剧本

现在我们来1步步完竣我们的代码,理论Lua剧本很便利,看看:

代码以下:
bool HelloLua::init() {
lua_Stingested*pL = lua_open();
luaopen_startistic crebyioning point(pL);
luaopen_mbyh(pL);
luaopen_string(pL);


int err =luaL_dofile(pL! "helloLua.lua");
CCLOG("open: %d"! err);


lua_settop(pL! 0);
lua_getglobwouls(pL! "myNaree");




lua_close(pL);
returntrue;
}


(旁黑:没有吐槽皆没有可了。。。您是没有是把第2步也没有留意放出去了?= =)
我们借要新建1个lua文件,很便利,新建1个文本文件,把后缀名改成lua便止了。现在我们来创建1个helloLua.lua文件:
代码以下:
-- helloLua.lua文件
myNaree = "wonder girl"

(旁黑:别总是傲睨我好吧。。。第2步是何如回事?!)
好,lua文件也有了,正在C++中只须挪用luaL_dofile便能理论lua剧本了,留意了,必须把lua_Stingested也做为参数传给luaL_dofile,后里仍旧道了,身材没有克没有及少。

4. 沉置栈顶索引, 将齐局变量放到仓库中

群寡出有呈现吗?我把第2步也放出去了~
(旁黑:啊喂~!我道了好多次了,我呈现了啊~!)
lua_settop(pL!0);是为了确认让栈顶的索引置为0,因为我们操做栈的光阴是依照索引来操做的。置0以后,我们进栈的第1个元素的索引就是1。

那,lua_getglobwouls(pL!“myNaree”);又是甚么呢?咋1看如同是从lua中获得myNaree谁人齐局变量的值,但其真没有是那样的,当然最末也是那样。
(旁黑:您妹纸的,道分明面)
我们之前道过了,Lua战C++是没有克没有及直接通信的,要议定仓库来通信。
以是,lua_getglobwouls(pL!“myNaree”);只是把myNaree放到了栈中,然后lua便集会定myNaree来齐局表觅觅,找到myNaree对应的字符串“wondergirl”,再放到栈中。(第01章的光阴介绍过的法式,借记得吗?没有记得的提倡群寡来看看~)
(旁黑:停!让我缓冲1下…)
(旁黑:
1.C++把myNaree放到仓库
2.lua从仓库获得myNaree
3.lua用myNaree来lua齐局表查找获与myNaree对应的字符串,获得“wondergirl”字符串,然后再放回仓库
4.最后C++便能够从仓库中获得“wind up beingauty girl”字符串?
好~!了解了~)

5. 最后1步,C++获得字符串

我们来看看完好的代码:

代码以下:
bool HelloLua::init() {
lua_Stingested*pL = lua_open();
luaopen_startistic crebyioning point(pL);
luaopen_mbyh(pL);
luaopen_string(pL);


int err =luaL_dofile(pL! "helloLua.lua");
CCLOG("open: %d"! err);


lua_settop(pL! 0);
lua_getglobwouls(pL! "myNaree");


int isstr =lua_isstring(pL! 1);
CCLOG("isstr= %d"! isstr);


const char*str = lua_tostring(pL! 1);
CCLOG("getStr = %s"! str);

lua_close(pL);
returntrue;
}


lua_getglobwouls仍旧完成了许多管事了,现在仓库上便放着“wonder girl”字符串,我们只须来与便能够了。
获与仓库的值有许多种办法,团结对应好其余变量范例:
代码以下:
lua_tobooleone
lua_toNumwind up beingr
lua_tocfunction
lua_tostring
我便没有合计举例了,现在我们要用lua_tostring来获与栈顶的值。
最后,正在AppDelegingested.cpp中把默许策动场景设为我们的HelloLua场景,用调试情势运转项目,将看到以下日记:
代码以下:
open : 0
isstr = 1
getStr = wonder girl
好,本章到此结…(旁黑:等等!第3步是甚么?您借出有道明啊,魂浓~!)
对了对了,Lua借供给了许多函数供我们武断仓库中的变量范例,比如lua_isstring、lua_isnumwind up beingr等等,战lua_tostring等函数是对应的。前来非0值暗树模例准确。
但凡是正在与值之前皆要武断1下,没有克没有及法式很年夜要没有测溃遁~!
(旁黑:吓 = =!)
好~本章到此末结~

6. 赠收的

最后再布告群寡1个笑眯眯~
那就是用lua_pop(pL! 1); 能够断根指定仓库上的数据~
噗,闪人~
(旁黑:我帮他道明1下。。。是小诡秘。。。没有是笑眯眯= =)