看板 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