SDL是什么
SDL的全稱是Simple DirectMedia Layer琉兜。是一套開源的跨平臺多媒體開發(fā)庫熏瞄,用C語言寫的终惑。應(yīng)用于游戲開發(fā)葱绒,模擬器感帅,媒體播放器等多媒體應(yīng)用領(lǐng)域。簡單來說地淀,SDL是能夠幫助你開發(fā)跨平臺的媒體應(yīng)用失球。
安裝
每個平臺下的安裝方式不一樣。這里只展示在MacOS下的安裝。雖然官方網(wǎng)站中提供dmg的安裝包实苞,但是不建議直接去使用豺撑。推薦使用最原始的使用源碼編譯的方式去安裝。下載好源碼包后解壓出來黔牵,先后執(zhí)行./configure
make all
和 make install
就完事了聪轿。同理,SDL其他拓展包的安裝也是如此猾浦。
使用
安裝完成后就能使用SDL庫來寫一個簡單的小程序了陆错。
#include "SDL2/SDL.h"
#include <stdio.h>
//屏幕的寬高常量
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main( int argc, char* args[] )
{
//The window we'll be rendering to
SDL_Window* window = NULL;
//The surface contained by the window
SDL_Surface* screenSurface = NULL;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
else
{
//Create window
window = SDL_CreateWindow( "hello", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( window == NULL )
{
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
}else{
//Get window surface
screenSurface = SDL_GetWindowSurface( window );
//Fill the surface white
SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0x00, 0xFF, 0xFF ) );
//Update the surface
SDL_UpdateWindowSurface( window );
//Wait two seconds
SDL_Delay( 10000 );
}
}
//Destroy window
SDL_DestroyWindow( window );
//Quit SDL subsystems
SDL_Quit();
return 0;
}
程序中有2個變量SDL_Window
和SDL_Surface
,都是指針類型。都是SDL的API金赦。使用SDL_Init( SDL_INIT_VIDEO )
來初始化SDL的運行環(huán)境音瓷,如果失敗就直接打印出錯誤信息,這些東西都在SDL的庫中定義好了夹抗。然后通過SDL_CreateWindow
方法來創(chuàng)建一個“window”绳慎。這個方法參數(shù)有很多,第一個是窗口的title兔朦,第二第三個參數(shù)是窗口的位置偷线,這里使用的是默認(rèn)的參數(shù),當(dāng)然也能自定義比如100沽甥,100。第四第五個參數(shù)代表窗口的大小乏奥,程序中指定的是640x480摆舟,最后一個參數(shù)指定的是SDL_WINDOW_SHOWN,表示將窗口顯示出來邓了。
窗口創(chuàng)建出來后就得獲取screenSurface了恨诱,SDL_GetWindowSurface
方法就是用來獲取一個surface,參數(shù)是window骗炉,簡單理解為從window中獲取一個surface照宝,這個surface翻譯為中文意思是表面,大致意思就是窗口還不能直接裝東西句葵,得用surface來裝厕鹃。也就相當(dāng)于是一個層吧。拿到了surface后就得往上面塞東西了乍丈,SDL_FillRect
方法就是用來塞東西了剂碴。第一個參數(shù)是surface,表示的是填充到這個surface上轻专,第二個參數(shù)是一個矩形忆矛,表示填充多大,如果為NULL表示全部填充请垛,第三個參數(shù)是一個32位無符號整數(shù)表示一個顏色值催训,使用SDL_MapRGB
函數(shù)來獲取一個rgb類型的顏色值洽议。
填充完還沒結(jié)束,還得將這個surface更新到window中漫拭,這里使用SDL_UpdateWindowSurface
來完成這個操作亚兄。然而此時的程序只會一閃而過,為了讓窗口能夠暫停幾秒鐘嫂侍,使用SDL_Delay
函數(shù)來讓窗口延時幾秒儿捧,參數(shù)是毫秒。這樣程序啟動后會暫時停頓幾秒中才消失挑宠。
最后就是釋放內(nèi)存菲盾,退出程序。整個過程很簡單各淀。
運行程序
我沒有使用IDE集成環(huán)境懒鉴,而是使用文本編輯器來編輯的代碼。使用gcc命令行來編譯的代碼碎浇。在mac下沒有發(fā)現(xiàn)好用的C環(huán)境的代碼編輯器临谱,因此直接用命令行,對于簡單的程序直接使用gcc命令就能完成奴璃,稍微復(fù)雜一點的寫個Makefile也能搞定悉默。
#OBJS specifies which files to compile as part of the project
OBJS = hello.c
#CC specifies which compiler we're using
CC = g++
#COMPILER_FLAGS specifies the additional compilation options we're using
# -w suppresses all warnings
COMPILER_FLAGS = -w
#LINKER_FLAGS specifies the libraries we're linking against
LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf
#OBJ_NAME specifies the name of our exectuable
OBJ_NAME = hello
#This is the target that compiles our executable
all : $(OBJS)
$(CC) $(OBJS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME)
LINKER_FLAGS指的是需要的庫,每個-l后面緊跟的是庫名苟穆。這個程序中只需要SDL2的庫抄课,后面的是SDL的拓展庫,以后的程序中需要雳旅。然后在當(dāng)前文件夾下敲擊命令make就能生成出可執(zhí)行文件了跟磨。非常簡單。