初始化和建立視窗
工具/原料
SDL2+C4droid/Codeblocks
方法/步驟
本課,我們來講解初始化SDL2和建立一個視窗,並且將螢幕繪製成大紅色:
在SDL2上比SDL1.2多出了一個SDL_Window結構體,意味著我們可以建立多個視窗。。。當然 不是在C4droid上,在C4droid上我們只能建立一個視窗。。。感覺被閹割了。。非使用C4droid的讀者在使用SDL2前請參考SDL_GUI吧的教程自行配置SDL2.0,沒有合適IDE的推薦codeblocks。。。 在使用SDL2前先包含標頭檔案。。在C4droid上使用時,標頭檔案必須在入口原始碼檔案(編譯時開啟的原始碼檔案)中包含,保證C4droid開啟SDL外掛。
#include
#include "log.h"
包含標頭檔案後即可使用SDL2定義的函式,log.h是本人寫的一個小函式庫,定義了一個函式plog,用法和printf相同;一個PLOG巨集,可以輸出除錯資訊。 接下來我們要宣告兩個結構體作為繪圖的主體,視窗(SDL_Window)和一個表面(SDL_Surface):
// 視窗
SDL_Window *Window = NULL;
// 視窗表面
SDL_Surface *WindowScreen = NULL;
接下來我們定義一個初始化函式:
//初始化函式
int Init() {
SDL_Init(SDL_INIT_VIDEO);
函式SDL_Init用來初始化SDL2,這裡我們使用了SDL_INIT_VIDEO作為初始化的可選引數,在本課程式碼中只需要初始化視訊功能就好,初始化後我們來建立視窗並且檢查建立成功沒有:
// 建立視窗
Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN); if (Window == NULL) {
PLOG;
return -1;
}
SDL_CreateWindow函式用來建立視窗,第一個引數是視窗的標題,第二、三個引數指明瞭視窗的位置資訊,在電腦的程式上用來指明窗口出現的位置, 在C4droid上就不需要了,它不管設定多少都沒用,第四、五個引數是視窗的大小(長、寬),最後一個引數是視窗的 狀態,SDL_WINDOW_SHOWN,表示顯示視窗;不過我更喜歡SDL_WINDOW_BORDERLESS,這樣。。SDL2建立的視窗就沒有那些標題和視窗的最大化之類的按鍵了 ;最後一個引數是可選引數,詳細請參考SDL WIKI的名為SDL_WindowFlags列舉型別,接下來我們將表面繫結到視窗上:
// 獲取Window的表面
WindowScreen = SDL_GetWindowSurface(Window);
if (WindowScreen == NULL)
{
PLOG;
return -2;
} return 0;
}
SDL_GetWindowSurface函式可以獲取視窗的表面並且返回SDL_Surface指標,值得注意的是這個函式有一定的侷限性, 在視窗使用渲染器(以後會說)後就無法使用它獲取視窗的表面。初始化結束了,接下來就是退出函式
//清理函式
void Destroy() {
SDL_FreeSurface(WindowScreen);
SDL_DestroyWindow(Window);
SDL_Quit();
}
SDL2建立的結構體指標的記憶體無法自動釋放,是需要用函式釋放的,每種結構體有其特定的釋放函式,如SDL_Window用SDL_DestroyWindow釋放,SDL_Surface用SDL_FreeSurface釋放,名字之所以有些不同是繼承自SDL1.2,然後就是退出SDL2,用函式SDL_Quit退出;之後就到了主函式,函式引數必須使用完全版本的main函式,值得注意的是,main函式必須首先呼叫,因為它不是正真的main函式!它只是一個被替換的巨集(見SDL_main.h:83:#define main SDL_main)
int main(int args, char *argv[])
{
if (Init() != 0)
return -1;
//填充視窗
SDL_FillRect(WindowScreen, NULL, SDL_MapRGB(WindowScreen->format, 0xFF, 0x00, 0x00));
函式SDL_FillRect是一個用來操作SDL_Surface的函式,它的作用是在表面上填充一個矩形區域,第一個引數是填充的目標表面,第二個是填充的矩形區域,接受一個SDL_Rect引數,如今設定為NULL,則預設全部填充,第三個引數是填充矩形用的顏色,但是我們看到在這裡用了一個SDL_MapRGB來指定顏色,這是因為我們不知道WindowScreen使用的顏色格式,第一個引數獲取了WindowScreen的顏色格式,然後通過後面的3個引數混合一種顏色,SDL_MapRGB會將這顏色轉換成輸入的顏色格式並返回,關於混合色用的是色彩三原色紅、綠、藍來混合,每種顏色取值為0x0~0xFF也就是一個位元組,這裡我們用了全紅0xFF,綠藍都取0,這樣混合的顏色為大紅色,效果稍後看截圖:
SDL_UpdateWindowSurface(Window);
SDL_Delay(2000);
Destroy();
return 0;
}
這一段用了兩個函式,SDL_UpdateWindowSurface將我們在之前綁定了視窗表面的WindowScreen上的操作應用到視窗上,SDL_Delay的作用是暫停螢幕,相當於暫停,接下來看執行結果截圖:
看看其他引數改變後執行效果圖: