SDL視頻子系統
在SDL中最為常用子系統就是視頻子系統。這里說的視頻不是指我們平常播放的電影等,而是指在屏幕上顯示出來的東西,你需要在屏幕上顯示圖片、文字等那就必須使用視頻子系統,否則什么都看不到,視頻子系統支持:設置視頻模式或者說創建視頻窗口;支持直接的圖像幀緩沖;支持Alpha像素混合;支持Blit位塊傳輸(可以硬件加速);支持窗口管理;支持圖形渲染。
要使用視頻子系統首先要創建一個SDL窗口(或者說設置SDL的顯示模式),我們可以使用:
/*
功能:建立SDL顯示表面
參數:int width 窗口寬度 單位象素
int height 窗口高度 單位象素
int bpp 窗口象素位數,如果為0,則取當前窗口默認象素數
Unit32 flags 位標,標示窗口特性
返回值:SDL_Surface *,成功返回窗口指針,失敗返回NULL
*/
SDL_Surface *SDL_SetVideoMode
(int width, int height, int bpp, Uint32 flags);
來創建一個窗口,以后所有東西都必須刷到這個窗口才能顯示。函數的返回值是SDL_Surface *,SDL_Surface也稱表面(或者說蒙皮),是需要顯示的東西,可能是一張圖片,也可能是一個字符串。我們的應用中可能需要顯示很多的東西,所以可能創建很多的表面,但請記住無論有多少個表面,但只有使用SDL_SetVideoMode函數產生的表面(或窗口)才能顯示,其他任何表面必須刷到這個窗口上才可以顯示,這一點很重要。打個比方這個窗口就像是一塊白板,你需要顯示的東西必須貼在白板上才能顯示,並且后貼上的東西會覆蓋以前的東西。下面是建立顯示窗口的代碼:
1 /* 2 功能:建立SDL顯示窗口 3 作者:csl 4 日期:2012-5-4 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include "SDL.h" 9 10 SDL_Surface *gpScreen;//顯示表面 11 12 int main(int argc,char *argv[]) 13 { 14 if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化視頻子系統 15 { 16 printf("Unable to init SDL: %s\n", SDL_GetError()); 17 exit(-1); 18 } 19 atexit(SDL_Quit);// 注冊SDL_Quit,當退出時調用,使得退出時程序自動清理 20 21 //創建32位600*480窗口 22 gpScreen = SDL_SetVideoMode(600,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF ); 23 if(!gpScreen) 24 { 25 exit(1); 26 } 27 28 SDL_Delay(3000); //暫停3秒 29 SDL_FreeSurface(gpScreen);//退出程序前必須釋放 30 31 system("pause"); 32 return 0; 33 }
gpScreen是顯示窗口的指針,全局變量。第22行建立顯示窗口,flags是位標,標示窗口特性,常用標示已經粗體顯示:
SDL_SWSURFACE |
在系統內存創建表面 |
SDL_HWSURFACE |
在顯內存創建表面 |
SDL_ASYNCBLIT |
顯示表面的異步更新,這回降低但cpu機器的性能,但在多處理器機子上會增加速度 |
SDL_ANYFORMAT |
通常如果表面的像素深度不可用(比如你指定64,但你的機器不支持),則SDL將模擬一個影子表面。這個標志禁止這種做法。這將使SDL使用該表面不考慮bpp |
SDL_DOUBLEBUF |
使用雙緩沖 |
SDL_FULLSCREEN |
全屏模式 |
SDL_OPENGL |
創建一個OpenGL渲染環境 |
SDL_RESIZABLE |
創建一個可變尺寸的窗口 |
SDL_NOFRAME |
創建一個無邊框和標題的窗口。 |
這些常量可以組合使用,比如SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE,表示在顯存里創建一個全屏窗口,使用雙緩沖。注意:一般使用全屏模式也會使用雙緩沖;如果使用在顯存創建表面也會使用雙緩沖。建議使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出現錯誤可以嘗試使用SDL_SWSURFACE。
調用函數后應該檢測gpScreen是否為空,為空則應結束程序。在程序退出前,必須調用SDL_FreeSurface釋放gpScreen所指的窗口資源。
關於SDL_Surface詳細資料在視頻子系統基本概念里做了詳細的說明。