Beispiel #1
0
            public void 開始(アニメーション am)
            {
                this.ストーリーボード = new Storyboard(am.Manager);
                this.拡大率      = new Variable(am.Manager, initialValue: 1.0);
                this.振動幅      = new Variable(am.Manager, initialValue: 0.0);

                var 拡大率の遷移 = new List <Transition>()
                {
                    am.TrasitionLibrary.Linear(0.08, finalValue: 1.25),
                    am.TrasitionLibrary.Constant(0.3),
                    am.TrasitionLibrary.Linear(0.08, finalValue: 1.0),
                };

                for (int i = 0; i < 拡大率の遷移.Count; i++)
                {
                    this.ストーリーボード.AddTransition(this.拡大率, 拡大率の遷移[i]);
                    拡大率の遷移[i].Dispose();
                }

                var 振動幅の遷移 = new List <Transition>()
                {
                    am.TrasitionLibrary.Linear(0.08, finalValue: 6.0),
                    am.TrasitionLibrary.Constant(0.3),
                    am.TrasitionLibrary.Linear(0.08, finalValue: 0.0),
                };

                for (int i = 0; i < 振動幅の遷移.Count; i++)
                {
                    this.ストーリーボード.AddTransition(this.振動幅, 振動幅の遷移[i]);
                    振動幅の遷移[i].Dispose();
                }

                this.ストーリーボード.Schedule(am.Timer.Time);
            }
Beispiel #2
0
        // 進行と描画


        /// <param name="全体の中央位置">
        ///		パネル(dc)の左上を原点とする座標。
        /// </param>
        public void 進行描画する(DeviceContext dc, アニメーション am, Vector2 全体の中央位置, 成績 現在の成績)
        {
            // 進行。

            if (this._現在表示中のスコア < 現在の成績.Score)
            {
                int 増分    = 現在の成績.Score - this._現在表示中のスコア;
                int 追っかけ分 = Math.Max((int)(増分 * 0.75), 1);      // VPS に依存するけどまあいい
                this._現在表示中のスコア = Math.Min(this._現在表示中のスコア + 追っかけ分, 現在の成績.Score);
            }

            int スコア値 = Math.Min(Math.Max(this._現在表示中のスコア, 0), 999999999); // プロパティには制限はないが、表示は999999999(9桁)でカンスト。

            string 数字     = スコア値.ToString().PadLeft(9);                   // 右詰め9桁、余白は ' '。
            var    全体のサイズ = new Vector2(62f * 9f, 99f);                   // 固定とする


            // 1桁ずつ描画。

            var 文字間隔補正 = -10f;
            var 文字の位置  = new Vector2(-(全体のサイズ.X / 2f), 0f);

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                var pretrans      = dc.Transform;
                dc.PrimitiveBlend = PrimitiveBlend.SourceOver;

                for (int i = 0; i < 数字.Length; i++)
                {
                    // 前回の文字と違うなら、桁アニメーション開始。
                    if (数字[i] != this._前回表示した数字[i])
                    {
                        this._各桁のアニメ[i].跳ね開始(am, 0.0);
                    }

                    var 転送元矩形 = this._スコア数字の矩形リスト[数字[i].ToString()];

                    dc.Transform =
                        //Matrix3x2.Scaling( 画像矩形から表示矩形への拡大率 ) *
                        Matrix3x2.Translation(文字の位置.X, 文字の位置.Y + (float)(this._各桁のアニメ[i].Yオフセット?.Value ?? 0.0f)) *
                        //Matrix3x2.Scaling( 全体の拡大率.X, 全体の拡大率.Y, center: new Vector2( 0f, 全体のサイズ.Y / 2f ) ) *
                        Matrix3x2.Translation(全体の中央位置) *
                        pretrans;

                    dc.DrawBitmap(this._スコア数字画像.Bitmap, 1f, BitmapInterpolationMode.Linear, 転送元矩形);

                    文字の位置.X += (転送元矩形.Width + 文字間隔補正) * 1f;  // 画像矩形から表示矩形への拡大率.X;
                }
            });

            // 更新。
            this._前回表示したスコア = this._現在表示中のスコア;
            this._前回表示した数字  = 数字;
        }
