2012-03-04 197 views
0

我想在SDL中創建一個假的「爆炸」效果。爲此,我希望屏幕能夠從當前的屏幕上消失,然後褪色成白色。SDL透明覆蓋

本來,予想過使用SDL_FillRect像這樣(其中explosionTick是當前alpha值):

SDL_FillRect(screen , NULL , SDL_MapRGBA(screen->format , 255, 255 , 255, explosionTick)); 

但是,而不是相反的衰落矩形,它顯示了完全白色不帶alpha。另一種方法我嘗試涉及使用填充有透明白色(爲1的α值)的全屏幕的位圖,並且一旦的blit它爲每個explosionTick像這樣:

 for(int a=0; a<explosionTick; a++){ 
      SDL_BlitSurface(boom, NULL, screen, NULL); 
     } 

但是,這結束了被減慢到實時運行。 有沒有簡單的方法來實現這種效果而不會失去性能?感謝您的時間。

+0

使用大於1的alpha值?它會不那麼流暢但更快。 – Alink 2012-03-04 23:14:36

+0

雖然使用大於1的alpha增量可以用於圖像方法,但我希望有一種方法不同於使用預製圖像。 – Shalmezad 2012-03-04 23:17:37

回答

1

那麼,你需要混合和AFAIK SDL這樣做與SDL_Blitsurface的唯一方法。所以你只需要優化這個blit。我建議基準測試:

  • 嘗試使用SDL_SetAlpha來使用每表面alpha而不是每個像素alpha。從理論上講,SDL的工作較少,因此您可能希望獲得一些速度增益。但我從來沒有比較過,過去也有過這個問題。
  • 你並不需要全屏位圖,只需重複一行。它應該是更少的內存密集型,也許有一個緩存增益。另外,你也可以通過在每次通過時做一半的線來減少一些平滑度(較少的像素點,並應該看起來像全局屏幕效果)。
  • 爲獲得最佳性能,請驗證您的位圖是否處於顯示格式。檢查SDL_DisplayFormatAlpha或SDL_DisplayFormat(如果使用每表面阿爾法)
+0

謝謝。我希望有一個更優雅的解決方案,但它看起來像blitting是要走的路。 – Shalmezad 2012-03-05 01:54:54

+0

只是要完成,也許濫用SDL_SetGamma可以給你類似的效果,但這是一個壞主意。另外它在某些系統上不可靠。 – Alink 2012-03-05 02:08:58