private void _チップの発声がまだなら発声を行う(チップ chip, double 再生開始位置sec) { if (!(this._チップの演奏状態[chip].発声済みである)) { this._チップの演奏状態[chip].発声済みである = true; this._チップの発声を行う(chip, 再生開始位置sec); } }
private void _チップのヒット処理を行う(チップ chip, 判定種別 judge, bool 再生, bool 判定, bool 非表示, double ヒット判定バーと発声との時間sec) { this._チップの演奏状態[chip].ヒット済みである = true; if (再生 && (judge != 判定種別.MISS)) { #region " チップの発声がまだなら行う。" //---------------- // チップの発声時刻は、描画時刻と同じかそれより過去に位置するので、ここに来た時点で未発声なら発声していい。 // というか発声時刻が過去なのに未発声というならここが最後のチャンスなので、必ず発声しないといけない。 if (!(this._チップの演奏状態[chip].発声済みである)) { this._チップの発声を行う(chip, ヒット判定バーと発声との時間sec); this._チップの演奏状態[chip].発声済みである = true; } //---------------- #endregion } if (判定) { #region " チップの判定処理を行う。" //---------------- var 対応表 = App.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別]; if (judge != 判定種別.MISS) { // MISS以外(PERFECT~OK) this._チップ光.表示を開始する(対応表.表示レーン種別); this._ドラムパッド.ヒットする(対応表.表示レーン種別); this._レーンフラッシュ.開始する(対応表.表示レーン種別); } this._判定文字列.表示を開始する(対応表.表示レーン種別, judge); this.成績.ヒット数を加算する(judge); //---------------- #endregion } if (非表示) { #region " チップを非表示にする。" //---------------- if (judge == 判定種別.MISS) { // MISSチップは最後まで表示し続ける。 } else { // PERFECT~POOR チップは非表示。 this._チップの演奏状態[chip].可視 = false; } //---------------- #endregion } }
private void _チップの発声を行う(チップ chip, double 再生開始位置sec) { if (0 == chip.チップサブID) { #region " (A) SSTF 準拠のチップ " //---------------- if (chip.チップ種別 == チップ種別.背景動画) { // (A-a) 背景動画 App.サウンドタイマ.一時停止する(); // 止めても止めなくてもカクつくだろうが、止めておけば譜面は再開時にワープしない。 this._背景動画?.再生を開始する(); this._背景動画開始済み = true; this._BGM?.Play(再生開始位置sec); this._BGM再生開始済み = true; App.サウンドタイマ.再開する(); } else { // (A-b) ドラムサウンド // BGM以外のサウンドについては、常に最初から再生する。 App.ドラムサウンド.発声する(chip.チップ種別, 0, (chip.音量 / (float)チップ.最大音量)); } //---------------- #endregion } else { #region " (B) DTX 準拠のチップ " //---------------- if (chip.チップ種別 == チップ種別.背景動画) { // (B-a) 背景動画 App.サウンドタイマ.一時停止する(); // 止めても止めなくてもカクつくだろうが、止めておけば譜面は再開時にワープしない。 this._背景動画?.再生を開始する(); this._背景動画開始済み = true; App.サウンドタイマ.再開する(); } else { // (B-b) その他サウンド App.WAV管理.発声する(chip.チップサブID, chip.チップ種別, (chip.音量 / (float)チップ.最大音量)); } //---------------- #endregion } }
private void _チップのヒット処理を行う(チップ chip, 判定種別 judge, ドラムとチップと入力の対応表.Column.Columnヒット処理 ヒット処理表, double ヒット判定バーと発声との時間sec) { this._チップの演奏状態[chip].ヒット済みである = true; if (ヒット処理表.再生 && (judge != 判定種別.MISS)) { #region " チップの発声がまだなら行う。" //---------------- // チップの発声時刻は、描画時刻と同じかそれより過去に位置するので、ここに来た時点で未発声なら発声していい。 // というか発声時刻が過去なのに未発声というならここが最後のチャンスなので、必ず発声しないといけない。 if (0 < ヒット判定バーと発声との時間sec) // 発声時刻が未来であるなら、まだ再生してはならない。(ないと思うが念のため。) { this._チップの発声がまだなら発声を行う(chip, ヒット判定バーと発声との時間sec); } //---------------- #endregion } if (ヒット処理表.判定) { #region " チップの判定処理を行う。" //---------------- var 対応表 = App.ユーザ管理.ログオン中のユーザ.ドラムとチップと入力の対応表[chip.チップ種別]; if (judge != 判定種別.MISS) { // PERFECT~OK this._チップ光.表示を開始する(対応表.表示レーン種別); this._ドラムパッド.ヒットする(対応表.表示レーン種別); this._レーンフラッシュ.開始する(対応表.表示レーン種別); } this._判定文字列.表示を開始する(対応表.表示レーン種別, judge); this.成績.ヒット数を加算する(judge); //---------------- #endregion } if (ヒット処理表.非表示) { #region " チップを非表示にする。" //---------------- if (judge != 判定種別.MISS) { this._チップの演奏状態[chip].可視 = false; // PERFECT~POOR チップは非表示。 } else { // MISSチップは最後まで表示し続ける。 } //---------------- #endregion } }
private void _チップの発声を行う(チップ chip, double 再生開始位置sec) { if (chip.チップ種別 == チップ種別.背景動画) { #region " (A) AVI動画を再生する。" //---------------- int AVI番号 = chip.チップサブID; if (App.AVI管理.動画リスト.TryGetValue(AVI番号, out Video video)) { App.サウンドタイマ.一時停止する(); // 止めても止めなくてもカクつくだろうが、止めておけば譜面は再開時にワープしない。 video.再生を開始する(); App.サウンドタイマ.再開する(); } //---------------- #endregion } else if (0 == chip.チップサブID) { #region " (B) SSTF準拠のドラムサウンドを再生する。" //---------------- if (this._ビュアーモード時にドラムサウンドを発声する) { var prop = App.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理.チップtoプロパティ[chip.チップ種別]; // ドラムサウンドを持つチップなら発声する。(持つかどうかはこのメソッド↓内で判定される。) App.ドラムサウンド.発声する(chip.チップ種別, 0, prop.発声前消音, prop.消音グループ種別, (chip.音量 / (float)チップ.最大音量)); } //---------------- #endregion } else { #region " (C) WAVサウンドを再生する。" //---------------- int WAV番号 = chip.チップサブID; if (chip.チップ種別 == チップ種別.BGM || this._ビュアーモード時にドラムサウンドを発声する) { var prop = App.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理.チップtoプロパティ[chip.チップ種別]; // WAVを持つチップなら発声する。(持つかどうかはこのメソッド↓内で判定される。) App.WAV管理.発声する(chip.チップサブID, chip.チップ種別, prop.発声前消音, prop.消音グループ種別, (chip.音量 / (float)チップ.最大音量)); } //---------------- #endregion } }
public void チップの発声を行う(チップ chip, bool ドラムサウンドを再生する) { if (chip.チップ種別 == チップ種別.背景動画) { if (App進行描画.ユーザ管理.ログオン中のユーザ.演奏中に動画を表示する) { #region " (A) AVI動画を再生する。" //---------------- int AVI番号 = chip.チップサブID; if (App進行描画.AVI管理.動画リスト.TryGetValue(AVI番号, out Video video)) { App進行描画.サウンドタイマ.一時停止する(); // 止めても止めなくてもカクつくだろうが、止めておけば譜面は再開時にワープしない。 video.再生を開始する(); App進行描画.サウンドタイマ.再開する(); } //---------------- #endregion return; } } if (0 == chip.チップサブID && ドラムサウンドを再生する) { #region " (B) SSTF準拠のドラムサウンドを再生する。" //---------------- var ドラムチッププロパティ = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理.チップtoプロパティ[chip.チップ種別]; // ドラムサウンドを持つチップなら発声する。(持つかどうかはこのメソッド↓内で判定される。) App進行描画.ドラムサウンド.発声する(chip.チップ種別, 0, ドラムチッププロパティ.発声前消音, ドラムチッププロパティ.消音グループ種別, (chip.音量 / (float)チップ.最大音量)); //---------------- #endregion } else { #region " (C) WAVサウンドを再生する。" //---------------- int WAV番号 = chip.チップサブID; var prop = App進行描画.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理.チップtoプロパティ[chip.チップ種別]; // WAVを持つチップなら発声する。(持つかどうかはこのメソッド↓内で判定される。) App進行描画.WAV管理.発声する(chip.チップサブID, chip.チップ種別, prop.発声前消音, prop.消音グループ種別, BGM以外も再生する: ドラムサウンドを再生する, 音量: (chip.音量 / (float)チップ.最大音量)); //---------------- #endregion } }
public void 曲データファイルを読み込む(string ファイル名) { // 解放 this.SSTFormatScore = null; // 読み込み this.SSTFormatScore = スコア.ファイルから生成する(ファイル名); // 後処理 #region " 小節線・拍線チップをすべて削除する。" //----------------- this.SSTFormatScore.チップリスト.RemoveAll((chip) => ( chip.チップ種別 == チップ種別.小節線 || chip.チップ種別 == チップ種別.拍線 || chip.チップ種別 == チップ種別.Unknown)); //----------------- #endregion #region " チップリストのすべてのチップを、描画用チップに変換する。" //---------------- { // バックアップを取って、 var 元のチップリスト = new チップ[this.SSTFormatScore.チップリスト.Count]; for (int i = 0; i < this.SSTFormatScore.チップリスト.Count; i++) { 元のチップリスト[i] = this.SSTFormatScore.チップリスト[i]; } // クリアして、 this.SSTFormatScore.チップリスト.Clear(); // 再構築。 for (int i = 0; i < 元のチップリスト.Length; i++) { this.SSTFormatScore.チップリスト.Add(new 描画用チップ(元のチップリスト[i])); } } //---------------- #endregion #region " 全チップに対して「譜面内絶対位置grid」を設定する。" //----------------- { int チップが存在する小節の先頭grid = 0; int 現在の小節番号 = 0; foreach (描画用チップ chip in this.SSTFormatScore.チップリスト) { // チップの小節番号が現在の小節番号よりも大きい場合、チップが存在する小節に至るまで、「nチップが存在する小節の先頭grid」を更新する。 while (現在の小節番号 < chip.小節番号) { double 現在の小節の小節長倍率 = this.SSTFormatScore.小節長倍率を取得する(現在の小節番号); チップが存在する小節の先頭grid += (int)(this.Form.GRID_PER_PART * 現在の小節の小節長倍率); 現在の小節番号++; // 現在の小節番号 が chip.小節番号 に追いつくまでループする。 } chip.譜面内絶対位置grid = チップが存在する小節の先頭grid + (chip.小節内位置 * this.小節長をグリッドで返す(chip.小節番号)) / chip.小節解像度; } } //----------------- #endregion }
// 進行と描画 /// <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); }
public static int 排他発声グループID(this チップ チップ) { return(チップ.チップ種別.排他発声グループID()); }
// 進行と描画 /// <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); }