作者StubbornLin (Victor)
看板GameDesign
標題[程式] Lua教程 : 第一個Lua程式
時間Tue Aug 8 22:40:19 2006
最近寫一個商業軟體,因為有用到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