SDL学习笔记之一

时间:2022-03-02 20:40:20
 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. 绘制像素的代码:
  1.    void DrawPixel(SDL_Surface *screen,int x,int y,Uint8 R,Uint8 G,Uint8 B)
  2.    {
  3.     Unit32 color = SDL_MapRGB(screen->format,R,G,B);
  4.     switch(screen->format->BytesPerPixel)
  5.     {
  6.        case 1:    // Assuming 8-bpp
  7.        {
  8.               Uint8    *bufp;
  9.               bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
  10.               *bufp = color;
  11.        }
  12.        break;
  13.        case 2:    // Probable 15-bpp or 16-bpp
  14.        {
  15.               Uint16    *bufp;
  16.               bufp = (Uint16 *)screen->pixels + y*screen->pitch + x*3;
  17.               if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
  18.               {
  19.                      bufp[0] = color;
  20.                      bufp[1] = color>>8;
  21.                      bufp[2] = color>>16;
  22.               }else{
  23.                      bufp[2] = color;
  24.                      bufp[1] = color>>8;
  25.                      bufp[0] = color>>16;
  26.               }
  27.        }
  28.        break;
  29.        case 4:    // Probable 32-bpp
  30.        {
  31.               Uint32    *bufp;
  32.               bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
  33.               *bufp = color;
  34.        }
  35.        break;
  36.     }
  37.    }


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文件里。