[前一页] 目录 [后一页]

使用SDL

视频

  • 简便的选择和设置视频模式

    只需选取中意的色彩深度和分辨率,然后设置即可!

提示 #1:
SDL_GetVideoInfo()可以获得硬件所支持的最快的色彩深度。

提示 #2:
SDL_ListModes()可以获得某个色彩深度下所有支持的分辨率。

例程::
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) {
        fprintf(stderr, "无法设置640x480的视频模式:%s\n", SDL_GetError());
        exit(1);
    }
}
  • 在屏幕上绘制像素

    通过直接写入图形帧缓冲(framebuffer)和调用屏幕更新函数来绘制屏幕。

提示:
如果你需要进行大量绘制,最好在绘制前锁住屏幕(如果有必要),绘制时保持一个需要更新的区域列表,并且在更新显示前对屏幕解锁。
例程:

在任意格式的屏幕上绘制像素

void DrawPixel(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if ( SDL_MUSTLOCK(screen) ) {
        if ( SDL_LockSurface(screen) < 0 ) {
            return;
        }
    }
    switch (screen->format->BytesPerPixel) {
        case 1: { /* 假定是8-bpp */
            Uint8 *bufp;

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

        case 2: { /* 可能是15-bpp 或者 16-bpp */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: { /* 慢速的24-bpp模式,通常不用 */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *(bufp+screen->format->Rshift/8) = R;
            *(bufp+screen->format->Gshift/8) = G;
            *(bufp+screen->format->Bshift/8) = B;
        }
        break;

        case 4: { /* 可能是32-bpp */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }
    if ( SDL_MUSTLOCK(screen) ) {
        SDL_UnlockSurface(screen);
    }
    SDL_UpdateRect(screen, x, y, 1, 1);
}
  • 加载和显示图片

    SDL只提供了SDL_LoadBMP(),但在SDL的示例文档中有一个用于加载图片的函数库。

    SDL_BlitSurface()将图片blit进图形帧缓冲,从而显示图片。SDL_BlitSurface()自动对blit矩形进行裁边,blit矩形在调用SDL_UpdateRects()时被用作更新屏幕变化了的部分。

提示 #1:
如果你需要多次显示某个图片,你可以调用 SDL_DisplayFormat()将图片转换成屏幕的格式,从而提高blit的速度。

提示 #2:
许多sprite的图片要求透明背景,你可以用SDL_SetColorKey()来设置透明色,从而实现透明效果的blit(也就是带colorkey的blit)。 

例程:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;

    /* 将BMP文件加载到一个surface*/
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "无法加载 %s: %s\n", file, SDL_GetError());
        return;
    }

    /* Blit到屏幕surface。onto the screen surface.
       这时不能锁住surface。
     */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /* 刷新屏幕的变化部分 */
    SDL_UpdateRects(screen, 1, &dest);
}

[前一页] 目录 [后一页]