下午主要是看了lua的一些資料,搞懂了wow是怎樣使用ui和lua的.
如下:
+-------------------+ +-------------------+ +---------------+
| 用戶定義的xml | | WoW UI處理程序 | | 使用lua接口 |
| 主要定義了操作的 | | 其實主要是input |-->| 調用.lua_file |---|
| 關鍵字(key)和 | | 處理 | +---------------+ |
| lua的function |-->+-------------------+ |
| 還有核心的lua腳本 | +---------------+<------|
| 的位置 | | 用戶定義的lua |
+-------------------+ | 調用遊戲接口 |
+---------------+<--+---------------+
| game kernle |
+---------------+
還有就是一些lua調用的筆記:
Lua 與宿主語言之間的這種共生關係的核心是宿主語言是一個虛擬堆棧. 虛擬堆棧與實際堆
棧類似,是一種後進先出(LIFO)的數據結構,可以用來臨時存儲函數參數和函數結果.要從
Lua 中調用宿主語言的函數(反之亦然),調用者會將一些值壓入堆棧中,並調用目標函數;被
調用的函數會彈出這些參數(當然要對類型和每個參數的值進行驗證),對數據進行處理,然後
將結果放入堆棧中. 當控制返回給調用程序時,調用程序就可以從堆棧中提取出返回值.
..
if (luaL_loadfile(L,filename) || lua_pcall(L,0,0,0))
error(L,"cannot run configuration file: %s",lua_tostring(L,-1));
lua_getglobal(L,"width");
lua_getglobal(L,"height");
..
width = (int) lua_tonumber(L,-2);
height = (int) lua_tonumber(L,-1);
..
請再次注意傳輸是通過堆棧進行的. 從 C 中調用任何 Lua 函數與這段代碼類似: 使用
lua_getglobal() 來獲得函數,將參數壓入堆棧,調用 lua_pcall(),然後處理結果.如果 Lua
函數返回 n 個值,那麼第一個值的位置在堆棧的 -n 處,最後一個值在堆棧中的位置是 -1.
還有要注意的是貌似lua提供的庫使用的是hpp的模板...不知道怎麼用.
我這裏有一個非常有趣的範例,關於hpp怎麼用? 直接include就可以了.
這一個例子就是用來說明如何通過C語言,註冊一個static的函數到lua的虛擬機中. 然
後通過C語言調用lua中的一個函數. lua中的這個函數又會調用C語言中註冊的這個函數
#include <iostream>
#include <lua.hpp>
#pragma comment(lib,"luastatic")
using namespace std;
// 函數定義
static int l_dir(lua_State *L)
{
cout<<"第一個參數"<<luaL_checkstring(L,1)<<endl;
cout<<"第二個參數"<<luaL_checknumber(L,2)<<endl;
cout<<"hi"<<endl;
return 0;
}
static const struct luaL_reg mylib[]={
{"dir",l_dir},
{NULL,NULL}
};
int luaopen_mylib(lua_State *L)
{
luaL_register(L,"mylib",mylib);
return 0;
}
int main()
{
lua_State *L=luaL_newstate();
luaopen_mylib(L);
luaL_dofile(L,"d://test.lua");
// 調用一個函數
lua_getglobal(L,"f");
lua_pushnumber(L,2);
lua_pushnumber(L,3);
lua_pcall(L,2,1,0);
lua_close(L);
return 0;
}
--[[
lua定義出來的文件.
--]]
function f (x,y)
return mylib.dir("string",100)
-- return (x^2*math.sin(y))/(1-x)
end