Выбор и установка разрешения и глубины цвета (простой способ) Просто выберите свое любимое разрешение и глубину цвета и установите его! |
Совет #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); }} |
Рисование точек сводится к прямой записи в видеобуфер и вызову функции обновления содержимого экрана. |
Совет: Если вам предстоит рисовать много объектов, лучше заблокировать (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);} |