The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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

Использование 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);


}

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


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor