将SDL2颜色键控表面转换为纹理,没有透明像素

时间:2016-04-16 16:34:26

标签: c image sdl-2

我正在研究SDL2编程,同时遵循Lazy Foo的优秀教程。我仍然远远落后于它,但我发现教程显示的内容与我在跟踪它们时能够获得的内容之间存在奇怪的不一致:从SDL_Texture创建SDL_SurfaceSDL_CreateTextureFromSurface函数我总是失去使用SDL_SetColorKey函数获得的透明背景。

这是我编写的从文件加载纹理的函数:

SDL_Texture *LoadTexture(char *path, SDL_Renderer *renderer) {
    SDL_Texture *newTexture = NULL;
    SDL_Surface *loadedSurface = NULL;
    loadedSurface = loadSurfaceWithKey(path);

    newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface);
    if (newTexture == NULL) {
    printf("Error while creating texture. SDL_Error: %s\n", SDL_GetError());
    }

    SDL_FreeSurface(loadedSurface);

    return newTexture;
}

虽然loadSurfaceWithKey是您通常在将背景颜色设置为颜色键后加载图像并将其存储在SDL_Surface中的功能。

我制作了一个简单的程序,要求用户使用Surfaces或Textures,并显示单个图像5秒钟。这些是结果: enter image description here

我100%肯定我正在键入正确的颜色,因为我在使用Surfaces时没有遇到任何问题。为了使这个问题更加陌生,我尝试编译Lazy Foo's Color Keying tutorial代码,并且使用透明背景将棒子精灵正确地绘制到屏幕上,同时用我制作的精灵切换精灵(同时使用相同的颜色作为背景当然)仍然不起作用:

enter image description here

我在OSX和Windows 7下都观察到了这种行为,并且都使用了png图像和bmp。

我知道我可以通过自己使图像背景透明来完全绕过这个问题,我想还有很多其他的方法可以在使用SDL_Textures时使背景透明,但我不能在生命中使用我理解为什么这个方法适用于Lazy Foo的精灵,但它不适合我制作的那些。

1 个答案:

答案 0 :(得分:0)

尝试使用 R、G、B 作为您需要的颜色键。

loadedSurface = SDL_LoadBMP(path); 
// or 
// loadedSurface = IMG_Load(path); // You must #include "SDL_image.h"
SDL_SetColorKey(loadedSurface ,SDL_TRUE,SDL_MapRGB(loadedSurface ->format,R,G,B));
newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface);
SDL_FreeSurface(loadedSurface);