您的位置:首页 > 其它

[音视频播放] SDL学习笔记之一

2013-11-23 22:44 357 查看
1. 初始化SDL:SDL_Init(mode);

mode:

SDL_INIT_TIMER

SDL_INIT_AUDIO

SDL_INIT_VIDEO

SDL_INIT_CDROM

SDL_INIT_JOYSTICK

SDL_INIT_NOPARACHUTE

SDL_INIT_EVENTTHREAD

SDL_INIT_EVERYTHING

2. 获取出错表达式:

SDL_GetError();

3. 退出程序,清除系统:SDL_Quit();

atexit(SDL_Quit);

4. 在SDL里,一切皆表面!

SDL_Surface *screen;

screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

最后一个标志位:

SDL_SWSURFACE 在系统内存创建视频表面(软件);

SDL_HWSURFACE 在显存里创建视频表面(硬件);

SDL_ASYNCBLIT 启用异步更新显示表面,会拖慢单处理器的位图复制,在SMP中却会加速。

SDL_ANYFORMAT 在指定无效BPP时也要使用,而不要SDL用投影表面模拟。

SDL_HWPALETTE 指定SDL独占访问调色板,不然你用SDL_SetColors或SDL_SetPalette时,并不一定总会会得到所要的颜色。

SDL_DOUBLEBUF 启用硬件双缓存,必须和SDL_HWSURFACE同时使用。调用SDL_Flip可以交换缓冲并更新显示,不然SDL_Flip只是在整个屏幕上执行SDL_UpdateRect。

SDL_FULLSCREEN 全屏模式。若硬件分辨率不支持,便会用下一个更高点的分辨率在一个黑背景中心显示窗口。

SDL_OPENGL 创建一个OpenGL渲染环境。在此之前,需要用SDL_GL_SetAttribute预先设置OpenGL显示属性。

SDL_OPENGLBLIT 同上创建一个GLRC,但允许普通的块复制操作。

SDL_RESIZABLE 创建一个可调整大小的窗口。当窗口大小被改变时,会有一个SDL_VIDEORESIZE事件生成,然后,可以用新的尺寸调用SDL_SetVideoMode。

SDL_NOFRAME 若可能,SDL_NOFRAME会生成一个无标题栏无边框修饰的窗口。全屏模式自动带此属性。

5. SDL数据类型

Uint8 等同一个unsigned char;

Uint16/32/64 16/32/64位无符号整型;

Sint8/16/32/64 同上,相应的有符号类型;

6. 有时,一方面初始化失败,还可以继续:SDL_WasInit()。

if(SDL_WasInit() & SDL_INIT_AUDIO)sound = true;

7. 绘制像素的代码:

void DrawPixel(SDL_Surface *screen,int x,int y,Uint8 R,Uint8 G,Uint8 B)

{

Unit32 color = SDL_MapRGB(screen->format,R,G,B);

switch(screen->format->BytesPerPixel)

{

case 1: // Assuming 8-bpp

{

Uint8 *bufp;

bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;

*bufp = color;

}

break;

case 2: // Probable 15-bpp or 16-bpp

{

Uint16 *bufp;

bufp = (Uint16 *)screen->pixels + y*screen->pitch + x*3;

if(SDL_BYTEORDER == SDL_LIL_ENDIAN)

{

bufp[0] = color;

bufp[1] = color>>8;

bufp[2] = color>>16;

}else{

bufp[2] = color;

bufp[1] = color>>8;

bufp[0] = color>>16;

}

}

break;

case 4: // Probable 32-bpp

{

Uint32 *bufp;

bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;

*bufp = color;

}

break;

}

}

8. 绘图之前,有时需要锁住屏幕:SDL_LockSurface(screen)/SDL_UnlockSurface(screen);

if(SDL_MUSTLOCK(screen))SDL_LockSurface(screen);

if(SDL_MUSTLOCK(screen))SDL_UnlockSurface(screen);

9. SDL消息处理:

SDL_EVNET ent;

投递消息,直到没有消息:while(SDL_PollEvent(&ent)){};

消息类型:SDL_QUIT、SDL_KEYDOWN等;

键符映射:SDLK_XXX,比如SDLK_ESCAPE等;

ent.key.keysym.sym,包含在SDL_keysym.h文件里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: