/// <summary> /// 子要素が削除されたときに呼ばれます。 /// </summary> internal void ParentRemoved(EffectObject parent) { if (Parent == null) { throw new InvalidOperationException( "EntityObjectに親が設定されていません。"); } OnParentRemoved(parent); Parent = null; }
/// <summary> /// 子要素が追加されたときに呼ばれます。 /// </summary> internal void ParentAdded(EffectObject parent) { if (Parent != null) { throw new InvalidOperationException( "EntityObjectにはすでに親が設定されています。"); } Parent = parent; OnParentAdded(parent); }
/// <summary> /// エレメントのアンロードを行います。 /// </summary> protected override void OnTerminate() { if (this.prevBg != null) { this.prevBg.Terminate(); this.prevBg = null; } if (this.nextBg != null) { this.nextBg.Terminate(); this.nextBg = null; } base.OnTerminate(); }
/// <summary> /// 次に表示する背景エフェクトを設定します。 /// </summary> public void AddBackgroundEffect(EffectObject effect, TimeSpan? duration = null) { // 同じエフェクトは表示しません。 if ((this.prevBg == null && effect == null) || (this.prevBg != null && effect != null && this.prevBg.Name == effect.Name)) { return; } // 古い背景エフェクトの廃棄 if (this.nextBg != null) { this.nextBg.Terminate(); this.nextBg = null; } // 次の背景に設定 this.nextBg = effect; StartTransition(duration); }
protected virtual void OnParentRemoved(EffectObject parent) { // 何もしません。 }
protected override void OnParentRemoved(EffectObject parent) { base.OnParentRemoved(parent); GLContainer = null; }
protected override void OnParentAdded(EffectObject parent) { base.OnParentAdded(parent); var glParent = parent as GLEvaluationElement; if (glParent != null && glParent.GLContainer != null) { InitializeOpenGL(glParent.GLContainer); } }
/// <summary> /// 背景のトランジションを開始します。 /// </summary> private void StartTransition(TimeSpan? duration) { var timeSpan = (duration != null ? duration.Value : DefaultFadeDuration); // animForeはnextBgに対応し、0⇒1でαが変わる。 // animBackはprevBgに対応し、1⇒0でαが変わる。 var animFore = new DoubleAnimationUsingKeyFrames { TargetProperty = "Opacity", FillBehavior = FillBehavior.HoldEnd, }; animFore.KeyFrames.Add(new LinearDoubleKeyFrame(0.0, TimeSpan.Zero)); animFore.KeyFrames.Add(new LinearDoubleKeyFrame(1.0, timeSpan)); var animBack = new DoubleAnimationUsingKeyFrames { TargetProperty = "Opacity", FillBehavior = FillBehavior.HoldEnd, }; animBack.KeyFrames.Add(new LinearDoubleKeyFrame(1.0, TimeSpan.Zero)); animBack.KeyFrames.Add(new LinearDoubleKeyFrame(0.0, timeSpan)); // アニメーション完了時は、nextBg(実際はprevBg)を廃棄します。 animBack.Completed += (_, __) => this.nextBg = null; // prevには古い背景が入っています。 if (this.prevBg != null) { this.prevBg.Scenario.Children.Add(animBack); } if (this.nextBg != null) { this.nextBg.Scenario.Children.Add(animFore); } // アニメーション開始前にオブジェクトの内容を入れ替えます。 Util.Swap(ref this.prevBg, ref this.nextBg); }
/// <summary> /// エフェクトを削除します。 /// </summary> public void RemoveEffect(EffectObject effect) { if (effect == null) { return; } Children.Remove(effect); }
/// <summary> /// エフェクトを追加します。 /// </summary> public void AddEffect(EffectObject effect) { if (effect == null) { return; } Children.Add(effect); }