1. 程式人生 > >cocos2d-x 3.x C++和Lua通訊方式:Lua堆疊正數索引和負數索引的關係和用法

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));

執行結果依然相同。