[前一页] 目录
[后一页]
使用SDL
视频
- 简便的选择和设置视频模式
只需选取中意的色彩深度和分辨率,然后设置即可!
|
提示 #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);
}
}
|
- 在屏幕上绘制像素
通过直接写入图形帧缓冲(framebuffer)和调用屏幕更新函数来绘制屏幕。
|
提示:
如果你需要进行大量绘制,最好在绘制前锁住屏幕(如果有必要),绘制时保持一个需要更新的区域列表,并且在更新显示前对屏幕解锁。 |
例程: 在任意格式的屏幕上绘制像素
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;
}
}
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_BlitSurface()将图片blit进图形帧缓冲,从而显示图片。SDL_BlitSurface()自动对blit矩形进行裁边,blit矩形在调用SDL_UpdateRects()时被用作更新屏幕变化了的部分。
|
提示 #1:
如果你需要多次显示某个图片,你可以调用 SDL_DisplayFormat()将图片转换成屏幕的格式,从而提高blit的速度。提示 #2:
许多sprite的图片要求透明背景,你可以用SDL_SetColorKey()来设置透明色,从而实现透明效果的blit(也就是带colorkey的blit)。
|
例程:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
SDL_Surface *image;
SDL_Rect dest;
/* 将BMP文件加载到一个surface*/
image = SDL_LoadBMP(file);
if ( image == NULL ) {
fprintf(stderr, "无法加载 %s: %s\n", file, SDL_GetError());
return;
}
/* Blit到屏幕surface。onto the screen surface.
这时不能锁住surface。
*/
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);
}
|
[前一页] 目录
[后一页]
|