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

时间:2015-04-04 16:55:51

标签: c++ sdl alpha sdl-2 blending

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

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

我唯一的问题是,当我调整窗口大小或最大化窗口时,已经被操作的纹理似乎重置为正常的alpha值255。我检查了alpha值并发现它仍然是我之前操纵它的值。所以值不是255.为什么渲染器渲染它就好像alpha值是255那么?

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

在主游戏循环中,我使用Texture类的公共方法更改纹理的alpha值:

Texture::setAlphaValue(int alpha)

修改了Texture类的私有alpha变量。

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

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

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

有关我如何调整窗口大小的信息:

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

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。在这个项目中,我简化了一切,甚至还没有纹理类。所以代码非常简单,但bug仍然存在。以下是Visual Studio项目的链接:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar

2 个答案:

答案 0 :(得分:0)

  

SDL_SetTextureBlendMode(texture,SDL_BLENDMODE_BLEND);

     

您应该直接更改此区域中的alpha。

     

示例:alpha = 100;

     

SDL_SetTextureAlphaMod(texture,alpha); //记住alpha是一个int

     

SDL_RenderCopy(渲染器,纹理,NULL和& rect);

P.S。如果您正在进行淡出/淡入效果,则调整大小会暂时改变alpha变化(在使用SDL_GetTicks()的情况下,并随着时间的推移使浮动缓慢减少/增加alpha。这是因为windows会暂停程序中的渲染,但是一旦你停止调整大小,它就会重新开始。

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

快乐编码:)

答案 1 :(得分:0)

好吧,好吧,这似乎只是一个bug。我不是唯一一个遇到这个问题的人:有人已经将此报告为bug追踪者的错误。以下是链接:https://bugzilla.libsdl.org/show_bug.cgi?id=2202

希望SDL团队能解决它!