cocos2d-x 3.x C++和Lua通訊方式:Lua堆疊正數索引和負數索引的關係和用法
用cocos2d-x 編寫遊戲的過程中,我們很可能會用到Lua檔案。引用一本書上面的話,Lua最大的優勢在於,不用重新編譯專案就可以修改遊戲邏輯,大大縮減了開發程序。我用的是cocos2d-x 3.x引擎,使用C++語言編寫程式。C++和Lua之間的通訊是通過Lua堆疊實現的。通訊流程如圖所示:
Lua堆疊索引如圖:
索引分為正數索引和負數索引。正數索引的棧底索引值永遠是1,負數索引的棧頂索引值永遠是-1.
下面給出具體程式展示如何使用索引值:
第一步,新建一個helloLua.lua檔案放在工程目錄下面。helloLua.lua內容如下:
myName="hello Lua"
ID=2
helloTable={name="Lua",IQ=125}
function helloAdd(num1,num2)
return (num1+num2)
end
第二步:在cocos2d-x工程中新建一個類helloLua,.h檔案和.cpp檔案內容如下:
-----helloLua.h檔案
#ifndef _HelloLua_H_
#define _HelloLua_H_
extern"C"{
#include<lua.h>
#include<lualib.h>
#include<lauxlib.h>
};
#include"cocos2d.h"
USING_NS_CC;
class HelloLua :public Layer
{
public:
CREATE_FUNC(HelloLua);
virtual bool init();
static Scene*createScene();
};
#endif
-----helloLua.cpp檔案內容如下:
#include"HelloLua.h"
Scene* HelloLua::createScene()
{
auto scene = Scene::create();
auto layer = HelloLua::create();
scene->addChild(layer);
return scene;
}
bool HelloLua::init()
{
lua_State*pL = lua_open();
luaopen_base(pL);//
luaopen_math(pL);
luaopen_string(pL);
luaL_dofile(pL, "helloLua.lua");
lua_settop(pL, 0);
lua_getglobal(pL, "myName");
log("myName=%s", lua_tostring(pL, -1));
lua_getglobal(pL, "ID");
log("ID=%s", lua_tostring(pL, -1));
log("myName=%s", lua_tostring(pL, -2));
lua_close(pL);
return true;
}
程式輸出:myName=hello Lua
ID=2
myName=hello Lua
加入使用正數索引,上面紅色的程式碼改成:
lua_getglobal(pL, "myName");
log("myName=%s", lua_tostring(pL, 1));
lua_getglobal(pL, "ID");
log("ID=%s", lua_tostring(pL, 2));
log("myName=%s", lua_tostring(pL, 1));
輸出結果一樣。
每次的結果都會儲存在堆疊中。假如使用正數索引,第一個入棧的索引是1,接下來是2,3....。假如使用負數索引,最後一個入棧的索引是-1,之前一個是-2,-3....
正數索引和負數索引也可以混合使用,比如:上面的紅色程式改為:
lua_getglobal(pL, "myName");
log("myName=%s", lua_tostring(pL, 1));
lua_getglobal(pL, "ID");
log("ID=%s", lua_tostring(pL, -1));
log("myName=%s", lua_tostring(pL, 1));
執行結果依然相同。