LuaPlus的使用

看大家都在研究lua,也參與大潮中。。。折騰半天沒折騰好,相當的無語時候,網上找的資料都是你抄寫我,我抄襲他的。。

鬱悶,只要邊抄襲邊修改,最後測試成功,整理一個完整的資料發表下。再次感謝“雪明”與一個不知名的網友文章,不知道原作者,也就不發鏈接了。

如何編譯

1.下載

首先到官方網站下載: http://www.luaplus.org/

下載這個: All source code: https://github.com/jjensen/luaplus51-all (我當前的版本,當然越新越好);請在這裏下載:http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip

2.剝離

解開下載包,打開 \LuaPlus51_Build1100\Src\LuaPlus 裏面是全部源文件,src下是lua的源文件.這裏有個令人疑惑的地方,源文件中帶了一些不需要的文件,要剔除去,基本上需要以下這些文件:

1)Lua庫文件:

lapi.c

lapi.h

lauxlib.c

lauxlib.h

lbaselib.c

lcode.c

lcode.h

ldblib.c

ldebug.c

ldebug.h

ldo.c

ldo.h

ldump.c

lfunc.c

lfunc.h

lgc.c

lgc.h

linit.c

liolib.c

llex.c

llex.h

llimits.h

lmathlib.c

lmem.c

lmem.h

loadlib.c

lobject.c

lobject.h

lopcodes.c

lopcodes.h

loslib.c

lparser.c

lparser.h

lstate.c

lstate.h

lstring.c

lstring.h

lstrlib.c

ltable.c

ltable.h

ltablib.c

ltm.c

ltm.h

lua.h

luaconf.h

lualib.h

lundump.c

lundump.h

lvm.c

lvm.h

lzio.c

lzio.h

print.c

2)LuaPlus頭文件:

auxiliar.h

LuaAutoBlock.h

LuaCall.h

LuaFunction.h

LuaHelper.h

LuaHelper_Object.h

LuaHelper_StackObject.h

LuaLink.h

LuaObject.h

LuaObject.inl

LuaPlus.h

LuaPlusCD.h

LuaPlusFunctions.h

LuaPlusInternal.h

LuaStackObject.h

LuaStackObject.inl

LuaStackTableIterator.h

LuaState.h

LuaState.inl

LuaStateOutFile.h

LuaTableIterator.h

luathread.h

pt.h

srm.h

3)LuaPlus源文件

LuaCall.cpp

LuaObject.cpp

LuaPlus.cpp

LuaPlusAddons.c

LuaPlusFunctions.cpp

LuaPlus_Libs.cpp

LuaStackObject.cpp

LuaStackTableIterator.cpp

LuaState.cpp

LuaStateOutFile.cpp

LuaState_DumpObject.cpp

LuaTableIterator.cpp

lwstrlib.c

用vs2005打開LuaPlus.vs2005.vcproj默認加載以後,選擇release模式編譯。。會在http://www.cnblogs.com/lib/win32生成庫lib文件LuaPlus_1100.lib與http://www.cnblogs.com/Bin目錄生成LuaPlus_1100.dll.

新建一個工程文件.來測試.將LuaPlus_1100.dll,LuaPlus_1100.lib拷貝到目錄下。

#include <stdio.h>

--------------------------------------------------------------------------------------------------------------------------
#include "F:\程序源碼\visual C++ code\lua\LuaPlus51_Build1100\Src\LuaPlus\luaPlus.h" //luaPlus頭文件
#pragma comment(lib,"LuaPlus_1100.lib") //庫文件
using namespace LuaPlus;

--------------------------------------------------------------------------------------------------------------------------

void main()
{
LuaStateOwner state;

int iret = state->DoFile("test.lua");

int mytest = state->GetGlobal("health").GetInteger();
LuaFunction <float> Add = state->GetGlobal("Add");
float myRet = Add(3.14f,5.25f);

getchar();
}

注意

healtth = 100;

function Add(int x,int y)
return x + y;
end

這樣是錯誤的,當有語法錯誤時候,會導致DoFile返回值爲1.即返回錯誤。

測試結果,有一個問題DoString("print('不顯示???')");執行以後並沒有打印。。

測試成功以後,在D盤新建sdk\luaplus目錄

目錄下新建include與lib文件夾,將luaplus/src目錄下的文件拷貝到include目錄,將lib庫文件拷貝到lib目錄。

修改頭文件包含信息,編譯出來的文件需要打包帶上LuaPlus_1100.dll文件。

--------------------------------------------------------------------------------------------------------------------------

#include <LuaPlus.h>
#pragma comment(lib,"LuaPlus_1100.lib")
using namespace LuaPlus;

--------------------------------------------------------------------------------------------------------------------------

下面發一下轉載的用法:

如何使用

接着講講如何在你的其他項目中使用LuaPlus.

1.必要的配置

你的項目可能是這樣的:

設置GameClient的依賴項是LuaPlusLib

#include "LuaPlus.h"

using namespace LuaPlus;

記得幹這事…


2.創建一個狀態

LuaStateOwner state;

今後的操作都圍繞這個state


3.執行腳本

int iret = state->DoFile("test.lua");

返回值爲0表示成功,否則不成功.


4.C++中獲取Lua腳本的變量

假設你的test.lua中有:

health = 200;

通過下列方法就可以在C++中得到這個數值

int mytest = state->GetGlobal("health").GetInteger();


5.C++中調用Lua腳本里的函數

假設你的test.lua中有:

function Add(x, y)

return x+y;

end

在C++中需要先聲明這個函數:

LuaFunction<float> Add = state->GetGlobal("Add");

這樣你就有了Add()這個函數,然後就可以像平常一樣使用它了:

float myret = Add(3.14f,5.25f);


6.Lua腳本中調用C++函數

在讀取test.lua之前要先把C++函數註冊到Lua的運行時棧裏,這樣在執行lua腳本的時候,才知道執行哪一個函數:

首先有函數:

int LS_PrintNumber(LuaState* state)

{

LuaStack args(state);


if (args[1].IsNumber()) {

printf("%f\n", args[1].GetNumber());

}

return 0;

}

然後註冊這個函數到Lua:

state->GetGlobals().Register("PrintNumber", LS_PrintNumber);

這樣就把LS_PrintNumber映射爲Lua中可以使用的函數PrintNumber.

Test.lua腳本中添加調用語句:

PrintNumber(30);

當state->DoFile("test.lua");執行的時候,就執行了C++中的這個函數.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章