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

来源:互联网 发布:网络为什么使人抑郁 编辑:程序博客网 时间:2024/06/06 01:46
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文件里。