Урок 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.