SDL 创建透明表面

6
我正在搜索如何在SDL中创建透明表面,并找到了以下链接:http://samatkins.co.uk/blog/2012/04/25/sdl-blitting-to-transparent-surfaces/ 基本上,就是:
SDL_Surface* surface;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
surface = SDL_CreateRGBSurface(SDL_HWSURFACE,width,height,32, 0xFF000000, 0x00FF0000,        0x0000FF00, 0x000000FF);
#else
surface = SDL_CreateRGBSurface(SDL_HWSURFACE,width,height,32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);
#endif

我知道这种方法可以工作,但对我来说似乎相当糟糕,所以我想知道是否有更好的方法。


你为什么觉得这很糟糕? - Captain Skyhawk
因为像创建透明表面这样的事情应该由API来正确处理,而不是用户必须使用条件编译和硬编码常量。 - wheybags
从外观上看,那段代码与透明度没有太多关系。它更多地涉及到数据的排序方式。也就是说,它是以小端或大端形式存在的。 - Captain Skyhawk
是的,但是您需要使用一个端序相关的常量来创建一个透明表面,我想知道是否有更“合适”的方法来做到这一点,而不需要像那样使用魔术数字。 - wheybags
使用原始数据,所以不幸的是不行。也许有一种优雅的解决方案,但实际上并不需要。 - Captain Skyhawk
你可以从配置文件中提取数字,这样就不必硬编码。你可以选择一个在任何字节序中都相同的值,这样就不需要条件编译了。 - stonemetal
3个回答

1
你手头的代码是用于检测计算机使用的是大端序还是小端序。SDL可跨平台运行,计算机具有不同的字节序。

该文章的作者以“平台无关”的方式编写它。如果你在PC上运行此代码,只需使用以下内容即可:

surface = SDL_CreateRGBSurface(SDL_HWSURFACE,width,height,32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);

您不需要条件语句。

话虽如此,这段代码将无法在使用大端字节序的其他平台上移植。


我知道这个检查是干什么的。我希望它是可移植的。我在想是否有替代方案来完全避免使用硬编码常量。 - wheybags
这更像是编译时的检查/选项,而不是程序逻辑选项。作者呈现的方式实际上更受欢迎,因为编译器只会取走它想要的并剥离掉其余部分。丑陋?有点。这就是 C 的一种方式。 - Captain Skyhawk
我知道这是编译时检查。我想知道的是是否存在一些CreateTranparentSurface函数,这将是更好的解决方案,但显然并不存在。 :P - wheybags
是的,不幸的是。欢迎来到令人惊叹的超低级编码世界。它很丑陋 :) - Captain Skyhawk
希望需要的人能够找到这个问题。 - wheybags

0

我在IT课程中有一些SDL2的经验。但是我一直在开发一个简化版本的函数,使用SDL,并且我加载图像的方式是这样的:

ImageId LoadBmp(string FileName, int red, int green, int blue){
SDL_Surface* image = SDL_LoadBMP(FileName.c_str()); // File is loaded in the SDL_Surface* type variable

GetDisplayError(!image, string("LoadBmp:\n Couldn't load image file ") + FileName); // Check if the file is found

Images.push_back(image); // Send the file to the Images vector


SDL_SetColorKey(Images[Images.size() - 1], SDL_TRUE, // enable color key (transparency)
    SDL_MapRGB(Images[Images.size() - 1]->format, red, green, blue)); // This is the color that should be taken as being the 'transparent' part of the image

                                                                      // Create a texture from surface (image)
SDL_Texture* Texture = SDL_CreateTextureFromSurface(renderer, Images[Images.size() - 1]);
Textures.push_back(Texture);

return Images.size() - 1; // ImageId becomes the position of the file in the vector}

你可能正在寻找的是:

SDL_SetColorKey(Images[Images.size() - 1], SDL_TRUE, // enable color key (transparency)
SDL_MapRGB(Images[Images.size() - 1]->format, red, green, blue)); // This is the color that should be taken as being the 'transparent' part of the image

通过这样做,您可以将给定的RGB设置为透明。希望这有所帮助!这是我目前正在使用的SDL Ready模板,您应该能够使用其中一些! https://github.com/maxijonson/SDL2.0.4-Ready-Functions-Template


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接