SDL入門

SDL是什么

SDL的全稱是Simple DirectMedia Layer琉兜。是一套開源的跨平臺多媒體開發(fā)庫熏瞄,用C語言寫的终惑。應(yīng)用于游戲開發(fā)葱绒,模擬器感帅,媒體播放器等多媒體應(yīng)用領(lǐng)域。簡單來說地淀,SDL是能夠幫助你開發(fā)跨平臺的媒體應(yīng)用失球。

安裝

每個平臺下的安裝方式不一樣。這里只展示在MacOS下的安裝。雖然官方網(wǎng)站中提供dmg的安裝包实苞,但是不建議直接去使用豺撑。推薦使用最原始的使用源碼編譯的方式去安裝。下載好源碼包后解壓出來黔牵,先后執(zhí)行./configure make allmake install就完事了聪轿。同理,SDL其他拓展包的安裝也是如此猾浦。

使用

安裝完成后就能使用SDL庫來寫一個簡單的小程序了陆错。

#include "SDL2/SDL.h"
#include <stdio.h>

//屏幕的寬高常量
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main( int argc, char* args[] )
{
    //The window we'll be rendering to
    SDL_Window* window = NULL;
    
    //The surface contained by the window
    SDL_Surface* screenSurface = NULL;

    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Create window
        window = SDL_CreateWindow( "hello", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        }else{
            //Get window surface
            screenSurface = SDL_GetWindowSurface( window );

            //Fill the surface white
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0x00, 0xFF, 0xFF ) );
            
            //Update the surface
            SDL_UpdateWindowSurface( window );

            //Wait two seconds
            SDL_Delay( 10000 );
        }
    }
    
    //Destroy window
    SDL_DestroyWindow( window );

    //Quit SDL subsystems
    SDL_Quit();

    return 0;
}

程序中有2個變量SDL_WindowSDL_Surface,都是指針類型。都是SDL的API金赦。使用SDL_Init( SDL_INIT_VIDEO )來初始化SDL的運行環(huán)境音瓷,如果失敗就直接打印出錯誤信息,這些東西都在SDL的庫中定義好了夹抗。然后通過SDL_CreateWindow方法來創(chuàng)建一個“window”绳慎。這個方法參數(shù)有很多,第一個是窗口的title兔朦,第二第三個參數(shù)是窗口的位置偷线,這里使用的是默認(rèn)的參數(shù),當(dāng)然也能自定義比如100沽甥,100。第四第五個參數(shù)代表窗口的大小乏奥,程序中指定的是640x480摆舟,最后一個參數(shù)指定的是SDL_WINDOW_SHOWN,表示將窗口顯示出來邓了。

窗口創(chuàng)建出來后就得獲取screenSurface了恨诱,SDL_GetWindowSurface方法就是用來獲取一個surface,參數(shù)是window骗炉,簡單理解為從window中獲取一個surface照宝,這個surface翻譯為中文意思是表面,大致意思就是窗口還不能直接裝東西句葵,得用surface來裝厕鹃。也就相當(dāng)于是一個層吧。拿到了surface后就得往上面塞東西了乍丈,SDL_FillRect方法就是用來塞東西了剂碴。第一個參數(shù)是surface,表示的是填充到這個surface上轻专,第二個參數(shù)是一個矩形忆矛,表示填充多大,如果為NULL表示全部填充请垛,第三個參數(shù)是一個32位無符號整數(shù)表示一個顏色值催训,使用SDL_MapRGB函數(shù)來獲取一個rgb類型的顏色值洽议。

填充完還沒結(jié)束,還得將這個surface更新到window中漫拭,這里使用SDL_UpdateWindowSurface來完成這個操作亚兄。然而此時的程序只會一閃而過,為了讓窗口能夠暫停幾秒鐘嫂侍,使用SDL_Delay函數(shù)來讓窗口延時幾秒儿捧,參數(shù)是毫秒。這樣程序啟動后會暫時停頓幾秒中才消失挑宠。

最后就是釋放內(nèi)存菲盾,退出程序。整個過程很簡單各淀。

運行程序

我沒有使用IDE集成環(huán)境懒鉴,而是使用文本編輯器來編輯的代碼。使用gcc命令行來編譯的代碼碎浇。在mac下沒有發(fā)現(xiàn)好用的C環(huán)境的代碼編輯器临谱,因此直接用命令行,對于簡單的程序直接使用gcc命令就能完成奴璃,稍微復(fù)雜一點的寫個Makefile也能搞定悉默。

#OBJS specifies which files to compile as part of the project
OBJS = hello.c

#CC specifies which compiler we're using
CC = g++

#COMPILER_FLAGS specifies the additional compilation options we're using
# -w suppresses all warnings
COMPILER_FLAGS = -w

#LINKER_FLAGS specifies the libraries we're linking against
LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf
#OBJ_NAME specifies the name of our exectuable
OBJ_NAME = hello

#This is the target that compiles our executable
all : $(OBJS)
    $(CC) $(OBJS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME)

LINKER_FLAGS指的是需要的庫,每個-l后面緊跟的是庫名苟穆。這個程序中只需要SDL2的庫抄课,后面的是SDL的拓展庫,以后的程序中需要雳旅。然后在當(dāng)前文件夾下敲擊命令make就能生成出可執(zhí)行文件了跟磨。非常簡單。

參考資料

SDL WIKI 文檔

Lazy Foo' Productions

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攒盈,一起剝皮案震驚了整個濱河市抵拘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌型豁,老刑警劉巖僵蛛,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偷遗,居然都是意外死亡墩瞳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門氏豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喉酌,“玉大人,你說我怎么就攤上這事±岬纾” “怎么了般妙?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長相速。 經(jīng)常有香客問我碟渺,道長,這世上最難降的妖魔是什么突诬? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任苫拍,我火速辦了婚禮,結(jié)果婚禮上旺隙,老公的妹妹穿的比我還像新娘绒极。我一直安慰自己,他們只是感情好蔬捷,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布垄提。 她就那樣靜靜地躺著,像睡著了一般周拐。 火紅的嫁衣襯著肌膚如雪铡俐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天妥粟,我揣著相機與錄音审丘,去河邊找鬼。 笑死勾给,一個胖子當(dāng)著我的面吹牛备恤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锦秒,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喉镰!你這毒婦竟也來了旅择?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤侣姆,失蹤者是張志新(化名)和其女友劉穎生真,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺宗,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡柱蟀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚜厉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长已。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出术瓮,到底是詐尸還是另有隱情康聂,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布胞四,位于F島的核電站恬汁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辜伟。R本人自食惡果不足惜氓侧,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望导狡。 院中可真熱鬧约巷,春花似錦、人聲如沸烘豌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廊佩。三九已至囚聚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間标锄,已是汗流浹背顽铸。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留料皇,地道東北人谓松。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像践剂,于是被迫代替她去往敵國和親鬼譬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容