首页 文章

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

提问于
浏览
0

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

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

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

Information about how and when I use these functions:

在主游戏循环中,我使用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);

Information about how I resize the window:

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

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

My primary loop area:

这是主要的游戏循环:

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);   
 }

Test my project:

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

2 回答

  • 0

    SDL_SetTextureBlendMode(texture,SDL_BLENDMODE_BLEND);您应该直接更改此区域中的alpha . 例如:alpha = 100; SDL_SetTextureAlphaMod(texture,alpha); //记住alpha是一个int SDL_RenderCopy(渲染器,纹理,NULL和矩形);

    附:如果你想要淡出/淡入效果,调整大小会暂时改变alpha变化(如果你使用了SDL_GetTicks()并且随着时间的推移做了一个浮动来慢慢减少/增加alpha . 这是因为windows暂停程序内的渲染,但一旦停止调整大小,它就会恢复 .

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

    快乐编码:)

  • 0

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

    希望SDL团队能解决它!

相关问题