Анимация непрозрачности с течением времени в XNA - PullRequest
2 голосов
/ 27 апреля 2011

Я хотел бы анимировать значение непрозрачности текстовой строки, содержащей название уровня и с задержкой в ​​середине.

Таким образом, последовательность событий будет выглядеть так:

  1. Старт прозрачный
  2. Переход в сплошной белый цвет за секунду игрового времени
  3. Подождите секунду
  4. Спад в прозрачный цвет снова через секунду.

Код, который я написал для анимации альфа-значения, не работает.Кроме того, это довольно уродливо, и я уверен, что есть лучший способ сделать это с помощью платформы XNA.

Я не смог найти где-либо еще рекомендаций по этому поводу.Конечно, анимация таких ценностей не редкость.Как я могу это сделать?

Вот мой текущий код в соответствии с просьбой (да, это ужасно).

private int fadeStringDirection = +1;
private int fadeStringDuration = 1000;
private float stringAlpha = 0;
private int stringRef = 0;
private int stringPhase = 1;

...

if (!pause)
{
    totalMillisecondsElapsed += gameTime.ElapsedGameTime.Milliseconds;
    if (fadestringDirection != 0)
    {
        stringAlpha = ((float)(totalMillisecondsElapsed - stringRef) / (float)(fadeStringDuration*stringPhase)) * fadeStringDirection;
        stringAlpha = MathHelper.Clamp(stringAlpha, 0, 1);
        if (topAlpha / 2 + 0.5 == fadeStringDirection)
        {
            fadeStringDirection = 0;
            stringRef = totalMillisecondsElapsed;
            stringPhase++;
        }
    }
    else
    {
        stringRef += gameTime.ElapsedGameTime.Milliseconds;
        if (stringRef >= fadeStringDuration * stringPhase)
        {
            stringPhase++;
            fadeStringDirection = -1;
            stringRef = totalMillisecondsElapsed;
        }
    }
}

1 Ответ

2 голосов
/ 27 апреля 2011

Вот решение, которое у меня есть сейчас. Гораздо приятнее, чем у меня было раньше (и в своем классе).

/// <summary>
/// Animation helper class.
/// </summary>
public class Animation
{
    List<Keyframe> keyframes = new List<Keyframe>();

    int timeline;

    int lastFrame = 0;

    bool run = false;

    int currentIndex;

    /// <summary>
    /// Construct new animation helper.
    /// </summary>
    public Animation()
    {
    }

    public void AddKeyframe(int time, float value)
    {
        Keyframe k = new Keyframe();
        k.time = time;
        k.value = value;
        keyframes.Add(k);
        keyframes.Sort(delegate(Keyframe a, Keyframe b) { return a.time.CompareTo(b.time); });
        lastFrame = (time > lastFrame) ? time : lastFrame;
    }

    public void Start()
    {
        timeline = 0;
        currentIndex = 0;
        run = true;
    }

    public void Update(GameTime gameTime, ref float value)
    {
        if (run)
        {
            timeline += gameTime.ElapsedGameTime.Milliseconds;
            value = MathHelper.SmoothStep(keyframes[currentIndex].value, keyframes[currentIndex + 1].value, (float)timeline / (float)keyframes[currentIndex + 1].time);
            if (timeline >= keyframes[currentIndex + 1].time && currentIndex != keyframes.Count) { currentIndex++; }
            if (timeline >= lastFrame) { run = false; }
        }
    }

    public struct Keyframe
    {
        public int time;
        public float value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...