2011-03-29 80 views
4

我遇到了SpriteBatch未使用指定「Trail」的修改Alpha繪製的問題。 我想要做的是一個「淡化效果」,其中「Item」的alpha值降低,使它變得更加透明,直到它最終被破壞。但它不會改變它的alpha? 阿爾法確實下降,但顏色的Alpha值沒有得到修改,它保持相同的顏色,然後自敗Sprite批處理不會更改Alpha

這裏發生了什麼: http://dl.dropbox.com/u/14970061/Untitled.jpg

這就是我想要做的http://dl.dropbox.com/u/14970061/Untitled2.jpg

下面是我現在使用的相關代碼的剪切圖。

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
for (int i = 0; i < Trails.Count; i++) 
{ 
    Trail Item = Trails[i]; 
    if (Item.alpha < 1) 
    { 
     Trails.RemoveAt(i); 
     i--; 
     continue; 
    } 

    Item.alpha -= 255 * (float)gameTime.ElapsedGameTime.TotalSeconds; 
    Color color = new Color(255, 0, 0, Item.alpha); 
    spriteBatch.Draw(simpleBullet, Item.position, color); 
} 
spriteBatch.End(); 

回答

1

如果您不需要,請勿使用NonPremultiplied將其保留爲AlphaBlend。請閱讀Premultiplied Alpha以及added in XNA 4.0

正確的解決問題的方法是使用你的顏色乘法運算符:

Color color = Color.Red * Item.alpha/255f; 

或者使用等效Lerp函數將其插值到透明度:

Color color = Color.Lerp(Color.Red, Color.Transparent, Item.alpha/255f); 

(此外,如果您確實將混合狀態更改爲非預乘,則必須將內容導入更改爲不預乘您的紋理,並確保您的內容在其透明邊緣周圍具有可混合的數據。)

1

確保您要spriteBatch.Begin()調用包括必要的參數:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
+0

它只是忘記將它們包含在代碼中。我編輯它來包含它。 – PeppeJ 2011-03-29 14:27:13

0

阿爾法範圍介於1(完全不透明)和0(完全透明),也是它的浮動,我相信。所以你要走出它的範圍。

編輯:0.1,如果它小於或等於零,刪除

0

原來它沒有工作,我只是用錯了BlendState嘗試降低它,我切換到BlendState.NonPremultiplied和現在的作品。

+0

很高興你找到它。我查看了大概20分鐘的代碼,並沒有看到你的錯誤。我唯一能想到的就是你可能沒有清理屏幕,但是如你所說的那樣,一切都不會在最後消失。 – FreeAsInBeer 2011-03-29 22:22:58