SDL多媒体库编程入门

 SDL多媒体库介绍

SDL(Simple DirectMedia Layer,简单直接的媒体层)是一个自由的跨平台的多媒体开发包,它已经被成功运用于许多多媒体处理程序中,它也是一些其它多媒体库的基础。本章介绍SDL多媒体库的编程的基本接口,读者可以以此为基础,再着手研究其他的多媒体库,或在SDL基础上构建自己的多媒体库。SDL主要特性包括(见SDL文档)如下表所示。

表SDL主要特性

分类

说明

视频

  • 支持8bpp或更高的色彩深度的视频模式
  • 支持Linux图像帧缓冲(framebuffer)
  • 包含图像操作库(SDL_Image)
  • 优化的blit,支持硬件加速的blit和fill(填充)操作

事件

  • 支持visibility改变、键盘、鼠标、退出等事件
  • 事件等待接口
  • 事件轮询接口
  • 每种事件都能通过SDL_EventState()关闭或者打开

音频

  • 设置8位和16位的音频,单声道或者立体声
  • 由独立的线程执行音频部分,并提供用户回调(callback)机制
  • 设计上考虑到了客户定制的软混音器

CD音频

  • 完整的CD音频控制API

线程

  • 简单的线程创建API
  • 用于同步的简单的二进制信号量(semaphores)

定时器

  • 读取已流逝的毫秒数
  • 等待指定的毫秒数
  • 设置一个10毫秒精度的周期性定时器

字节序无关

  • 侦测当前系统的字节序
  • 快速转换数据的函数
  • 读写指定字节序的数据

2 SDL编程实例

2.1 初始化SDL库

调用SDL库需要包含SDL头文件,并在编译时链接SDL库。调用SDL函数之前必须初始化SDL库。

  • 初始化SDL库

int SDL_Init(Uint32 flags);

SDL_Init可以通过flags参数指定需要初始化的子系统。flags选项如表22.2所示。

表 子系统的初始化宏

子系统

说明

SDL_INIT_TIMER

初始化时间子系统

SDL_INIT_AUDIO

初始化音频子系统

SDL_INIT_VIDEO

初始化视频子系统

SDL_INIT_CDROM

初始化CDROM子系统

SDL_INIT_JOYSTICK

初始化JOYSTICK子系统

SDL_INIT_EVERYTHING

初始化上述所有子系统

SDL_INIT_NOPARACHUTE

避免捕获致命错误

SDL_INIT_EVENTTHREAD

初始化线程子系统

  • 初始化子系统

int SDL_InitSubSystem(Uint32 flags);

  • 关闭SDL下某个子系统

void SDL_QuitSubSystem(Uint32 flags);

  • 关闭SDL 库

void SDL_Quit(void);

  • 检查哪个子系统被初始化

Uint32 SDL_WasInit(Uint32 flags);

       如果SDL函数出错,可以用SDL_GetError获取错误信息:

char *SDL_GetError(void);

 

2.2SDL表面操作

SDL表面代表一个显示区域。

  • 建立一个表面

SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);

       wdth为宽度,height为高度,bpp为像素深度,如果为0,表示使用当前的像素深度,flags标志如表22.3所示。

表SDL_SetVideoMode标志

标志

说明

SDL_SWSURFACE

在系统内存创建表面

SDL_HWSURFACE

在视频内存创建表面

SDL_ASYNCBLIT

运行表面的异步更新

SDL_ANYFORMAT

通常如果指定的像素深度的视频表面不存在,则SDL将模拟一个。这个标志禁止这种做法。

SDL_DOUBLEBUF

使能双缓冲

SDL_FULLSCREEN

全屏模式

SDL_OPENGL

创建一个OpenGL渲染环境

SDL_RESIZABLE

窗口可变尺寸

SDL_NOFRAME

创建一个无边框和标题的窗口。

  • 使用指定颜色填充某个区域

int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

  • 转换显示面到屏幕相同的格式

SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);

  • 更新屏幕区域

void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Sint32 w, Sint32 h);

void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);

SDL_UpdateRects将更新一组屏幕区域。

  • 交换视频缓冲,主要用于双缓冲模式

int SDL_Flip(SDL_Surface *screen);

  • 释放表面

void SDL_FreeSurface(SDL_Surface *surface);

2.3加载和显示图片

SDL支持BMP图片,使用SDL_LoadBMP可加载一张位图。如果要支持其他格式,需要安装SDL_Image库。SDL提供的BMP位图的操作函数如下:

  • 加载位图

SDL_Surface *SDL_LoadBMP(const char *file);

SDL_LoadBMP用来导入BMP图象。图象如果导入成功,将保存在一个SDL表面中。

  • 粘贴表面

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

SDL_BlitSurface函数通常用来将一张图象贴在屏幕上,src表示要贴的图象表面,dst表示屏幕表面。Srcrect为原图像的显示区域,dstrect为屏幕显示位置。

  • 保存SDL表面为BMP图片

int SDL_SaveBMP(SDL_Surface *surface, const char *file);

【声明】开源文档,请勿用于商业用途。转载请注明文章出处:linux乐园(www.linuxview.net),作者:fgjnew@163.com,2010-4-1.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值