Sprite Batch не меняет альфа - PullRequest
       38

Sprite Batch не меняет альфа

4 голосов
/ 29 марта 2011

Я столкнулся с проблемой, когда SpriteBatch не рисует с измененной альфой указанного "Следа". То, что я пытаюсь сделать, это «эффект затухания», когда альфа «Item» уменьшается, так что он становится более прозрачным, пока в конечном итоге не будет уничтожен. Однако это не меняет альфа на нем? Альфа действительно уменьшается, но альфа-значение цвета не изменяется, оно остается тем же цветом и затем исчезает

Вот что происходит: 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();

Ответы [ 4 ]

1 голос
/ 30 марта 2011

Не используйте NonPremultiplied, если вам не нужно! Оставьте его как AlphaBlend.Читайте о Предварительно умноженном альфа и о том, как оно было добавлено в XNA 4.0 .

Правильное решение вашей проблемы - использовать оператор умножения для вашего цвета:

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

Или используйте эквивалентную функцию Lerp, чтобы интерполировать ее к прозрачности:

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

(Кроме того, если вы изменили свое состояние наложения без предварительного умножения,Правильно, вам придется изменить импорт контента, чтобы предварительно не умножать текстуры, и обеспечить, чтобы ваш контент содержал смешиваемые данные по прозрачным краям.)

1 голос
/ 29 марта 2011

Убедитесь, что ваш звонок на spriteBatch.Begin() включает в себя необходимые параметры:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
0 голосов
/ 30 марта 2011

Оказывается, это сработало, я просто использовал неправильный BlendState, я переключился на BlendState.NonPremultiplied, и теперь он работает.

0 голосов
/ 29 марта 2011

Альфа-диапазон находится в диапазоне от 1 (полностью непрозрачный) до 0 (полностью прозрачный), также я считаю, что это число с плавающей точкой.Итак, вы выходите за пределы его диапазона.

edit: попробуйте уменьшить его на 0,1, а если оно меньше или равно нулю, удалить его

...