《來献汗,我們一起寫個(gè)角色扮演游戲》系列教程
本章內(nèi)容共分三節(jié):安裝C編譯器敢订,安裝SDL庫,用makefile管理項(xiàng)目罢吃。內(nèi)容較多楚午,一定要保持耐心,后面越來越有意思尿招。
安裝C編譯器
安裝gcc(clang也可以矾柜,用法和gcc差不多)。如果你使用Debian/Ubuntu Linux就谜,可能要安裝 build-essential
這個(gè)包來安裝gcc怪蔑、make等工具。當(dāng)然丧荐,有的Linux發(fā)行版安裝完就帶了gcc
和make
缆瓣。
如果你在windows上使用MinGW,確認(rèn)安裝了gcc和make虹统。如果需要debug程序弓坞,還要安裝gdb隧甚。別忘了把MinGW的bin
目錄加入windows的路徑(環(huán)境變量PATH)中,如果你只在msys的命令行窗口中編譯程序渡冻,這一步可以省略戚扳。因?yàn)槲蚁矚g在Emacs編譯器中調(diào)用gcc和make,所以我習(xí)慣把它們加入路徑族吻。
在終端輸入 gcc
帽借,回車。如果安裝成功呼奢,會(huì)看到類似下面的信息宜雀。
gcc: fatal error: no input files
compilation terminated.
本教程假設(shè)你有了C編程的基礎(chǔ)切平,如果你還沒有接觸過C語言握础,可以找個(gè)C語言入門教程學(xué)習(xí)一下。這是絕對值得學(xué)的語言悴品,大多數(shù)操作系統(tǒng)都是C寫的禀综,大多數(shù)編程語言也是用C實(shí)現(xiàn)的。
下面我們寫第一個(gè)C程序苔严。
Program1: Hello, RPG
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello, Role Play Game!\n");
return 0;
}
這是一個(gè)最簡單的C程序定枷。main
是一個(gè)C程序的入口函數(shù),即不管它放在什么位置届氢,程序都將從main
開始執(zhí)行欠窒。參數(shù)argc
是命令行參數(shù)的個(gè)數(shù),argv
是存放命令行參數(shù)的字符串?dāng)?shù)組退子。以后我們可能會(huì)用到命令行參數(shù)岖妄,現(xiàn)在我們我不用理會(huì)它們。printf("Hello, Linux Game!\n");
將輸出 Hello, Linux Game!
寂祥。
將上述代碼保存為 main.c
(或者你想叫的其它文件名荐虐,但最好以.c
為后綴名),然后 用gcc -o game main.c
編譯main.c
丸凭。-o game
表示輸出的執(zhí)行文件名是game
福扬,在windows下,會(huì)生成game.exe惜犀。執(zhí)行./game
铛碑,會(huì)輸出Hello, Role Play Game!
。
對于gcc的編譯選項(xiàng)虽界,我們可以先記這么幾個(gè):
- -o <goal> 汽烦,指定生成的目標(biāo)名稱。
- -I<include_path>浓恳,指定include路徑刹缝,gcc搜索頭文件的時(shí)候會(huì)包含這些路徑碗暗。
- -L<lib_path>,指定lib路徑梢夯,gcc在鏈接庫的時(shí)候言疗,會(huì)搜索這些路徑。
- -l<libname>颂砸,指定生成二進(jìn)制時(shí)要鏈接的庫噪奄。比如 -lSDL 要鏈接 SDL庫。
- -c人乓,只編譯生成目標(biāo)文件(以
.o
為后綴)勤篮。這個(gè)選項(xiàng)以后會(huì)用到。
安裝SDL庫
SDL 目前有兩個(gè)版本:1.2和2.0色罚。因?yàn)?.2使用較廣泛碰缔,我們也使用SDL 1.2。
如果你使用Linux戳护,很簡單金抡,從軟件倉庫安裝即可。具體軟件包的名稱因發(fā)行版而異(如果你用Debian/Ubuntu腌且,apt-cache search sdl
搜索有關(guān)SDL的軟件包梗肝。如果你用ArchLinux,pacman -Ss sdl
搜索有關(guān)SDL的軟件包铺董。別的發(fā)行版我就不獻(xiàn)丑了)巫击。要注意的是,你要安裝的是 開發(fā)包精续,一般開發(fā)包名稱中會(huì)含有 dev
或 devel
的字樣坝锰。
如果你在Windows上,用MinGW驻右,跟隨以下步驟安裝SDL:
- 下載一個(gè)SDL的win32開發(fā)包∈埠冢現(xiàn)在的官網(wǎng)找不到這個(gè)包放在哪里了。還好堪夭,我這里有愕把,可以從這里下載:https://github.com/jollywing/make-linux-rpg/tree/master/attachments。將鼠標(biāo)放在
SDL-devel-1.2.15-mingw32.tar.gz
上森爽,右鍵恨豁,另存為,即可下載爬迟。 - 解壓橘蜜,進(jìn)到目錄里。把
bin
,include
,lib
下的內(nèi)容分別拷貝到MinGW的bin
,include
和lib
目錄里计福。 - 在msys的命令行(msys的MinGW的組件跌捆,雖然不是必要,但最好安裝它)窗口中象颖,敲入
sdl-config --cflags
(這個(gè)命令會(huì)返回編譯SDL程序的命令行選項(xiàng))佩厚,回車,看輸出的信息對不對说订,主要是看include
的路徑對不對抄瓦。如果不對,用編輯器打開MinGW的bin目錄下的sdl-config陶冷,修改prefix
的值钙姊。如果你的include
目錄放在urs
目錄下,則prefix=/usr
埂伦。(用Linux的話煞额,則沒有個(gè)麻煩)。
最后赤屋,我們需要一個(gè)SDL的API手冊立镶。即使你用IDE壁袄,有函數(shù)原型的提示类早,也沒有看API手冊的效果好。如果你用sublime/vim/Emacs寫程序嗜逻,API手冊更是不可少的啦涩僻。在你剛才下載的SDL-devel-1.2.15-mingw32.tar.gz
中,docs目錄下就是API手冊栈顷,用瀏覽器打開index.html
就可以啦逆日。什么?你要看中文的萄凤?自己從網(wǎng)上搜搜吧室抽。
小試牛刀,第一個(gè)SDL程序
注意看下面程序中的注釋靡努。
程序清單2(用SDL顯示一個(gè)黑色窗口):
#include <stdio.h>
#include <SDL.h>
int main(int argc, char *argv[])
{
/*在你調(diào)用SDL其它函數(shù)之前坪圾,先要調(diào)用SDL_Init初始化SDL子系統(tǒng) */
/*這里我們初始化了視頻和音頻兩個(gè)子系統(tǒng),你可以從手冊中查看SDL_Init函數(shù)*/
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) != 0) {
/* 如果出錯(cuò)惑朦,就打印錯(cuò)誤信息兽泄,并退出。SDL_GetError獲取最近的SDL錯(cuò)誤的信息*/
printf("Unable to initialize SDL: %s\n", SDL_GetError());
exit(1);
}
/* 告訴程序在退出的時(shí)候漾月,調(diào)用SDL_Quit關(guān)閉SDL子系統(tǒng) */
atexit(SDL_Quit);
/* 下面我們創(chuàng)建游戲的畫布病梢,用SDL_SetVideoMode函數(shù) */
/* 函數(shù)原型: SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags); */
/* width和height指定了畫面的寬和高。*/
/* bpp = bits per pixel. 每個(gè)像素多少位梁肿,如果bpp等于8蜓陌,就創(chuàng)建了一個(gè)256色的畫布觅彰。*/
/* 如果bpp等于0,表示用系統(tǒng)當(dāng)前的顯示模式钮热。對于非全屏游戲缔莲,我們一般設(shè)置bpp為0*/
/* flags有以下值: */
/* SDL_SWSURFACE, 在系統(tǒng)內(nèi)存中創(chuàng)建畫圖表面。 */
/* SDL_HWSURFACE, 在顯存中創(chuàng)建畫圖表面霉旗,有硬件加速 */
/* SDL_DOUBLEBUF, 雙緩沖痴奏,后臺畫圖,前臺顯示厌秒,可避免畫面閃爍 */
/* SDL_FULLSCREEN, 全屏模式 */
SDL_Surface *screen = SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE|SDL_DOUBLEBUF);
/* 如果screen為空读拆,說明創(chuàng)建畫圖表面失敗 */
if (screen == NULL) {
printf("Unable to set video mode: %s\n", SDL_GetError());
exit(1);
}
/*設(shè)置窗口標(biāo)題*/
SDL_WM_SetCaption("Hello, Linux Game!", NULL);
/* 為了防止窗口一閃而過,用getchar暫停程序 */
getchar();
return 0;
}
執(zhí)行
gcc -o game main.c `sdl-config --cflags --libs`
編譯生成game程序鸵闪。在命令行下輸入 ./game
檐晕,回車,則看到如下窗口蚌讼。
注意辟灰,sdl-config --cflags --libs
會(huì)返回SDL程序的編譯和鏈接選項(xiàng),而MinGW似乎要求把鏈接選項(xiàng)放在源文件后面篡石,否則會(huì)報(bào)錯(cuò)芥喇。Linux無所謂。如果你使用MinGW凰萨,可以試試 <code>gcc -o game `sdl-config --cflags --libs` main.c</code>继控,在我這里會(huì)報(bào)錯(cuò)。
用make管理項(xiàng)目
每次輸入 <code>gcc -o game main.c `sdl-config --cflags --libs`</code> 編譯程序胖眷,也很麻煩武通。我們還是寫一個(gè)簡單的makefile來管理項(xiàng)目吧。
在項(xiàng)目的目錄下珊搀,建立文件makefile
冶忱,輸入以下內(nèi)容:
game: main.c
gcc -o game main.c `sdl-config --cflags --libs`
目前,項(xiàng)目目錄里共有兩個(gè)文件境析,makefile
和main.c
囚枪。在命令行里,敲入make
簿晓,回車眶拉,則會(huì)自動(dòng)編譯程序,生成game
憔儿。
原來忆植,make會(huì)從makefile
中讀取規(guī)則,執(zhí)行動(dòng)作。make的規(guī)則符合下列格式:
目標(biāo): 依賴項(xiàng)
生成目標(biāo)的規(guī)則
如果依賴項(xiàng)
比目標(biāo)
新朝刊,則會(huì)執(zhí)行生成目標(biāo)的規(guī)則
耀里,重新生成目標(biāo)
。如果依賴項(xiàng)
不比目標(biāo)
新拾氓,則什么都不做冯挎。比如你剛剛用make
生成了game
,再次執(zhí)行make
咙鞍,make會(huì)告訴你game
已經(jīng)是最新的啦房官。也就是說,當(dāng)你改了main.c
续滋,make才會(huì)重新生成game
翰守。
要注意的是:生成目標(biāo)的規(guī)則
以 制表符 而不是空格開頭。當(dāng)你寫makefile時(shí)疲酌,要敲一下Tab鍵蜡峰,再寫生成目標(biāo)的規(guī)則
。
make很有意思朗恳,不僅僅用來管理程序湿颅。你可以在makefile
中寫入以下規(guī)則。
love:
@echo "I don't know how to make love."
然后執(zhí)行make love
粥诫,make會(huì)告訴你 I don't know how to make love.
下一章我們將學(xué)習(xí)如何在SDL程序中顯示圖像油航。如果你在本章遇到了什么問題,點(diǎn)擊這里:https://github.com/jollywing/make-linux-rpg/tree/master/chap02臀脏,下載我寫的程序編譯試試劝堪。
如果你喜歡我的文章,可以點(diǎn) 這里 給我打賞揉稚,五分一毛也是對我的認(rèn)同。