SDL是什么
SDL的全称是Simple DirectMedia Layer。是一套开源的跨平台多媒体开发库,用C语言写的。应用于游戏开发,模拟器,媒体播放器等多媒体应用领域。简单来说,SDL是能够帮助你开发跨平台的媒体应用。
安装
每个平台下的安装方式不一样。这里只展示在MacOS下的安装。虽然官方网站中提供dmg的安装包,但是不建议直接去使用。推荐使用最原始的使用源码编译的方式去安装。下载好源码包后解压出来,先后执行./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的运行环境,如果失败就直接打印出错误信息,这些东西都在SDL的库中定义好了。然后通过SDL_CreateWindow
方法来创建一个“window”。这个方法参数有很多,第一个是窗口的title,第二第三个参数是窗口的位置,这里使用的是默认的参数,当然也能自定义比如100,100。第四第五个参数代表窗口的大小,程序中指定的是640x480,最后一个参数指定的是SDL_WINDOW_SHOWN,表示将窗口显示出来。
窗口创建出来后就得获取screenSurface了,SDL_GetWindowSurface
方法就是用来获取一个surface,参数是window,简单理解为从window中获取一个surface,这个surface翻译为中文意思是表面,大致意思就是窗口还不能直接装东西,得用surface来装。也就相当于是一个层吧。拿到了surface后就得往上面塞东西了,SDL_FillRect
方法就是用来塞东西了。第一个参数是surface,表示的是填充到这个surface上,第二个参数是一个矩形,表示填充多大,如果为NULL表示全部填充,第三个参数是一个32位无符号整数表示一个颜色值,使用SDL_MapRGB
函数来获取一个rgb类型的颜色值。
填充完还没结束,还得将这个surface更新到window中,这里使用SDL_UpdateWindowSurface
来完成这个操作。然而此时的程序只会一闪而过,为了让窗口能够暂停几秒钟,使用SDL_Delay
函数来让窗口延时几秒,参数是毫秒。这样程序启动后会暂时停顿几秒中才消失。
最后就是释放内存,退出程序。整个过程很简单。
运行程序
我没有使用IDE集成环境,而是使用文本编辑器来编辑的代码。使用gcc命令行来编译的代码。在mac下没有发现好用的C环境的代码编辑器,因此直接用命令行,对于简单的程序直接使用gcc命令就能完成,稍微复杂一点的写个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的拓展库,以后的程序中需要。然后在当前文件夹下敲击命令make就能生成出可执行文件了。非常简单。