我在Fedora10上使用最新的SDL/GFX库,并尝试在屏幕表面渲染PNG或GIF图像。我根本不能让透明的PNG显示,所以我把透明的部分或我的精灵换成了全白的(并尝试了Magenta 255,0,255)。使用以下代码,白色透明的PNG显示正常:
SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = SDL_DisplayFormat(image);
SDL_SetColorKey(roto, SDL_SRCCOLORKEY, SDL_MapRGB( roto->format, 255,255,255 ));
SDL_BlitSurface( roto, NULL, surface, &offset );但是当我尝试旋转精灵时,它并没有丢弃所有的白色像素。我用下面的代码替换上面的代码来旋转:
SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);
SDL_Surface *roto2 = SDL_DisplayFormat(roto);
SDL_SetColorKey(roto2, SDL_SRCCOLORKEY, SDL_MapRGB( roto2->format, 255,255,255 ));
SDL_BlitSurface( roto2, NULL, surface, &offset );我最终在一些好的像素周围画出了一个白色的轮廓。GIF图像给出了相同的结果。
当尝试处理透明的PNG/GIF文件时,代码是相同的,只是我没有调用SDL_SetColorKey。那么PNG根本不能正常显示。我发现的一个奇怪的事情是透明的PNG在MS Paint中和在SDL中看起来是一样的,但是GIMP/Photoshop程序可以正确地打开它。
是不是我在设置目标表面时遗漏了什么?
谷歌没有出现太多,一个有效的例子将是很好的。
发布于 2009-12-02 14:57:00
我假设当您说“Fedora10上最新的SDL/GFX库”时,您指的是SDL和SDL_gfx库。要正确显示透明的PNG图像,请确保您还安装了SDL_image;除非您有可以将PNG图像加载到SDL_Surface中的其他库,否则您将需要它。
您不需要使用颜色键来表示透明度(当然,除非您想要使用颜色键)。关于使用颜色键的问题,请注意,SDL文档建议在调用SDL_DisplayFormat()之前设置颜色键:
“如果要利用硬件colorkey或alpha blit加速,则应在调用此函数之前设置colorkey和Alpha值。”
您可能还希望尝试使用SDL_DisplayFormatAlpha()而不是SDL_DisplayFormat(),如下所示:
SDL_Rect imagePosition = { 50, 50, 0, 0 };
SDL_Surface *image = IMG_Load("example.png");
if (image != NULL) {
image = SDL_DisplayFormatAlpha(image);
}稍后,在渲染循环中,您可以通过一些浮点angle将源图像旋转到一些SDL_Surface screen上
if (image != NULL) {
SDL_Surface *rotation = rotozoomSurface(image, angle, 1, 1);
SDL_BlitSurface(rotation, NULL, screen, &imagePosition);
SDL_FreeSurface(rotation);
}假设你的PNG具有适当的透明度,上面的代码将正确地将一个透明的PNG进行blit。
假设您在Fedora10安装上使用g++,请确保为SDL_image库链接-lSDL_image,为SDL_gfx库链接-lSDL_gfx。您还可以使用sdl-config --libs作为SDL本身所需的g++参数。
发布于 2012-08-06 18:41:21
只要关闭Rotozoomsurface的抗锯齿功能,你就不会再遇到'out line问题‘了。
你使用了这个:SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);
取而代之的是:SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 0);
0设置禁用抗锯齿。
https://stackoverflow.com/questions/1670304
复制相似问题