建议使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出现错误可以尝试使用SDL_SWSURFACE。
SDL_SetVideoMode如果操作成功,则返回一个指向SDL_Surface的指针,否则的话返回NULL。可以使用如下语句检查发生的错误:
If ( screen == NULL ) { printf(“Unable to set 640x480 video: %s\\n”, SDL_GetError()); return 1; }
以上介绍了如何对SDL进行初始化,下面可以开始绘制了。但是还有一些需要注意的关键地方,首先是一些SDL使用的容易让人产生迷惑的数据类型:
Uint8 – 相当于unsigned char Uint16 – 16位(2字节) unsigned integer Uint32 – 32位(4字节) unsigned integer Uint64 - 64位(8字节) unsigned integer Sint8 – 相当于signed char Sint16 – 16位(2字节) signed integer Sint32 – 32位(4字节) signed integer Sint64 - 64位(8字节) signed integer
还有,有的时候如果初始化出现错误,没必要完全退出。例如当初始化了SDL_INIT_VIDEO而没有初始化SDL_INIT_AUDIO,那么你可 以继续这个错误只是没有音频而已。要检查是否音频初始化是否成功,可以使用SDL_WasInit()函数来检查。下面是一个例子:
Uint32 init = SDL_WasInit(SDL_INIT_AUDIO); If (init & SDL_INIT_AUDIO) { sound = 1; } else { sound = 0; }
你可以在程序初始化的某些地方加入以上语句。
以下是SDL介绍中进行象素绘制的语句,可以暂时不需要完全了解其中的意思:
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) { Uint32 color = SDL_MapRGB(screen->format, R, G, B); switch (screen->format->BytesPerPixel) { case 1: // Assuming 8-bpp { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; *bufp = color; } break; case 2: // Probably 15-bpp or 16-bpp { Uint16 *bufp; bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x; *bufp = color; } break; case 3: // Slow 24-bpp mode, usually not used { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3; if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { bufp[0] = color; bufp[1] = color >> 8; bufp[2] = color >> 16; } else{ bufp[2] = color; bufp[1] = color >> 8; bufp[0] = color >> 16; } } break; case 4: // Probably 32-bpp { Uint32 *bufp; bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x; *bufp = color; } break; } }
通过这个函数,可以传递给surface要绘制的点的(x,y)坐标和RGB值。
同时,由于绘制的屏幕不能同时接受两个函数的同时操作,我们需要其他两个辅助函数,用于在绘制前对屏幕进行锁定,以及在绘制完成之后解除锁定。这两个工作 一般由SDL_MUSTLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。使用如下两个自定义的函数会更加简单:
void Slock(SDL_Surface *screen) { if ( SDL_MUSTLOCK(screen) ) { if ( SDL_LockSurface(screen) < 0 ) { return; } } } void Sulock(SDL_Surface *screen) { if ( SDL_MUSTLOCK(screen) ) { SDL_UnlockSurface(screen); } }
这样,我们可以得到一个简单的主程序框架如下:
#include
相关推荐: