金橋科普  
設為首頁 關于我們 郵箱登錄
科普聚焦
您現在的位置: 首頁 >> 科普頻道 >> 電腦遊戲 >> 文章詳情
lua C_API 的 c++封裝

ACGFan gameres 2006-09-30
自制 lua C_API 的 c++封裝

自己封裝了一套lua的c++封裝庫(5.1),優點是上手極容易,而且只有頭文件(pure-.h),易于安裝,可在vc8下編譯通過。現在發一個示例:

 

 

//CPP
#include <iostream>

#include ".DxLua.h"//唯一需要include的頭文件

using namespace std;

namespace Test{
struct test_t
{
  int n;
  const test_t* ft(test_t& r){cout<<"f(test_t* r)n";r.n = 55;return this;}
};
}

//完成c++類到lua的映射,在任意cpp文件內定義一次即可(不可重復定義)
BEGIN_CLASS2LUA(::Test::test_t)
LUA_METHOD(ft)
END_CLASS2LUA

void my_print(int v)
{
  cout<<"my_print:"<<v<<endl; 
};

int __cdecl main()
{
  using namespace Dx;
  using namespace Dx::Lua;

  try{
    Domain d;

    d.global["print"] = FUN2LUA(my_print);//可以替換庫自帶的print,FUN2LUA是宏

    d.LoadFile("Test.lua");

    Test::test_t t1 = {0},t2 = {0}; 
    Reference run_host(d.global["run_host"]);//Reference類指向任意lua對象

    run_host(UDT(t1),UDT(t2));//用戶自定義類型用UDT作wrap
    cout<<t2.n<<endl;

    d += "run_host = function(t1,t2)t2:ft(t1) print(888) end";

    run_host = d.global["run_host"];
    run_host(UDT(t2),UDT(t1));

    for(TableRange<> rg(d.global["the_table"]);rg;++rg)//TableRange 作用相當于 iterator 用于遍歷一個表
    {
      string k;
      Set(k) = rg.key;//從lua中讀取變量
      cout<<k<<" : "<<(*rg).TypeName()<<endl;
    }

    string tmp;
    Set(tmp) = d.global["the_name"];
    cout<<tmp<<endl;
    Set(tmp) = d.global["the_table"]["name"];
    cout<<tmp<<endl;
    Set(tmp) = d.global["the_table"]["get_name"]("left","right");
    cout<<tmp<<endl;
    Reference newtb(d.global["make_table"]());
    Set(tmp) = (newtb->*newtb["fun"])();// = newtb:f();
    cout<<tmp<<endl;
  }
  catch(Lua::ScriptError& e)
  {
    cerr<<"n!!!catch a scrpt error:n"<<e.what();
  }
 return 0;
}

//Test.lua
the_table = {
[1] = {},
name = "Eri",
fun = function(t)
t.name = t.name.."Sch"
end,

sub_table = 
{
name = "Iori"
},
get_name = function(str1,str2)
return str1.." + "..str2
end,
get_pair = function(str1,str2)
return str1.." 1+ "..str2,str2.." 2+ "..str1
end,
name_test = "NaNi",
number_test = 54.6
}

the_name = "Slash"

function make_table()
t = 
{
name = " as it ",
fun = function(o)
o.name = o.name.." + "
return o.name
end
}
return t
end

function run_host(t1,t2)

t = t1:ft(t2)
t:ft(t1)
end

輸出
f(test_t* r)
f(test_t* r)
55
f(test_t* r)
my_print:888
number_test : number
 : table
name : string
get_pair : function
name_test : string
get_name : function
sub_table : table
fun : function
Slash
Eri
left + right
 as it  +

我看過不少庫,最完善的屬配boost的lua-bind,但是其太笨重。該庫的大部分功能本庫都有,而且本庫輕巧的多。
目前,國內的封裝,厚著臉說,我還沒見到更好的,如果哪位見到國內更勝于此的,請告訴我,以便見賢思齊。另外如果對此有興趣的人多,我會把全部代碼放出來的。

本庫還有改進餘地,若各位有其他期待請大膽提出。


  發表評論 寫信給編輯 關閉窗口
同欄目內容
· 瑞典在網遊中開設虛擬大使館 2007-06-06
· 魔獸爭霸3秘籍(魔獸無敵秘籍) 2007-03-28
· FreeType的教程代碼 2006-09-30
· XNA2D入門 2006-09-30
· 第一次Collision AI 2006-09-30
· OpenGL GUI教程(一)2 2006-09-11
相關內容
近期主推
西藏發現青藏高原最大冰川群
·西藏發現青藏高原最大冰川群
·中日: "月亮女神"攜手"嫦娥"
·行星大碰撞砸死恐龍催生人類
·美研制會飛汽車定價9萬美元
·美國教授設計出自適應機器人
·銀河系可能有20多個黑洞
近期熱門
英海域驚現大龍蝦為普通龍蝦5倍
·英海域驚現大龍蝦為普通龍蝦5倍
·新物種金蛙體表有劇毒
·我國嫦娥工程計劃測量月球
·精神病藥物可治多種癌症
·視覺震撼:來自海底的精靈
·能刪除不良記憶的藥物誕生
近期焦點
廣西發現罕見溶洞鐘乳石有30萬年
·廣西發現罕見溶洞鐘乳石有30萬年
·澳大利亞驚現“卡布基諾”海灘
·美國"彩色"瀑布夜幕下震撼遊人
·地球上究竟有多少個物種
·英國探險家北極遊泳破紀錄
·世界之最 世上最小的動物
金橋科普是一個公益性欄目,內容由作者提供或摘自互聯網,其目的是向廣大網民普及科學技術知識。如果您發現本網站轉載或摘編了您擁有著作權的作品,請通知我們(電話:023-63659911),我們立即刪除。
關于我們 | 網站地圖 | 用戶注冊 | 廣告客戶 | 招聘信息 | 業務信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重慶科技咨詢中心.重慶網得信息技術有限公司.版權所有
Email:webmaster@jqinfo.com
重慶數據通信局提供網絡帶寬. 渝ICP備05002327號