Beispiel #3
0
        private void _選択ノードのオフセットアニメをリセットする(アニメーション am)
        {
            this._選択ノードの表示オフセットdpx?.Dispose();
            this._選択ノードの表示オフセットdpx = new Variable(am.Manager, initialValue: 0.0);

            this._選択ノードの表示オフセットのストーリーボード?.Abandon();
            this._選択ノードの表示オフセットのストーリーボード?.Dispose();
            this._選択ノードの表示オフセットのストーリーボード = new Storyboard(am.Manager);

            using (var 維持 = am.TrasitionLibrary.Constant(0.15))
                using (var 左へ移動 = am.TrasitionLibrary.Linear(0.07, finalValue: -50f))
                {
                    this._選択ノードの表示オフセットのストーリーボード.AddTransition(this._選択ノードの表示オフセットdpx, 維持);
                    this._選択ノードの表示オフセットのストーリーボード.AddTransition(this._選択ノードの表示オフセットdpx, 左へ移動);
                }

            this._選択ノードの表示オフセットのストーリーボード.Schedule(am.Timer.Time);
        }
Beispiel #4
0
            public void 跳ね開始(アニメーション am, double 遅延sec)
            {
                this.Dispose();

                this.ストーリーボード = new Storyboard(am.Manager);
                this.Yオフセット   = new Variable(am.Manager, initialValue: 0.0);

                var Yオフセットの遷移 = new List <Transition>()
                {
                    am.TrasitionLibrary.Constant(遅延sec),
                    am.TrasitionLibrary.Linear(0.05, finalValue: -10.0),        // 上へ移動
                    am.TrasitionLibrary.Linear(0.05, finalValue: 0.0),          // 下へ戻る
                };

                for (int i = 0; i < Yオフセットの遷移.Count; i++)
                {
                    this.ストーリーボード.AddTransition(this.Yオフセット, Yオフセットの遷移[i]);
                    Yオフセットの遷移[i].Dispose();
                }
                this.ストーリーボード.Schedule(am.Timer.Time);
            }
Beispiel #5
0
            public void 落下開始(アニメーション am)
            {
                this.Dispose();

                this.ストーリーボード = new Storyboard(am.Manager);
                this.Yオフセット   = new Variable(am.Manager, initialValue: -70.0);
                this.透明度      = new Variable(am.Manager, initialValue: 1.0);

                var Yオフセットの遷移 = new List <Transition>()
                {
                    am.TrasitionLibrary.Linear(0.05, finalValue: 0.0),          // 落下
                    am.TrasitionLibrary.Reversal(0.03),                         // 短時間でベクトル反転(下から上へ)
                    am.TrasitionLibrary.Reversal(0.05),                         // 上にはねて戻る
                };

                for (int i = 0; i < Yオフセットの遷移.Count; i++)
                {
                    this.ストーリーボード.AddTransition(this.Yオフセット, Yオフセットの遷移[i]);
                    Yオフセットの遷移[i].Dispose();
                }
                this.ストーリーボード.Schedule(am.Timer.Time);
            }
