[lua]Lua筆記

下午主要是看了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

 

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