Ejemplo n.º 1
0
        // 進行と描画


        /// <returns>クリアしたらtrueを返す。</returns>
        public bool 進行描画する(double 現在の演奏時刻sec, ref int 描画開始チップ番号, チップの演奏状態 state, チップ chip, int index, double ヒット判定バーと描画との時間sec, double ヒット判定バーと発声との時間sec, double ヒット判定バーとの距離dpx)
        {
            float たて中央位置dpx = (float)(演奏ステージ.ヒット判定位置Ydpx + ヒット判定バーとの距離dpx);
            float 消滅割合      = 0f;

            #region " 消滅割合を算出; チップがヒット判定バーを通過したら徐々に消滅する。"
            //----------------
            const float 消滅を開始するヒット判定バーからの距離dpx = 20f;
            const float 消滅開始から完全消滅するまでの距離dpx   = 70f;

            if (消滅を開始するヒット判定バーからの距離dpx < ヒット判定バーとの距離dpx)    // 通過した
            {
                // 通過距離に応じて 0→1の消滅割合を付与する。0で完全表示、1で完全消滅、通過してなければ 0。
                消滅割合 = Math.Min(1f, (float)((ヒット判定バーとの距離dpx - 消滅を開始するヒット判定バーからの距離dpx) / 消滅開始から完全消滅するまでの距離dpx));
            }
            //----------------
            #endregion

            #region " チップが描画開始チップであり、かつ、そのY座標が画面下端を超えたなら、描画開始チップ番号を更新する。"
            //----------------
            if ((index == 描画開始チップ番号) &&
                (DXResources.Instance.設計画面サイズ.Height + 40.0 < たて中央位置dpx))      // +40 はチップが隠れるであろう適当なマージン。
            {
                描画開始チップ番号++;

                // 描画開始チップがチップリストの末尾に到達したら、演奏を終了する。
                if (App進行描画.演奏スコア.チップリスト.Count <= 描画開始チップ番号)
                {
                    描画開始チップ番号 = -1;    // 演奏完了。
                    return(true);      // クリア。
                }

                return(false);
            }
            //----------------
            #endregion

            if (state.可視)
            {
                return(false);
            }

            // BASICモードでは、チップの大きさは変化しない。
            float 大きさ0to1 = 1.0f;

            // チップ種別 から、表示レーン種別 と 表示チップ種別 を取得。
            var 表示レーン種別 = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別].表示レーン種別;
            var 表示チップ種別 = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別].表示チップ種別;

            if ((表示レーン種別 != DTXMania.表示レーン種別.Unknown) &&     // Unknwon ならチップを表示しない。
                (表示チップ種別 != DTXMania.表示チップ種別.Unknown))       //
            {
                var 左端位置dpx  = レーンフレーム.領域.Left + レーンフレーム.現在のレーン配置.表示レーンの左端位置dpx[表示レーン種別];
                var 中央位置Xdpx = 左端位置dpx + レーンフレーム.現在のレーン配置.表示レーンの幅dpx[表示レーン種別] / 2f;

                #region " チップ背景(あれば)を描画する。"
                //----------------
                {
                    var 矩形 = this._ドラムチップの矩形リスト[表示チップ種別.ToString() + "_back"];

                    if ((null != 矩形) && ((0 < 矩形.Width && 0 < 矩形.Height)))
                    {
                        var 矩形中央  = new Vector2(矩形.Width / 2f, 矩形.Height / 2f);
                        var アニメ割合 = this._ドラムチップアニメ.現在値の割合;   // 0→1のループ

                        var 換行列 = (0 >= 消滅割合) ? Matrix.Identity : Matrix.Scaling(1f - 消滅割合, 1f, 0f);

                        // 変換(1) 拡大縮小、回転
                        // → 現在は、どの表示チップ種別の背景がどのアニメーションを行うかは、コード内で名指しする(固定)。
                        switch (表示チップ種別)
                        {
                        case 表示チップ種別.LeftCymbal:
                        case 表示チップ種別.RightCymbal:
                        case 表示チップ種別.HiHat:
                        case 表示チップ種別.HiHat_Open:
                        case 表示チップ種別.HiHat_HalfOpen:
                        case 表示チップ種別.Foot:
                        case 表示チップ種別.LeftBass:
                        case 表示チップ種別.Tom3:
                        case 表示チップ種別.Tom3_Rim:
                        case 表示チップ種別.LeftRide:
                        case 表示チップ種別.RightRide:
                        case 表示チップ種別.LeftRide_Cup:
                        case 表示チップ種別.RightRide_Cup:
                        case 表示チップ種別.LeftChina:
                        case 表示チップ種別.RightChina:
                        case 表示チップ種別.LeftSplash:
                        case 表示チップ種別.RightSplash:
                            #region " 縦横に伸び縮み "
                            //----------------
                        {
                            float v = (float)(Math.Sin(2 * Math.PI * アニメ割合) * 0.2);                 // -0.2~0.2 の振動

                            換行列 = 換行列 * Matrix.Scaling((float)(1 + v), (float)(1 - v) * 1.0f, 0f);  // チップ背景は大きさを変えない
                        }
                            //----------------
                            #endregion
                            break;

                        case 表示チップ種別.Bass:
                            #region " 左右にゆらゆら回転 "
                            //----------------
                        {
                            float r = (float)(Math.Sin(2 * Math.PI * アニメ割合) * 0.2); // -0.2~0.2 の振動
                            換行列 = 換行列 *
                                  Matrix.Scaling(1f, 1f, 0f) *                      // チップ背景は大きさを変えない
                                  Matrix.RotationZ((float)(r * Math.PI));
                        }
                            //----------------
                            #endregion
                            break;
                        }

                        // 変換(2) 移動
                        換行列 = 換行列 *
                              Matrix.Translation(
                            DXResources.Instance.画面左上dpx.X + 中央位置Xdpx,
                            DXResources.Instance.画面左上dpx.Y - たて中央位置dpx,
                            0f);

                        // 描画。
                        //if( 表示チップ種別 != 表示チップ種別.HiHat &&         // 暫定処置:これらでは背景画像を表示しない
                        //    表示チップ種別 != 表示チップ種別.LeftRide &&      //
                        //    表示チップ種別 != 表示チップ種別.RightRide &&     //
                        //    表示チップ種別 != 表示チップ種別.LeftRide_Cup &&  //
                        //    表示チップ種別 != 表示チップ種別.RightRide_Cup )
                        {
                            this._ドラムチップ画像.描画する(
                                換行列,
                                転送元矩形: 矩形);
                        }
                    }
                }
                //----------------
                #endregion

                #region " チップ本体を描画する。"
                //----------------
                {
                    var 矩形 = this._ドラムチップの矩形リスト[表示チップ種別.ToString()];

                    if ((null != 矩形) && ((0 < 矩形.Width && 0 < 矩形.Height)))
                    {
                        var sx = (0.6f + (0.4f * 大きさ0to1)) * ((0 >= 消滅割合) ? 1f : 1f - 消滅割合);
                        var sy = 大きさ0to1;

                        var 換行列 =
                            Matrix.Scaling(sx, sy, 0f) *
                            Matrix.Translation(
                                DXResources.Instance.画面左上dpx.X + 中央位置Xdpx,
                                DXResources.Instance.画面左上dpx.Y - たて中央位置dpx,
                                0f);

                        this._ドラムチップ画像.描画する(
                            換行列,
                            転送元矩形: 矩形);
                    }
                }
                //----------------
                #endregion
            }

            return(false);
        }
