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的一个实例中,它在完成后处理它们的更新和删除。
我面临的问题是如何在同一个颜色变量上混合使用2个或更多ComEffectColor。所以,如果我从一个黑色(0,0,0)的颜色变量开始,我添加2个ComEffectColor,每个持续1秒,其中第一个的目标颜色是(128,128,128),另一个是(0, 0,0),1秒后我应该以(64,64,64)结束。
我希望效果是独立的,所以我不想先收集所有颜色偏移并找到“力的总和”并将其应用于颜色变量。这是由于IComEffect的其他功能,但我不想让这个很长的帖子。
可以添加其他效果,而上例中的这两个效果仍在运行。
任何想法如何做到这一点?
上面的代码是覆盖同时运行的其他效果的天真实现。这不是完整的类,因为它继承自ComEffectBase,后者处理各种效果的所有常见例程。
答案 0 :(得分:1)
如果不收集所有转化结果并确定“最终转化”目标,我认为这是不可能的。
例如,如果你删除了代码并且只用英语(数学真的)说这个:你的颜色函数c在颜色c(t0)的时间t0开始,并且在一段时间t1之后,你可以到达两个“最终“颜色,c(t1)和/或c'(t1)。这没有意义,因为你不能通过两个路径将一个变量带到两种不同的颜色(没有大量的闪烁)。所以相反,你实际上是说不要采取两条路径,采取一条路径:平均路径(或其他路径)。
确定性地执行此操作的唯一方法是使用可以选择其下一个输出的函数。这相当于应用第二个函数,比如f,它作为参数,时间和可能的路径(c和c')= f(t,c,c')。 对于平均路径,f需要知道它们之间的所有平均路径。
也许你可以做一个更快的“选择”功能,它只采取第一条路径或最后一条路径。但这与您的要求不符。 (或者如果你有权访问量子计算机...... ;-))