// 進行と描画 /// <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); }
// 進行と描画 /// <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); }