我想在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
答案 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)
希望SDL团队能解决它!