转自:http://blog.csdn.net/eplaylity/article/details/3454431
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文件里。