精華區beta GameDesign 關於我們 聯絡資訊
最近寫一個商業軟體,因為有用到Lua,所以趁機學學Lua然後寫寫教程, 而之前的小形線上遊戲部份,因為時間上太趕,架構規劃不夠好, 所以就先暫時擺著,等到有時間再來慢慢做,否則做出太爛的東西連我自己都受不了= =。 首先介紹到Lua http://zh.wikipedia.org/wiki/Lua 這是維基百科的Lua介紹,因為Wow的巨集和User Interface的腳本語言,用的都是Lua 經過Wow的使用後,名聲更是響亮,相信大家應該有聽過,而它執行速度快 還可以編譯,可以用C擴充,使用上簡單等等很多優點讓它如此受歡迎,當然,它是免費的 這點更是重要 XD 而Lua的資源,最重要的當然就屬官方網站 Lua的官方網站 : http://www.lua.org 官方網站的Manual : http://www.lua.org/manual/5.1/ 官方的Book Porgramming in Lua : http://www.lua.org/pil/ 官方的Lua下載 : http://www.lua.org/download.html 其實要學Lua,上面的幾個網址就很夠用了,但是我希望能夠以比較直覺的方式 寫成比較入門的教程,因為我也正在學習,所以有錯的地方請指出來 Lua在遊戲中的應用範圍相當廣,因為它是嵌入式的語言,所以在遊戲中使用Lua 可以讓遊戲更加模組化,例如AI,就可以由Lua來撰寫,而讓使用者自行製做巨集 也可以使用Lua,劇情的部份,也可以交給Lua,網路連線處理的部份,也可以 交給Lua,總而言之,只要交給Lua的部份,都可以很輕易的模組化,可以說相當方便 如果要走火入魔一點,我有想過整個遊戲引擎就基於Lua之上也是可以XD (如果有時間的話,來寫一個基於Lua的戀愛養成引擎,應該還蠻有趣的 XD) 嗯,知道了Lua是那麼好玩那麼有趣那麼有用的東西之後,廢話不多說 我們來看Lua的第一個程式,這個程式需要include一些檔案,和link lib 這些請自行到Lua官網尋找並編譯或安裝 /////////////////////////////////// #include <iostream> extern "C"{ #include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> } int main (void) { // 開啟Lua lua_State *pLua = lua_open(); if(!pLua){ std::cerr << "Failed to open Lua"<< std::endl; return EXIT_FAILURE; } // 啟動函式庫 luaopen_base(pLua); luaopen_table(pLua); luaopen_string(pLua); luaopen_math(pLua); luaopen_io(pLua); int Result; // 載入Lua檔 Result = luaL_loadfile(pLua,"hello.lua"); if(Result){ std::cerr << "Failed to load file"<< std::endl; return EXIT_FAILURE; } // 執行整個Lua檔 Result =lua_pcall(pLua, 0, 0, 0); if(Result){ std::cerr << "Failed to run lua"<< std::endl; return EXIT_FAILURE; } lua_close(pLua); return 0; } //////////////////////////////// -- This is my first lua programming print("Hello world! Hello Lua!") ///////////////////////////////// 上面的部份是C++的主程式,下面的部份是hello.lua,注意到Lua的註解是 -- 後面的文字,而print是在畫面上印出東西來,Lua語言的行末不用加; 接著我們來看C++主程式,首先是include的部份,Lua因為是用純C語言寫的 因為我們必需告訴編譯器Lua的.h檔當做C來處理,因為純C寫的有個好處 就是幾乎什麼語言都可以使用,Lua除了可以在C使用外,好像也可以在其它 很多語言中使用,這也是優勢之一 接著是lua_open,也就是開啟一個Lua的Handle,接下來的操作都通過這個handle // 啟動函式庫 luaopen_base(pLua); luaopen_table(pLua); luaopen_string(pLua); luaopen_math(pLua); luaopen_io(pLua); 而這些部份,是啟動Lua內建的函式庫,或許你會覺得很奇怪,為什麼不一開始 就把所有功能一次都啟動就好,這是因為,Lua通常是給使用者使用的, 你應該不會想看到使用者在你遊戲的巨集裡使用檔案IO去存去電腦裡的檔案 除此之外,一些沒有用到的功能你也可以選擇不去開啟它 然後是載入Lua檔,載入我們的第一個Lua程式,Hello.lua // 執行整個Lua檔 Result =lua_pcall(pLua, 0, 0, 0); if(Result){ std::cerr << "Failed to run lua"<< std::endl; return EXIT_FAILURE; } 而這個部份,使用lua_pcall後面填入三個0,讓Lua整個跑過一次, 這個函式主要是用來呼叫Lua的函式用的,如果你要呼叫某個 你在Lua程式裡定義的函數,先讓Lua執行過一次之後 Lua才會認識這些函式或全域變數之類的 lua_close(pLua); 最後,我們不再使用Lua Handle了,該是把資源釋放的時候了 第一個Lua程式就這樣完成了,其實並不會太難,只是技術文件不少= =" 看起來還蠻吃力的,還有Lua程式碼的寫法和其它語言不太一樣 所以剛開始寫會一直想打;在行末之類的 XD 以上,第一個教程結束了 -- VICTOR工作室 | PTT遊戲設計版隆重開幕! | 不管是新手老手,程式美工音樂企劃.... URL : http://www.kinmen.info/vic/ | 都歡迎來遊戲設計版參與討論 XD | 戰略高手> C/C++ | GameTopics> Visual Basic 6.0 | GameDesign -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.116.64.252 > -------------------------------------------------------------------------- < 作者: asoedarren (別再咪我) 看板: GameDesign 標題: Re: [程式] Lua教程 : 第一個Lua程式 時間: Wed Aug 9 01:24:53 2006 如果要跟c++作binding可能需要用到lua wrapper之類的lib http://0rz.net/511Hj 這邊的資源還蠻多的 板主可以推薦比較好用的free lua IDE嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.117.77.64
StubbornLin:LuaEdit 我目用的是這個= =" 其它的我就不清楚了 08/09 01:29
StubbornLin:大至上還算蠻好用的 08/09 01:29
StubbornLin:還有,這種東西基本上我還是比較喜歡用官方的版本= =" 08/09 01:31
StubbornLin:因為那種第三方的,問題通常很多,更新也慢 08/09 01:32
StubbornLin:資源也不如官方來得多,所以還是用純C的版本就好 08/09 01:33
asoedarren:可是lua要binding c++ class 似乎有難度 或是現在有好ꨠ 08/09 01:42
asoedarren:的解決方法? 不然很難用在OO的架構上 08/09 01:43
StubbornLin:等等@@ 你說的binding c++ class是指什麼意思? 08/09 10:11
StubbornLin:可不可以舉個例子 08/09 10:11
> -------------------------------------------------------------------------- < 作者: asoedarren (別再咪我) 看板: GameDesign 標題: Re: [程式] Lua教程 : 第一個Lua程式 時間: Wed Aug 9 15:23:52 2006 參考這個 http://www.chinadv.com/yxzz/zzjs/200411/1714.html 代碼封裝 [CPB] (5.0)(Win32) - C++ 和 Lua連接之橋,實現兩種語言的相互通信. [CaLua] (5.0) - 實現了綁定C函數和結構體到Lua,可以在Lua中使用C指針、數組、函數 。(使用x86結構的計算機) [CppLua] (5.0) - lua API的C++封裝。 [lua2c] (5.0) - 將Lua代碼轉換成C代碼的工具. [luabind] (5.0) - 基於模板的,綁定Lua和C++類以及函數 [tolua] (5.0) - 自動綁定C/C++和Lua的工具. LuaWrapper 基於模版的封裝包,很容易綁定C++代碼和Lua。純頭文件。 [tolua++] (5.0) - tolua的高級版本,帶有c++面向對象的特徵. ( CompilingToluappWithoutScons i.e., Compiling Tolua++ Without SCons ) 之前po的網址 代碼封裝的部份 大多數都是跟c++作橋接 ※ 引述《asoedarren (別再咪我)》之銘言: : 如果要跟c++作binding可能需要用到lua wrapper之類的lib : http://0rz.net/511Hj : 這邊的資源還蠻多的 : 板主可以推薦比較好用的free lua IDE嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.240.182.61
StubbornLin:喔喔喔! XD 沒想到居然那麼好用的樣子 08/09 23:36
StubbornLin:我還以為只是操作對向變成class而以 08/09 23:38
StubbornLin:沒想到有很多直接對C++的支援還蠻方便的 XD 08/09 23:38
StubbornLin:有空時我去看他的C++寫法好了 XD 08/10 00:00
StubbornLin:沒想到居然還可以這樣做,學到這種東西總覺得很有趣 08/10 00:01
StubbornLin:不過LuaWrapper的連結好像掛光光了 囧rz.... 08/10 00:17