2015-04-04 118 views
0

我想在我的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

+1

您如何调整窗口大小? – Zammalad 2015-04-07 08:03:09

+0

@Zammalad我将窗口模式设置为SDL_WINDOW_RESIZABLE,然后它就像任何程序一样是一个普通窗口,可以通过将鼠标移动到其边框来调整窗口大小。 – huzzm 2015-04-08 13:44:13

+1

,所以你可以在每一帧调用'SDL_SetTextureBlendMode'和'SDL_SetTextureAlphaMod',即在绘制纹理的调用中。您的纹理类是否存储了值'alpha'或者是您传递给'Draw'函数的参数。 – Zammalad 2015-04-08 17:29:17

回答

0

SDL_SetTextureBlendMode(texture,SDL_BLENDMODE_BLEND);

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

示例:alpha = 100;

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

SDL_RenderCopy(renderer,texture,NULL,& rect);

P.S.如果你想要淡出/淡入效果,调整大小会暂时改变字母的变化(在使用SDL_GetTicks()的情况下),并随着时间的推移使得一个字符串缓慢地减少/增加字母α,这是因为窗口暂停程序中的渲染,但一旦你停止调整大小,它会重新开始。

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

编码快乐:)

+0

我试着直接改变这个值,但是没有任何效果。调整窗口大小后,alpha值仍然似乎被重置。因此,我是否在公共方法或直接更改变量是无关紧要的。这真的好像是由SDL lib引起的问题,而不是由我引起的...... – huzzm 2015-04-20 20:42:34

+0

在我输入答案之前,我在我的项目上做了这件事,它实际上对我有用0_0。 – kdyz 2015-04-20 23:56:09

+0

尝试删除 - > Texture :: setAlphaValue(int alpha)和this - > SDL_RenderCopyEx(renderer,texture,&sourceRectangle,&destinationRectangle,0,0,SDL_Flip);然后使用我输入的代码快速调试。 – kdyz 2015-04-20 23:58:42