Graphics 使用GFX rotozoomSurface和SDL绘制透明精灵的正确方法是什么?

Graphics 使用GFX rotozoomSurface和SDL绘制透明精灵的正确方法是什么?,graphics,transparency,sdl,sprite,Graphics,Transparency,Sdl,Sprite,我正在Fedora 10上使用最新的SDL/GFX libs,我正在尝试渲染PNG或GIF 将图像复制到屏幕表面。我根本无法显示透明的PNG 所以我用全白色(并尝试了洋红)替换了透明部分或我的雪碧 255,0,255). 使用以下代码,白色透明PNG显示良好: SDL_Surface *image = load_image("sprite-white.png"); SDL_Surface *roto = SDL_DisplayFormat(image); SDL_SetColorKey(roto

我正在Fedora 10上使用最新的SDL/GFX libs,我正在尝试渲染PNG或GIF 将图像复制到屏幕表面。我根本无法显示透明的PNG 所以我用全白色(并尝试了洋红)替换了透明部分或我的雪碧 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程序正确地打开了它

设置目的地表面时,我有什么遗漏吗


谷歌并没有出现太多,一个有效的例子将是伟大的

我假设当你说“Fedora 10上最新的SDL/GFX库”时,你指的是SDL和SDL_GFX库。要正确显示具有透明度的PNG图像,请确保已安装;您将需要它,除非您有另一个库可以将PNG图像加载到SDL_曲面中

对于透明度,不需要使用颜色键(当然,除非您想使用颜色键)。关于使用颜色键的问题,请注意SDL文档建议在调用SDL_DisplayFormat()之前设置颜色键:

“如果要利用硬件colorkey或alpha blit加速,则应在调用此函数之前设置colorkey和alpha值。”

您可能还想尝试使用SDL_DisplayFormat Alpha()而不是SDL_DisplayFormat(),如下所示:

SDL_Rect imagePosition = { 50, 50, 0, 0 };
SDL_Surface *image = IMG_Load("example.png");
if (image != NULL) {
  image = SDL_DisplayFormatAlpha(image);
}
稍后,在渲染循环中,您可以将源图像旋转一些浮点
角度
到一些SDL_曲面
屏幕上

if (image != NULL) {
  SDL_Surface *rotation = rotozoomSurface(image, angle, 1, 1);
  SDL_BlitSurface(rotation, NULL, screen, &imagePosition);
  SDL_FreeSurface(rotation);
}
假设PNG具有适当的透明度,上述代码将正确地blit一个具有透明度的PNG


假设您在Fedora 10安装中使用的是g++,请确保为SDL_图像库链接
-lSDL_image
,为SDL_图像库链接
-lSDL_gfx
。您还可以对sdl本身所需的g++参数使用
sdl配置--libs

只需关闭Rotozoomsurface的抗锯齿功能,您就不会再遇到“外线问题”

您使用的是:
SDL_Surface*roto=rotozoomSurface(图像,旋转度,1,1)

改为使用以下选项:
SDL_Surface*roto=rotozoomSurface(图像,旋转度,1,0)


0设置消除混叠。

上面的代码给了我相同的结果,所以我找到了一些其他png,它与我的原始代码一起工作得很好。我用来测试的png有点不好。谢谢