我想在我的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 回答
附:如果你想要淡出/淡入效果,调整大小会暂时改变alpha变化(如果你使用了SDL_GetTicks()并且随着时间的推移做了一个浮动来慢慢减少/增加alpha . 这是因为windows暂停程序内的渲染,但一旦停止调整大小,它就会恢复 .
另一个P.S.由于您要调整窗口大小,请确保将w和h值分配为数字,而不是产品或动态数字(乘法比分割更快,但您也可以使用除法) . 分配静态数字会导致窗口调整大小,但内部的纹理不会改变大小 .
快乐编码:)
好吧,这似乎只是一个bug . 我不是唯一一个遇到这个问题的人:有人已经将此报告为bug追踪者的错误 . 这是链接:https://bugzilla.libsdl.org/show_bug.cgi?id=2202 .
希望SDL团队能解决它!