2011-08-17 25 views
0

所以我試圖通過改變它的每幀的alpha值的圖像在sfml 1.6中的可見性。不幸的是,圖像並沒有一個整體的alpha值,所以我必須逐個檢查每個像素並更改它的alpha值。如何更改圖像的alpha值,而不是完全重新加載每個像素每幀/優化

然而,這是非常緩慢的,所以我想知道我怎麼可能優化我的簡單代碼,或者如果有另一個sfml特定的方式來處理這個。

反正這裏是代碼:

每一個新的幀我重新着色與1.7添加α值一個精靈。

// @Return Ptr: a pointer to the stack allocated image so the 
//    user can deallocate it later 
sf::Image* RecolorSprite(sf::Sprite& sprite, sf::Color filter, bool subtract){ 
    // the image has to survive so it's put ont he stack 
    sf::Image* image = new sf::Image; 
    *image = *sprite.GetImage(); 

    RecolorImage(*image, filter, subtract); 
    sprite.SetImage(*image); 

    return image; 
} 

void RecolorImage(sf::Image& image, sf::Color filter, bool subtract){ 
    for(int x= 0; x< image.GetWidth(); x++){ 
     for(int y= 0; y< image.GetHeight(); y++){ 
      if(subtract){ 
       sf::Color pixel = image.GetPixel(x, y); 
       SubtractColor(pixel, filter); 
       image.SetPixel(x, y, pixel); 
      } 
      else 
       image.SetPixel(x, y, image.GetPixel(x, y) + filter); 
     } 
    } 
} 

// int used to stop illegal operations on unsigned chars 
void SubtractColor(sf::Color& col1, sf::Color& col2){ 
    int diff = ((int)col1.r) - ((int)col2.r); 
     if(diff >= 0) 
      col1.r -= col2.r; 
     else 
      col1.r = 0; 

    diff = ((int)col1.g) - ((int)col2.g); 
     if(diff >= 0) 
      col1.g -= col2.g; 
     else 
      col1.g = 0; 

    diff = ((int)col1.b) - ((int)col2.b); 
     if(diff >= 0) 
      col1.b -= col2.b; 
     else 
      col1.b = 0; 

    diff = ((int)col1.a) - ((int)col2.a); 
     if(diff >= 0) 
      col1.a -= col2.a; 
     else 
      col1.a = 0; 
} 
+0

爲什麼不與所有不同的顏色/阿爾法預先創建的精靈。精靈的精靈。這樣你只需要使用正確的精靈而不是在運行時重新計算圖像。您將在開始時使用更多的空間加載所有的精靈過渡,但在渲染循環過程中會更快。 –

回答

3

除非我誤解你的問題,你應該能夠使用sf::Drawable::SetColor這一點,讓白色的說法,但有不同的alpha值。例如,設置sprite的阿爾法到50%,你可以做到以下幾點:

sprite.SetColor(sf::Color(255, 255, 255, 128)); 
+0

參數顏色必須全白嗎?我一直在做(0,0,0,alpha),這樣可以解釋這個問題。 – Griffin

+0

對不起,遲到的迴應,但是,顏色應該是白色的。 SetColor產生與Sprite圖像中像素顏色的乘法混合。例如,如果SetColor爲(255,0,0),這意味着精靈中的像素將保留其R分量的100%,但其G和B分量的0%。如果它被設置爲(0,0,0),那麼結果圖像將具有0%R,0%G和0%B,這意味着它總是黑色的。希望能清楚一點! – TheLastBanana