Beispiel #6
0
        // 進行と描画


        /// <param name="全体の中央位置">
        ///		パネル(dc)の左上を原点とする座標。
        /// </param>
        public void 進行描画する(DeviceContext dc, アニメーション am, Vector2 全体の中央位置, 成績 現在の成績)
        {
            int Combo値 = Math.Min(Math.Max(現在の成績.Combo, 0), 9999);      // 表示は9999でカンスト。

            if (Combo値 < 10)
            {
                return; // 10未満は表示しない。
            }
            // 進行。

            if ((this._前回表示した値 % 100) > (Combo値 % 100))
            {
                // 100を超えるたびアニメ開始。
                this._百ごとのアニメ.開始(am);
            }

            var 数字 = Combo値.ToString().PadLeft(4).Replace(' ', 'o');     // 右詰め4桁、余白は 'o'。
            var 画像矩形から表示矩形への拡大率 = new Vector2(264f / (142f * 4f), 140f / 188f);
            var 文字間隔補正          = -10f;
            var 全体の拡大率          = new Vector2((float)(this._百ごとのアニメ.拡大率?.Value ?? 1.0));

            // 全体のサイズを算出。
            var 全体のサイズ = new Vector2(0f, 0f);

            for (int i = 0; i < 数字.Length; i++)
            {
                var 矩形 = this._コンボ文字の矩形リスト[数字[i].ToString()];
                全体のサイズ.X += 矩形.Width + 文字間隔補正;             // 合計
                全体のサイズ.Y  = Math.Max(全体のサイズ.Y, 矩形.Height); // 最大値
            }
            全体のサイズ = 全体のサイズ * 画像矩形から表示矩形への拡大率;

            // 全体の位置を修正。
            全体の中央位置.Y -= 全体のサイズ.Y / 2f;
            var 振動幅 = (float)(this._百ごとのアニメ.振動幅?.Value ?? 0.0f);

            if (0.0f < 振動幅)
            {
                全体の中央位置.X += App進行描画.乱数.NextFloat(-振動幅, +振動幅);
                全体の中央位置.Y += App進行描画.乱数.NextFloat(-振動幅, +振動幅);
            }


            // 1桁ずつ描画。

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                var pretrans      = dc.Transform;
                dc.PrimitiveBlend = PrimitiveBlend.SourceOver;

                #region " 数字を描画。"
                //----------------
                {
                    var 文字の位置 = new Vector2(-(全体のサイズ.X / 2f), 0f);

                    for (int i = 0; i < 数字.Length; i++)
                    {
                        if (数字[i] != this._前回表示した数字[i])
                        {
                            // 桁アニメーション開始
                            this._各桁のアニメ[i].落下開始(am);

                            // 1の位以外は、自分より上位の桁を順番に跳ねさせる。
                            if (3 > i)
                            {
                                for (int p = (i - 1); p >= 0; p--)
                                {
                                    this._各桁のアニメ[p].跳ね開始(am, 0.05 * ((i - 1) - p + 1));
                                }
                            }
                        }

                        var 転送元矩形 = this._コンボ文字の矩形リスト[数字[i].ToString()];

                        dc.Transform =
                            Matrix3x2.Scaling(画像矩形から表示矩形への拡大率) *
                            Matrix3x2.Translation(文字の位置.X, 文字の位置.Y + (float)(this._各桁のアニメ[i].Yオフセット?.Value ?? 0.0f)) *
                            Matrix3x2.Scaling(全体の拡大率.X, 全体の拡大率.Y, center: new Vector2(0f, 全体のサイズ.Y / 2f)) *
                            Matrix3x2.Translation(全体の中央位置) *
                            pretrans;

                        dc.DrawBitmap(this._コンボ文字画像.Bitmap, (float)(this._各桁のアニメ[i].透明度?.Value ?? 1.0f), BitmapInterpolationMode.Linear, 転送元矩形);

                        文字の位置.X += (転送元矩形.Width + 文字間隔補正) * 画像矩形から表示矩形への拡大率.X;
                    }
                }
                //----------------
                #endregion

                #region " Combo を描画。"
                //----------------
                {
                    var 転送元矩形 = this._コンボ文字の矩形リスト["Combo"];
                    var 文字の位置 = new Vector2(0f, 130f);

                    dc.Transform =
                        Matrix3x2.Scaling(画像矩形から表示矩形への拡大率) *
                        Matrix3x2.Translation(文字の位置) *
                        Matrix3x2.Scaling(全体の拡大率) *
                        Matrix3x2.Translation(全体の中央位置) *
                        pretrans;

                    dc.DrawBitmap(this._コンボ文字画像.Bitmap, 1.0f, BitmapInterpolationMode.Linear, 転送元矩形);
                }
                //----------------
                #endregion
            });

            // 保存
            this._前回表示した値  = 現在の成績.Combo;
            this._前回表示した数字 = 数字;
        }