// 進行と描画 public 演奏結果 進行描画する(DeviceContext d2ddc, ref int 描画開始チップ番号, チップの演奏状態 state, SSTF.チップ chip, int index, double ヒット判定バーとの距離dpx) { float たて中央位置dpx = (float)(演奏ステージ.ヒット判定位置Ydpx + ヒット判定バーとの距離dpx); float 消滅割合 = 0f; const double チップが隠れるであろう適切なマージン = 40.0; #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 bool チップが描画開始チップである = (index == 描画開始チップ番号); bool チップのY座標が画面下端を越えて隠れた = (Global.GraphicResources.設計画面サイズ.Height + チップが隠れるであろう適切なマージン < たて中央位置dpx); if (チップが描画開始チップである && チップのY座標が画面下端を越えて隠れた) { #region " 描画開始チップ番号を更新し、演奏クリアのチェックを行う。" //---------------- 描画開始チップ番号++; // 描画開始チップがチップリストの末尾に到達したらクリア。 if (Global.App.演奏スコア.チップリスト.Count <= 描画開始チップ番号) { 描画開始チップ番号 = -1; return(演奏結果.クリア); } //---------------- #endregion } else if (!state.可視) // 不可視チップは表示しない。 { #region " ドラムチップを描画する。" //---------------- var userConfig = Global.App.ログオン中のユーザ; // 音量からチップの大きさを計算する。 var 大きさ0to1 = new Size2F(1f, 1f); // 音量を反映した大きさ(縦横の倍率)。 var 等倍 = new Size2F(1f, 1f); // 音量を反映しない場合はこっちを使う。 if (userConfig.音量に応じてチップサイズを変更する && chip.チップ種別 != SSTF.チップ種別.Snare_Ghost) // Snare Ghost は対象外 { // 既定音量未満は大きさを小さくするが、既定音量以上は大きさ1.0のままとする。最小は 0.3。 大きさ0to1 = new Size2F(1f, MathUtil.Clamp(chip.音量 / (float)SSTF.チップ.既定音量, 0.3f, 1.0f)); // 現状、音量は縦方向にのみ影響する。 } var 表示レーン種別 = userConfig.ドラムチッププロパティリスト[chip.チップ種別].表示レーン種別; var 表示チップ種別 = userConfig.ドラムチッププロパティリスト[chip.チップ種別].表示チップ種別; if (表示レーン種別 != 表示レーン種別.Unknown && 表示チップ種別 != 表示チップ種別.Unknown) // Unknwon ならチップを表示しない。 { // チップを描画する。 switch (chip.チップ種別) { case SSTF.チップ種別.LeftCrash: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.HiHat_Close: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.HiHat_HalfOpen: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_HalfOpen.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.HiHat_Open: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_Open.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.HiHat_Foot: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.Foot.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.Snare: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.Snare_ClosedRim: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_ClosedRim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.Snare_OpenRim: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_OpenRim.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); //this._単画チップを1つ描画する( dc,表示レーン種別.Snare, this._ドラムチップの矩形リスト[ 表示チップ種別.Snare.ToString() ]!.Value, たて中央位置dpx, 大きさ0to1, 消滅割合 ); // → ないほうがいいかも。 break; case SSTF.チップ種別.Snare_Ghost: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_Ghost.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.Bass: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.LeftBass: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.Tom1: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.Tom1_Rim: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.Tom2: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.Tom2_Rim: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.Tom3: this._アニメチップを1つ描画する(d2ddc, 表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.Tom3_Rim: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.RightCrash: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case SSTF.チップ種別.China: if (userConfig.表示レーンの左右.Chinaは左) { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftChina.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightChina.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case SSTF.チップ種別.Ride: if (userConfig.表示レーンの左右.Rideは左) { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case SSTF.チップ種別.Ride_Cup: if (userConfig.表示レーンの左右.Rideは左) { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide_Cup.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide_Cup.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case SSTF.チップ種別.Splash: if (userConfig.表示レーンの左右.Splashは左) { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftSplash.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightSplash.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case SSTF.チップ種別.LeftCymbal_Mute: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal_Mute.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case SSTF.チップ種別.RightCymbal_Mute: this._単画チップを1つ描画する(d2ddc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal_Mute.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; } } //---------------- #endregion } return(演奏結果.演奏中); }
// 進行と描画 /// <returns>クリアしたらtrueを返す。</returns> public bool 進行描画する(DeviceContext dc, ref int 描画開始チップ番号, チップの演奏状態 state, チップ chip, int index, 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 == 描画開始チップ番号) && (Global.GraphicResources.設計画面サイズ.Height + 40.0 < たて中央位置dpx)) // +40 はチップが隠れるであろう適当なマージン。 { 描画開始チップ番号++; // 描画開始チップがチップリストの末尾に到達したら、演奏を終了する。 if (Global.App.演奏スコア.チップリスト.Count <= 描画開始チップ番号) { 描画開始チップ番号 = -1; // 演奏完了。 return(true); // クリア。 } return(false); } //---------------- #endregion if (state.可視) { return(false); } var 大きさ0to1 = new Size2F(1f, 1f); // 音量を反映した大きさ(縦横の倍率)。 var 等倍 = new Size2F(1f, 1f); // 音量を反映しない場合はこっちを使う。 var userConfig = Global.App.ログオン中のユーザ; #region " 音量からチップの大きさを計算する。" //---------------- if (userConfig.音量に応じてチップサイズを変更する) { if (chip.チップ種別 != チップ種別.Snare_Ghost) // Ghost は対象外 { // 既定音量未満は大きさを小さくするが、既定音量以上は大きさ1.0のままとする。最小は 0.3。 大きさ0to1 = new Size2F(1f, MathUtil.Clamp(chip.音量 / (float)チップ.既定音量, 0.3f, 1.0f)); // 現状、音量は縦方向にのみ影響する。 } } //---------------- #endregion // チップ種別 から、表示レーン種別 と 表示チップ種別 を取得。 var 表示レーン種別 = userConfig.ドラムチッププロパティリスト[chip.チップ種別].表示レーン種別; var 表示チップ種別 = userConfig.ドラムチッププロパティリスト[chip.チップ種別].表示チップ種別; if ((表示レーン種別 != 表示レーン種別.Unknown) && // Unknwon ならチップを表示しない。 (表示チップ種別 != 表示チップ種別.Unknown)) // { #region " チップを描画する。" //---------------- switch (chip.チップ種別) { case チップ種別.LeftCrash: this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.HiHat_Close: this._アニメチップを1つ描画する(dc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.HiHat_HalfOpen: this._アニメチップを1つ描画する(dc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); this._単画チップを1つ描画する(dc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_HalfOpen.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.HiHat_Open: this._アニメチップを1つ描画する(dc, 表示レーン種別.HiHat, this._ドラムチップの矩形リスト[表示チップ種別.HiHat.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); this._単画チップを1つ描画する(dc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.HiHat_Open.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.HiHat_Foot: this._単画チップを1つ描画する(dc, 表示レーン種別.Foot, this._ドラムチップの矩形リスト[表示チップ種別.Foot.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.Snare: this._アニメチップを1つ描画する(dc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.Snare_ClosedRim: this._単画チップを1つ描画する(dc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_ClosedRim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.Snare_OpenRim: this._単画チップを1つ描画する(dc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_OpenRim.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); //this._単画チップを1つ描画する( dc,表示レーン種別.Snare, this._ドラムチップの矩形リスト[ 表示チップ種別.Snare.ToString() ]!.Value, たて中央位置dpx, 大きさ0to1, 消滅割合 ); // → ないほうがいいかも。 break; case チップ種別.Snare_Ghost: this._単画チップを1つ描画する(dc, 表示レーン種別.Snare, this._ドラムチップの矩形リスト[表示チップ種別.Snare_Ghost.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.Bass: this._アニメチップを1つ描画する(dc, 表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.LeftBass: this._アニメチップを1つ描画する(dc, 表示レーン種別.Bass, this._ドラムチップの矩形リスト[表示チップ種別.Bass.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.Tom1: this._アニメチップを1つ描画する(dc, 表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.Tom1_Rim: this._単画チップを1つ描画する(dc, 表示レーン種別.Tom1, this._ドラムチップの矩形リスト[表示チップ種別.Tom1_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.Tom2: this._アニメチップを1つ描画する(dc, 表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.Tom2_Rim: this._単画チップを1つ描画する(dc, 表示レーン種別.Tom2, this._ドラムチップの矩形リスト[表示チップ種別.Tom2_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.Tom3: this._アニメチップを1つ描画する(dc, 表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.Tom3_Rim: this._単画チップを1つ描画する(dc, 表示レーン種別.Tom3, this._ドラムチップの矩形リスト[表示チップ種別.Tom3_Rim.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.RightCrash: this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); break; case チップ種別.China: if (userConfig.表示レーンの左右.Chinaは左) { this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftChina.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightChina.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case チップ種別.Ride: if (userConfig.表示レーンの左右.Rideは左) { this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case チップ種別.Ride_Cup: if (userConfig.表示レーンの左右.Rideは左) { this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftRide_Cup.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightRide_Cup.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case チップ種別.Splash: if (userConfig.表示レーンの左右.Splashは左) { this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftSplash.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } else { this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightSplash.ToString()] !.Value, たて中央位置dpx, 大きさ0to1, 消滅割合); } break; case チップ種別.LeftCymbal_Mute: this._単画チップを1つ描画する(dc, 表示レーン種別.LeftCymbal, this._ドラムチップの矩形リスト[表示チップ種別.LeftCymbal_Mute.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; case チップ種別.RightCymbal_Mute: this._単画チップを1つ描画する(dc, 表示レーン種別.RightCymbal, this._ドラムチップの矩形リスト[表示チップ種別.RightCymbal_Mute.ToString()] !.Value, たて中央位置dpx, 等倍, 消滅割合); break; } //---------------- #endregion } return(false); }