我想在我的Texture类中实现alpha混合。它几乎完全可以工作。我使用以下功能,用于操纵α值:在调整窗口大小后重设SDL中的Alpha混合
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
我唯一的问题是,已经操纵的纹理似乎重置为255时我调整或最大化窗口的正常α值。我检查了alpha值并认识到它仍然是我操纵它之前的值。所以这个值不是255.为什么渲染器像alpha值是255那样渲染它呢?
关于信息如何,当我使用这些功能:
在游戏主循环我改变纹理的Alpha值与我的纹理类的公共方法:
Texture::setAlphaValue(int alpha)
有Texture类的私有alpha变量被改变。
在我的纹理类的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
您如何调整窗口大小? – Zammalad 2015-04-07 08:03:09
@Zammalad我将窗口模式设置为SDL_WINDOW_RESIZABLE,然后它就像任何程序一样是一个普通窗口,可以通过将鼠标移动到其边框来调整窗口大小。 – huzzm 2015-04-08 13:44:13
,所以你可以在每一帧调用'SDL_SetTextureBlendMode'和'SDL_SetTextureAlphaMod',即在绘制纹理的调用中。您的纹理类是否存储了值'alpha'或者是您传递给'Draw'函数的参数。 – Zammalad 2015-04-08 17:29:17