Ejemplo n.º 2
0
        // 進行と描画


        /// <returns>クリアしたらtrueを返す。</returns>
        public bool 進行描画する(レーンフレーム frame, double 現在の演奏時刻sec, ref int 描画開始チップ番号, チップの演奏状態 state, チップ chip, int index, double ヒット判定バーと描画との時間sec, double ヒット判定バーと発声との時間sec, double ヒット判定バーとの距離dpx)
        {
            float たて中央位置dpx = (float)(演奏ステージ.ヒット判定位置Ydpx + ヒット判定バーとの距離dpx);
            float 消滅割合      = 0f;

            #region " 消滅割合を算出; チップがヒット判定バーを通過したら徐々に消滅する。"
            //----------------
            const float 消滅を開始するヒット判定バーからの距離dpx = 20f;
            const float 消滅開始から完全消滅するまでの距離dpx   = 70f;

            if (消滅を開始するヒット判定バーからの距離dpx < ヒット判定バーとの距離dpx)    // 通過した
            {
                // 通過距離に応じて 0→1の消滅割合を付与する。0で完全表示、1で完全消滅、通過してなければ 0。
                消滅割合 = Math.Min(1f, (float)((ヒット判定バーとの距離dpx - 消滅を開始するヒット判定バーからの距離dpx) / 消滅開始から完全消滅するまでの距離dpx));
            }
            //----------------
            #endregion

            #region " チップが描画開始チップであり、かつ、そのY座標が画面下端を超えたなら、描画開始チップ番号を更新する。"
            //----------------
            if ((index == 描画開始チップ番号) &&
                (グラフィックデバイス.Instance.設計画面サイズ.Height + 40.0 < たて中央位置dpx))      // +40 はチップが隠れるであろう適当なマージン。
            {
                描画開始チップ番号++;

                // 描画開始チップがチップリストの末尾に到達したら、演奏を終了する。
                if (App進行描画.演奏スコア.チップリスト.Count <= 描画開始チップ番号)
                {
                    描画開始チップ番号 = -1;    // 演奏完了。
                    return(true);      // クリア。
                }

                return(false);
            }
            //----------------
            #endregion

            if (state.可視)
            {
                return(false);
            }

            float 大きさ0to1 = 1.0f;

            #region " 音量からチップの大きさを計算する。"
            //----------------
            if (chip.チップ種別 != チップ種別.Snare_Ghost)    // Ghost は対象外
            {
                // 既定音量未満は大きさを小さくするが、既定音量以上は大きさ1.0のままとする。最小は 0.3。
                大きさ0to1 = MathUtil.Clamp(chip.音量 / (float)チップ.既定音量, 0.3f, 1.0f);
            }
            //----------------
            #endregion

            // チップ種別 から、表示レーン種別 と 表示チップ種別 を取得。
            var 表示レーン種別 = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別].表示レーン種別;
            var 表示チップ種別 = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別].表示チップ種別;

            if ((表示レーン種別 != DTXMania.表示レーン種別.Unknown) &&     // Unknwon ならチップを表示しない。
                (表示チップ種別 != DTXMania.表示チップ種別.Unknown))       //
            {
                #region " チップを描画する。"
                //----------------
                switch (chip.チップ種別)
                {
                case チップ種別.LeftCrash:
                    this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.HiHat_Close:
                    this._アニメチップを1つ描画する(表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.HiHat_HalfOpen:
                    this._アニメチップを1つ描画する(表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat], たて中央位置dpx, 大きさ0to1);
                    this._単画チップを1つ描画する(表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_HalfOpen], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.HiHat_Open:
                    this._アニメチップを1つ描画する(表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat], たて中央位置dpx, 大きさ0to1);
                    this._単画チップを1つ描画する(表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_Open], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.HiHat_Foot:
                    this._単画チップを1つ描画する(表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.Foot], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.Snare:
                    this._アニメチップを1つ描画する(表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.Snare_ClosedRim:
                    this._単画チップを1つ描画する(表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_ClosedRim], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.Snare_OpenRim:
                    this._単画チップを1つ描画する(表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_OpenRim], たて中央位置dpx, 大きさ0to1);
                    //this._単画チップを1つ描画する( 表示レーン種別.Snare, this._ドラムチップの矩形リスト[ 表示チップ種別.Snare ], たて中央位置dpx, 大きさ0to1 );
                    // → ないほうがいいかも。
                    break;

                case チップ種別.Snare_Ghost:
                    this._単画チップを1つ描画する(表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_Ghost], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.Bass:
                    this._アニメチップを1つ描画する(表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.LeftBass:
                    this._アニメチップを1つ描画する(表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.Tom1:
                    this._アニメチップを1つ描画する(表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.Tom1_Rim:
                    this._単画チップを1つ描画する(表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1_Rim], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.Tom2:
                    this._アニメチップを1つ描画する(表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.Tom2_Rim:
                    this._単画チップを1つ描画する(表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2_Rim], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.Tom3:
                    this._アニメチップを1つ描画する(表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3], たて中央位置dpx, 大きさ0to1);
                    break;

                case チップ種別.Tom3_Rim:
                    this._単画チップを1つ描画する(表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3_Rim], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.RightCrash:
                    this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal], たて中央位置dpx
                                       , 大きさ0to1);
                    break;

                case チップ種別.China:
                    if (App進行描画.ユーザ管理.ログオン中のユーザ.表示レーンの左右.Chinaは左)
                    {
                        this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftChina], たて中央位置dpx, 大きさ0to1);
                    }
                    else
                    {
                        this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightChina], たて中央位置dpx, 大きさ0to1);
                    }
                    break;

                case チップ種別.Ride:
                    if (App進行描画.ユーザ管理.ログオン中のユーザ.表示レーンの左右.Rideは左)
                    {
                        this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide], たて中央位置dpx, 大きさ0to1);
                    }
                    else
                    {
                        this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide], たて中央位置dpx, 大きさ0to1);
                    }
                    break;

                case チップ種別.Ride_Cup:
                    if (App進行描画.ユーザ管理.ログオン中のユーザ.表示レーンの左右.Rideは左)
                    {
                        this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide_Cup], たて中央位置dpx, 大きさ0to1);
                    }
                    else
                    {
                        this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide_Cup], たて中央位置dpx, 大きさ0to1);
                    }
                    break;

                case チップ種別.Splash:
                    if (App進行描画.ユーザ管理.ログオン中のユーザ.表示レーンの左右.Splashは左)
                    {
                        this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftSplash], たて中央位置dpx, 大きさ0to1);
                    }
                    else
                    {
                        this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightSplash], たて中央位置dpx, 大きさ0to1);
                    }
                    break;

                case チップ種別.LeftCymbal_Mute:
                    this._単画チップを1つ描画する(表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal_Mute], たて中央位置dpx, 1.0f);
                    break;

                case チップ種別.RightCymbal_Mute:
                    this._単画チップを1つ描画する(表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal_Mute], たて中央位置dpx, 1.0f);
                    break;
                }
                //----------------
                #endregion
            }

            return(false);
        }