原文來自:http://www.aaroncox.net/tutorials/2dtutorials/sdlwindow.html
注意:這裏我們想當然你已經知道怎麼在你的IDE集成開發環境裏配置好SDL
創建一個窗口
要用SDL創建一個窗口,設計到以下步驟:
◆初始化SDL視頻庫
◆創建窗口
◆設置窗口標題
◆關閉SDL
1.初始化SDL視頻庫
我們用SDL_Init()來初始化SDL視頻庫,並傳入一個參數 SDL_INIT_VIDEO.
2.創建一個窗口
我們用SDL_SetVideoMode()來創建一個窗口,這個函數包含四個參數,依次是窗口的寬度、高度、單個像素佔用位數和一個
標記變量。其中第三個參數最爲簡單的方法是設置爲0,這樣它就爲當前默認的顯示設置)。最後一個參數這裏我們用
SDL_HWSURFACE和SDL_DOUBLEBUF.聯起來使用要用或操作符: SDL_HWSURFACE | SDL_DOUBLEBUF。
SDL_SetVideoMode()函數不僅僅是創建了一個窗口,它還創建了一塊內存區域叫"screen buffer",用來顯示圖像。這塊區
域負責顯示畫面到屏幕,標記變量SDL_HWSURFACE表示在顯存裏頭創建緩存;SDL_DOUBLEBUF表示我要創建兩個緩存區域,一
個用作前端緩存,這裏存放的就是我們正在顯示到屏幕的內容;另一個用作後端緩存,這裏存放的是我們將要顯示到屏幕上
的內容。當我們顯示將要顯示的內容時候,只需要交換前端緩存和後端緩存,這樣後端緩存的內容就被顯示出來。(譯者注
:也就是說前端緩存又變成了後端緩存,可以用來存放下一幅要顯示的畫面)這項技術叫做雙緩存,用來加速圖像的渲染過
程。
SDL_SetVideoMode()函數會返回一個指向SDL_Surface類型的screen buffer。SDL_Surface結構代表了一塊內存區域,在那
裏存放了圖像的信息。當我們畫圖時,只需要將圖像數據信息放到這個結構裏面。
3.設置窗口標題
我們可以用SDL_WM_SetCaption()來設置窗口的標題,它有兩個參數,第一個參數就是標題的內容,第二個參數用來指定一
個自定義的圖標,設置爲0表示使用默認的圖標。
4.關閉SDL
我們呼叫SDL_Quit()函數來關閉SDL。它會釋放前面通過SDL_SetVideoMode()返回的SDL_Surface類型的screen buffer。
下面的代碼創建了一個窗口,當你運行的時候,會發現顯示片刻之後,它會關閉。因爲我們在創建該窗口之後,緊接着調用
了SDL_Quit()。下一階段,我們會用到一個循環,讓窗口停在那裏,知道你點擊關閉。
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
const char* WINDOW_TITLE = "SDL Start";
int main(int argc, char **argv)
...{
SDL_Init( SDL_INIT_VIDEO );
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0,
SDL_HWSURFACE | SDL_DOUBLEBUF );
SDL_WM_SetCaption( WINDOW_TITLE, 0 );
SDL_Quit();
return 0;
}
保持窗口一直打開。
要保持窗口一直打開,我們創建一個循環,就像下面這樣:
bool gameRunning = true;
while (gameRunning)
{
}
當我們要退出循環時候,只需要將gameRunning賦值爲false。這裏我選擇用戶關閉的時候給他賦值。
要想偵測到用戶關閉窗口,我們呼叫 SDL_PollEvent()函數。這個函數有一個SDL_Event結構體的參數,裏面包含了當前發
生事件的信息。函數返回0表示沒有事件發生,所以我們需要檢查它的返回值來確定所要處理的事件。
雖然SDL_Event結構體裏面有各種變量,但是這裏我們所要考慮的只有type變量,如果這個變量值爲SDL_QUIT,那麼我們就
知道了用戶想要關閉窗口。(也就是用戶按下了了窗口上方的X按鈕)
下面的代碼用來創建一個窗口,它一直打開知道點擊關閉爲止。
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
const char* WINDOW_TITLE = "SDL Start";
int main(int argc, char **argv)
...{
SDL_Init( SDL_INIT_VIDEO );
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0,
SDL_HWSURFACE | SDL_DOUBLEBUF );
SDL_WM_SetCaption( WINDOW_TITLE, 0 );
SDL_Event event;
bool gameRunning = true;
while (gameRunning)
...{
if (SDL_PollEvent(&event))
...{
if (event.type == SDL_QUIT)
...{
gameRunning = false;
}
}
}
SDL_Quit();
return 0;
}
上面就是我們用SDL創建窗口的過程。