[Назад] Содержание [Дальше]

Использование Simple DirectMedia Layer API

Видео

Выбор и установка разрешения и глубины цвета  (простой способ)

Просто выберите свое любимое разрешение и глубину цвета и установите его!

Совет #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);
    }
}

 

  • Рисование точек (pixels) на экране

Рисование точек сводится к прямой записи в видеобуфер и вызову функции обновления содержимого экрана.
 

Совет:
Если вам предстоит рисовать много объектов, лучше заблокировать (lock) экран единожды перед рисованием, вывести все объекты на экран, сохраняя список областей, требующих обновления, и разблокировать (unlock) экран вновь перед обновлением экрана.

 

Пример:

Рисование точки на экране необходимым цветом

 
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;
        }
    }
    // Смотрим, сколькими байтами кодируется каждый пиксель (bytes per pixel, bpp)
    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 demos archive).

Вы можете отобразить загруженную картинку, используя SDL_BlitSurface() для копирования ее в видеобуфер. SDL_BlitSurface() автоматически усекает копируемую область, которая должна быть передана SDL_UpdateRects() для обновления изменившейся части экрана.

Совет #1:
Если вам необходимо показывать некоторую картинку много раз, вы можете ускорить вывод, конвертировав ее в формат дисплея. Для этого используется функция SDL_DisplayFormat()

Совет #2:
Большинство изображений спрайтов имеют прозрачный фон. Вы можете разрешит копирование с прозрачностью (colorkey blit) функцией SDL_SetColorKey().

 

Пример:

 
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;
 
    /* Загрузим BMP файл на поверхность */
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
        return;
    }
 
    /* Блитируем (копируем) на экранную поверхность.
       Поверхность не должна быть заблокирована (locked).
     */
    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);
}

[Назад] Содержание [Дальше]