Введение в Simple DirectMedia Layer

Видео


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

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

Совет #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);}
    [Назад] Содержание [Дальше]


    Содержание раздела