首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SDL中使用GFX rotozoomSurface绘制透明精灵的正确方法是什么?

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

Stack Overflow用户
提问于 2009-11-04 05:38:10
回答 2查看 2.7K关注 0票数 1

我在Fedora10上使用最新的SDL/GFX库,并尝试在屏幕表面渲染PNG或GIF图像。我根本不能让透明的PNG显示,所以我把透明的部分或我的精灵换成了全白的(并尝试了Magenta 255,0,255)。使用以下代码,白色透明的PNG显示正常:

代码语言:javascript
复制
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 );

但是当我尝试旋转精灵时,它并没有丢弃所有的白色像素。我用下面的代码替换上面的代码来旋转:

代码语言:javascript
复制
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程序可以正确地打开它。

是不是我在设置目标表面时遗漏了什么?

谷歌没有出现太多,一个有效的例子将是很好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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(),如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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++参数。

票数 2
EN

Stack Overflow用户

发布于 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设置禁用抗锯齿。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1670304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档