2015-04-04 126 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