【问题标题】:SDL create transparent surfaceSDL 创建透明表面
【发布时间】:2017-01-02 14:08:03
【问题描述】:

我正在寻找如何在 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

它有效,但对我来说似乎非常糟糕,所以我想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • 你为什么觉得它很糟糕?
  • 因为像创建透明表面这样的事情应该由 api 正确处理,而不是用户必须使用条件编译和硬编码常量。
  • 从外观上看,该代码与透明度没有太大关系。它更多地与数据的顺序有关。如,它是小端形式还是大端形式。
  • 是的,但是你需要使用一个字节序相关的常量来制作一个透明的表面,我想知道是否有一种更“正确”的方法来做到这一点,它不需要像那样的幻数.
  • 使用原始数据,所以很遗憾没有。可能有一种方法可以在这里创建一个优雅的解决方案,但它确实不是必需的。

标签: sdl


【解决方案1】:

你有一个检查,看看计算机是使用大端还是小端。 SDL 是多平台的,计算机使用不同的字节序。

那篇文章的作者以“平台无关”的方式编写它。如果您在 PC 上运行它,您可能会安全地使用:

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

你不需要条件。

话虽如此,代码不会移植到其他使用大字节序的平台

【讨论】:

  • 我知道支票的用途。我确实希望它是便携式的。我想知道是否有替代使用硬编码常量的方法。
  • 它更多的是编译时检查/选项,而不是程序逻辑选项。作者呈现它的方式实际上是首选,因为编译器只会获取它想要的内容并将其剥离。丑陋的?有些。这只是 C 滚动的方式之一。
  • 我知道这是编译时检查。我想要的是找出是否存在一些 CreateTranparentSurface 函数,这将是一个更好的解决方案,但显然它没有。 :P
  • 是的,很遗憾没有。欢迎来到超低级编码的美妙世界。太丑了:)
  • 嗯,希望有需要的人能找到这个问题。
【解决方案2】:

我在 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 就绪模板,您应该能够使用其中的一些! https://github.com/maxijonson/SDL2.0.4-Ready-Functions-Template

【讨论】:

    【解决方案3】:

    实际上我们称之为 Alpha 混合,您可以在这里查看: http://lazyfoo.net/tutorials/SDL/13_alpha_blending/index.php

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多