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

Использование 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; }   /* Блитируем (копируем) на экранную поверхность. Поверхность не должна быть заблокирована (lo cked ). */ 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); }

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