SDL 中的 Alpha 混合在调整大小后重置 window

Alpha Blending in SDL resets after resizing window

我想在我的纹理中实现 alpha 混合 class。它几乎完全有效。我使用以下函数来操作 alpha 值:

SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);

我遇到的唯一问题是,当我调整大小或最大化 window 时,已被操纵的纹理似乎重置为正常的 alpha 值 255。我检查了 alpha 值并认识到它仍然是我之前操纵它的值。所以该值不是 255。为什么渲染器将其渲染为 alpha 值当时为 255?

关于我如何以及何时使用这些功能的信息:

在主游戏循环中,我使用纹理的 public 方法更改纹理的 alpha 值 class:

Texture::setAlphaValue(int alpha)

Texture class 的私有 alpha 变量已更改。

在我的 Texture class 的 Draw 方法中绘制纹理并调用

 SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
 SDL_SetTextureAlphaMod(texture, alpha);

之前

 SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);

有关如何调整大小的信息 window:

我基本上只是在我的 SDL 初始化中将 window 模式设置为可调整大小的 window。然后像处理任何正常的 window 一样处理它是可能的:

SDL_CreateWindow(window_Title, x_Position, y_Position, window_Width, window_Height, SDL_WINDOW_RESIZABLE);  

我的主要循环区:

这是主要的游戏循环:

 void Game::Render()
 {
     // set color and draw window       

     SDL_SetRenderDrawColor(renderer, windowColor.R(), windowColor.G(), windowColor.B(), 0);

     SDL_RenderClear(renderer); 

     texture.setAlphaValue(100);
     texture.Draw(SDL_FLIP_NONE);

     // present/draw renderer

     SDL_RenderPresent(renderer);   
 }

测试我的项目:

我还将我的 alpha 混合测试项目上传到 dropbox。在这个项目中我简化了一切,甚至没有纹理 class 了。所以代码真的很简单,但是bug还是存在。这是 Visual Studio 项目的 link:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar

SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);

You should directly change the alpha in this area.

example: alpha = 100;

SDL_SetTextureAlphaMod(texture, alpha); //remember that alpha is an int

SDL_RenderCopy(renderer, texture, NULL, &rect);

P.S。如果你想要 fade-out/fade-in 效果,调整大小会暂时暂停 alpha 变化(以防你使用 SDL_GetTicks() 并随着时间的推移使浮动缓慢 reduce/increase alpha。这是因为 windows 会暂停程序内的渲染,但一旦您停止调整大小,它就会恢复。

另一个P.S。由于您正在调整 window 的大小,因此请确保将 w 和 h 值分配为乘积或动态数字而不是数字(乘法比除法快,但您也可以使用除法)。 分配静态数字会导致 window 调整大小,但内部纹理不会改变大小。

快乐编码:)

好的,这似乎只是一个错误。我不是唯一遇到此问题的人:有人已经将此作为错误报告给错误跟踪器。这是 link:https://bugzilla.libsdl.org/show_bug.cgi?id=2202.

希望 SDL 团队能够修复它!