​SDL2使用-第一課?

初始化和建立視窗

工具/原料

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的作用是暫停螢幕,相當於暫停,接下來看執行結果截圖:

​SDL2使用-第一課 初始化和建立視窗

看看其他引數改變後執行效果圖:

Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN SDL_WINDOW_BORDERLESS); SDL_MapRGB(WindowScreen->format, 0x00, 0xFF, 0x00)

​SDL2使用-第一課 初始化和建立視窗

Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN SDL_WINDOW_BORDERLESS); SDL_MapRGB(WindowScreen->format, 0x00, 0xFF, 0xFF)

​SDL2使用-第一課 初始化和建立視窗

相關問題答案