[ Назад ] Содержание [ Дальше ]
Выбор и установка разрешения и глубины цвета (простой способ) Просто выберите свое любимое разрешение и глубину цвета и установите его! |
Совет #1:
Совет #2: |
Пример
:
{ SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if
( screen == NULL ) {// Если установить разрешение не удалось
fprintf(stderr, "Невозможно установить разрешение 640x480: %s\n", SDL_GetError());
exit(1);
}
}
|
Рисование точек сводится к прямой записи в
видеобуфер и вызову функции обновления содержимого экрана. |
Совет:
|
Пример: Рисование точки на экране необходимым цветом
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:
Совет #2:
|
Пример
:
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);
}
|
[ Назад ] Содержание [ Дальше ]