2013-03-20 88 views
1

我有一個彈出的紋理,它有一個白色的輪廓,我希望白色的輪廓根據當前的主題改變顏色。在XNA中着色一個特定的顏色

不幸的是,調用SpriteBatch.Draw()與色調我想色彩所有不透明的像素,而我想要的只是色調(在這種情況下),白色像素。

+3

檢查這個 http://stackoverflow.com/questions/3255311/color-replacement-in-xna-c-sharp – 2013-03-20 13:44:03

回答

0

所以我最終這樣做,儘管它不是那麼高效。謝天謝地,我只在LoadContent()期間做了一次。

texture = content.Load<Texture2D>("popup"); 
Color[] colors = new Color[texture.Width * texture.Height]; 
texture.GetData(colors); 
for (int i = 0; i < colors.Length; i++) 
{ 
    if (colors[i] == Color.White) 
    { 
     colors[i] = PhoneTheme.Current.PhoneAccentColor; 
    } 
} 
texture.SetData(colors); 
+0

也許你應該使用白色爲那些口音的區域,然後着色整機質感與手機的重音顏色,與'spriteBatch.Draw(t2d,矩形,顏色)'方法? – user1306322 2013-03-20 17:01:25

+0

正如我所說的,'spriteBatch.Draw(t2d,矩形,顏色)'色調也非白色像素,這會產生不必要的效果。 – 2013-03-21 08:55:25

+0

我的意思是把紋理分成兩個紋理,一個從不着色,另一個着色。 – user1306322 2013-03-21 09:49:21

2

如何使用兩個紋理;一個只包含白色邊框(所有其他像素都是透明的),另一個包含彈出紋理。然後,您可以使用SpriteBatch.Draw(borderTex,borderTex.Bounds,tintColor)將邊框紋理應用於邊框紋理,並執行額外的SpriteBatch.Draw(tex,tex.Bounds,Color.White)以將結果上的彈出紋理覆蓋。這樣做的好處是您的繪圖操作不受CPU限制(像您發佈的解決方案),因爲SpriteBatch可以使用您的GraphicsDevice(GPU)。

+0

當我想要添加更多紋理時,我的預算很緊張,但我會牢記這一點,以防萬一,謝謝。 – 2013-03-21 08:57:23