在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函數產生的表面或窗口)才能顯示,其他任何表面必須刷到這個窗口上才可以顯示,這一點很重要。打個比方這個窗口就像是一塊白板,你需要顯示的東西必須貼在白板上才能顯示,並且後貼上的東西會覆蓋以前的東西。下面是建立顯示窗口的代碼:
/* 功能:建立SDL顯示窗口 作者:csl 日期:2012-5-4 */ #include <stdio.h> #include <stdlib.h> #include "SDL.h" SDL_Surface *gpScreen;//顯示表面 int main(int argc,char *argv[]) { if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化視頻子系統 { printf("Unable to init SDL: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit);// 注冊SDL_Quit,當退出時調用,使得退出時程序自動清理 //創建32位600*480窗口 gpScreen = SDL_SetVideoMode(600,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF ); if(!gpScreen) { exit(1); } SDL_Delay(3000); //暫停3秒 SDL_FreeSurface(gpScreen);//退出程序前必須釋放 system("pause"); return 0; }
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詳細資料在視頻子系統基本概念裡做了詳細的說明。
本文出自 “學習之樂” 博客,請務必保留此出處http://chengshaolei.blog.51cto.com/1994169/1291966