Подведение итогов различных числовых эффектов для одной переменной - PullRequest
3 голосов
/ 06 февраля 2012
public class ComEffectColor : ComEffectBase<Ref<Color>>
{
    private readonly Color finalColor;
    private Color originalColor;

    public ComEffectColor(Ref<Color> effectTarget, Color finalColor, TimeSpan duration, TimeSpan startDelay) 
        : base(effectTarget, duration, startDelay)
    {
        this.finalColor = finalColor;

        StartDelayEnded += ComEffectColorStartDelayEnded;
    }

    protected override void UpdateCustom()
    {
        if (elapsedTime < duration)
        {
            float progress = (float)(elapsedTime.TotalMilliseconds / duration.TotalMilliseconds);

            effectTarget.Value = Color.Lerp(originalColor, finalColor, progress);
        }
        else
        {
            effectTarget.Value = finalColor;

            InvokeFinished();
        }
    }

    void ComEffectColorStartDelayEnded(object sender, EventArgs e)
    {
        originalColor = effectTarget.Value;
    }
}

Это конструктор класса ComEffectColor: IComEffect . Его функция заключается в получении указателя на цветовую переменную, которая может принадлежать любому другому объекту, и постепенном изменении его значения в направлении «targetColor» в течение указанной продолжительности.

после инициализации такого класса эффекта он добавляется в экземпляр ComEffectManager, который обрабатывает их обновление и удаление после их завершения.

Проблема, с которой я сталкиваюсь, заключается в том, чтобы включить смешивание двух или более ComEffectColor для одной и той же цветовой переменной. Поэтому, если я начну с цветовой переменной черного цвета (0, 0, 0) и добавлю 2 ComEffectColor с продолжительностью 1 секунда каждый, где целевой цвет первого равен (128, 128, 128), а другой - (0, 0, 0), через 1 секунду я должен получить (64, 64, 64).

Я хочу, чтобы эффекты были независимыми, поэтому я не хочу сначала собирать все смещения цвета, находить «суммирование силы» и применять это к переменной цвета. Это связано с другими функциями IComEffect, но я не хочу делать это очень длинным постом.

Другие эффекты могут быть добавлены, пока эти 2 в приведенном выше примере все еще работают.

Есть идеи, как это можно сделать?

Приведенный выше код является наивной реализацией, которая перезаписывает другие эффекты, запущенные одновременно. Это не полный класс, поскольку он наследуется от ComEffectBase, который обрабатывает все общие процедуры всех видов эффектов.

1 Ответ

1 голос
/ 22 февраля 2012

Я не думаю, что это возможно без сбора всех ваших результатов трансформации и определения цели «окончательной трансформации».

Например, если вы исключите код и просто скажете это по-английски (действительно, по математике): ваша цветовая функция c начинается в момент времени t0 в цвете c (t0), и через некоторое время t1 вы можете прийти к двум «финальным» «цвета, c (t1) и / или c '(t1). Это не имеет смысла, потому что вы не можете провести одну переменную через два пути к двум разным цветам (без особой перепрошивки). Таким образом, вместо этого вы действительно говорите: не выбирайте два пути, выберите один путь: средний путь (или какой-то другой путь).

Единственный способ сделать это детерминистически - это иметь функцию, которая может выбрать следующий выход. Это эквивалентно применению второй функции, скажем, f, которая принимает в качестве параметров время и возможные пути (c и c ') = f (t, c, c'). Для среднего пути f необходимо знать все пути для усреднения среди них.

Возможно, вы могли бы сделать более быструю функцию "выбора", которая просто берет первый или последний путь. Но это не соответствовало вашим требованиям. (или если у вас есть доступ к квантовому компьютеру ... ;-))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...