| Урок 3 | Содержание | Урок 4 |

В третьем уроке мы рассмотрели достаточно эффективный механизм для работы с анимированными спрайтами. Теперь вы можете очень просто написать небольшую сцену, не задумываясь о многих, достаточно низкоуровневых вещах. Нужно всего лишь подготовить соответствующие изображения заднего фона и спрайтов... Стоп... А теперь представьте каково это рисовать кадры одного и того же спрайта в разных картинках... А если у вас много спрайтов, состоящих из множества кадров? Нужно создать кучу папок и описывать каждый кадр в файле info. В большинстве случаев, все параметры кадров идентичны для одного спрайта (имеется ввиду пауза и цвет прозрачности). А нам приходится прописывать их по многу раз. А что если хранить все кадры спрайта в одном файле? Например вот таки образом:

init()). В результате высота спрайта будет равна высоте картинки со всеми кадрами поделить на количество кадров.
SDL_Surface *temp; if((temp=SDL_LoadBMP(data->bmpFile))==NULL) return -1; W = temp->w; H = temp->h/svsNumFrames; |
SDL_Surface, но по умолчанию ее размеры будут скорее всего равны размерам экрана... Нужно сначала создать поверхность заданных размеров, а потом копировать на нее. Позже с помощью SDL_DisplayFormat() помещаем каждый кадр в массив кадров. Вот кусок кода из документации по SDL который создает новую поверхность.
SDL_Surface *surface;
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
surface = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCCOLORKEY, Width, Height, 32,
rmask, gmask, bmask, amask);
if(surface == NULL) {
fprintf(stderr, "CreateRGBSurface failed: %s\n", SDL_GetError());
return -1;
}
|
init() указатель на специальную структуру svsInit.
struct svsInit
{
char* bmpFile;
int numFrames;
int pause;
int r;
int g;
int b;
};
|
| Урок 3 | Содержание | Урок 4 |
©opyleft PLG, 2003.