break;
case AppStatus.実行中:
- this._描画処理を行う();
+ this._進行と描画を行う();
break;
case AppStatus.終了:
}
/// <summary>
- /// 描画ループの処理内容。
+ /// 進行描画ループの処理内容。
/// </summary>
- private void _描画処理を行う()
+ private void _進行と描画を行う()
{
var gd = App.グラフィックデバイス;
bool vsync = false;
//----------------
#endregion
- #region " (2) 現在のステージの描画を行う。"
+ #region " (2) 現在のステージの進行描画を行う。"
//----------------
- App.ステージ管理.現在のステージ.描画する( gd );
+ App.ステージ管理.現在のステージ.進行描画する( gd );
//----------------
#endregion
}
}
- public override void 高速進行する()
- {
- App.入力管理.すべての入力デバイスをポーリングする();
-
- switch( this.現在のフェーズ )
- {
- case フェーズ.開始:
- //this._背景動画.再生を開始する(); --> フレームを開けないよう、描画側で処理する。
- //this.現在のフェーズ = フェーズ.表示中;
- break;
-
- case フェーズ.表示中:
- if( this._背景動画.動画がエラーまたは再生を終了した )
- this.現在のフェーズ = フェーズ.完了;
- break;
-
- case フェーズ.完了:
- break;
- }
- }
-
- public override void 描画する( グラフィックデバイス gd )
+ public override void 進行描画する( グラフィックデバイス gd )
{
retry:
case フェーズ.表示中:
this._背景動画.描画する( gd, new SharpDX.RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
+ if( this._背景動画.動画がエラーまたは再生を終了した )
+ this.現在のフェーズ = フェーズ.完了;
break;
case フェーズ.完了:
break;
}
- this._フェードイン.描画する( gd, this._白パネル );
+ this._フェードイン.進行描画する( gd, this._白パネル );
}
}
}
- public void 描画する( グラフィックデバイス gd, float X, float Y, string 描画する文字列, float 不透明度0to1 = 1f )
+ public void 進行描画する( グラフィックデバイス gd, float X, float Y, string 描画する文字列, float 不透明度0to1 = 1f )
{
if( null == this._フォント白32x16 )
return;
class ステージ : FDK.Activity
{
/// <summary>
- /// 高速に行うべき進行処理を行う。
+ /// ステージの進行処理のうち、高速に行うべき処理を行う。
/// </summary>
+ /// <remarks>
+ /// 高速処理が不要な進行(描画用のアニメなど)は、進行描画メソッド側で行うこと。
+ /// </remarks>
public virtual void 高速進行する()
{
Debug.Assert( this.活性化している );
}
/// <summary>
- /// ステージの描画と、通常速度での進行を行う。
+ /// ステージの通常速度での進行と描画を行う。
/// </summary>
- public virtual void 描画する( グラフィックデバイス gd )
+ public virtual void 進行描画する( グラフィックデバイス gd )
{
Debug.Assert( this.活性化している );
}
}
}
- public override void 高速進行する()
- {
- this._FPS.FPSをカウントしプロパティを更新する();
-
- App.入力管理.すべての入力デバイスをポーリングする();
-
- switch( this.現在のフェーズ )
- {
- case フェーズ.表示:
- if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) )
- {
- #region " ESC → キャンセル "
- //----------------
- Log.Info( $"{FDKUtilities.現在のメソッド名}: キャンセルされました。" );
- this.現在のフェーズ = フェーズ.キャンセル;
- //----------------
- #endregion
- }
- if( App.入力管理.シンバルが入力された() )
- {
- #region " シンバル → 確定 "
- //----------------
- Log.Info( $"{FDKUtilities.現在のメソッド名}: 確定されました。" );
- this.現在のフェーズ = フェーズ.確定;
- //----------------
- #endregion
- }
- break;
-
- case フェーズ.確定:
- case フェーズ.キャンセル:
- break;
- }
- }
-
- public override void 描画する( グラフィックデバイス gd )
+ public override void 進行描画する( グラフィックデバイス gd )
{
Debug.Assert( this.活性化している );
Debug.Assert( null != gd );
this._FPS.VPSをカウントする();
+ this._FPS.FPSをカウントしプロパティを更新する();
+
+ App.入力管理.すべての入力デバイスをポーリングする();
switch( this.現在のフェーズ )
{
case フェーズ.表示:
- this._背景画像.描画する( gd, 0.0f, 0.0f );
+ {
+ // (1) 描画
+ this._背景画像.描画する( gd, 0.0f, 0.0f );
#if DEBUG
- this._FPS.描画する( gd );
+ this._FPS.描画する( gd );
#endif
+ // (2) 入力
+ if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) )
+ {
+ #region " ESC → キャンセル "
+ //----------------
+ Log.Info( $"{FDKUtilities.現在のメソッド名}: キャンセルされました。" );
+ this.現在のフェーズ = フェーズ.キャンセル;
+ //----------------
+ #endregion
+ }
+ if( App.入力管理.シンバルが入力された() )
+ {
+ #region " シンバル → 確定 "
+ //----------------
+ Log.Info( $"{FDKUtilities.現在のメソッド名}: 確定されました。" );
+ this.現在のフェーズ = フェーズ.確定;
+ //----------------
+ #endregion
+ }
+ }
break;
case フェーズ.確定:
}
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd )
{
+ Debug.Assert( this.活性化している );
+
#region " Bass "
//----------------
if( this._Bass振動用カウンタ?.終了値に達していない ?? false )
float 最大振幅 = (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._Bass振動用カウンタ.現在値の割合 ) ); // 2 → 0
this._Bassの振動幅 = (float) ( 最大振幅 * Math.Sin( 10.0 * Math.PI * this._Bass振動用カウンタ.現在値の割合 ) ); // 10周
}
+ this._Bass.描画する( gd, 881f, 891f + this._Bassの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._LowTom振動用カウンタ.現在値の割合 ) ); // 2 → 0
this._LowTomの振動幅 = (float) ( 最大振幅 * Math.Sin( 15.0 * Math.PI * this._LowTom振動用カウンタ.現在値の割合 ) ); // 15周
}
+ this._LowTom.描画する( gd, 999f, 901f + this._LowTomの振動幅 + this._Bassの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._HiTom振動用カウンタ.現在値の割合 ) ); // 2 → 0
this._HiTomの振動幅 = (float) ( 最大振幅 * Math.Sin( 15.0 * Math.PI * this._HiTom振動用カウンタ.現在値の割合 ) ); // 15周
}
+ this._HiTom.描画する( gd, 850f, 901f + this._HiTomの振動幅 + this._Bassの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._FloorTom振動用カウンタ.現在値の割合 ) ); // 2 → 0
this._FloorTomの振動幅 = (float) ( 最大振幅 * Math.Sin( 10.0 * Math.PI * this._FloorTom振動用カウンタ.現在値の割合 ) ); // 10周
}
+ this._FloorTom.描画する( gd, 1050f, 981f + this._FloorTomの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._Snare振動用カウンタ.現在値の割合 ) ); // 2 → 0
this._Snareの振動幅 = (float) ( 最大振幅 * Math.Sin( 17.0 * Math.PI * this._Snare振動用カウンタ.現在値の割合 ) ); // 17周
}
+ this._Snare.描画する( gd, 741f, 988f + this._Snareの振動幅 );
//----------------
#endregion
float 最大振幅 = ( this.ハイハットの開度 < 0.2f ) ? 1f : (float) ( 2.0 * Math.Cos( ( Math.PI / 2.0 ) * this._HiHat振動用カウンタ.現在値の割合 ) ); // 2 → 0, 開度が小さい場合は 1。
this._HiHatの振動幅 = (float) ( 最大振幅 * Math.Sin( 20.0 * Math.PI * this._HiHat振動用カウンタ.現在値の割合 ) ); // 20周
}
+ this._HiHatBottom.描画する( gd, 657f, 935f ); // Bottom は振動しない。
+ this._HiHatTop.描画する( gd, 657f, ( 935f - 20f * this.ハイハットの開度 ) + this._HiHatの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 1.0 * Math.Cos( ( Math.PI / 2.0 ) * this._RCymbal振動用カウンタ.現在値の割合 ) ); // 1 → 0
this._RCymbalの振動幅 = (float) ( 最大振幅 * Math.Sin( 20.0 * Math.PI * this._RCymbal振動用カウンタ.現在値の割合 ) ); // 20周
}
+ this._RCymbalStand.描画する( gd, 1229f, 920f ); // スタンドは振動しない。
+ this._RCymbal.描画する( gd, ( 1257f - this._RCymbal.サイズ.Width / 2f ), ( 923f - this._RCymbal.サイズ.Height / 2f ) + this._RCymbalの振動幅 );
+ this._RCymbalTop.描画する( gd, 1229f, 880f + this._RCymbalの振動幅 );
//----------------
#endregion
float 最大振幅 = (float) ( 1.0 * Math.Cos( ( Math.PI / 2.0 ) * this._LCymbal振動用カウンタ.現在値の割合 ) ); // 1 → 0
this._LCymbalの振動幅 = (float) ( 最大振幅 * Math.Sin( 20.0 * Math.PI * this._LCymbal振動用カウンタ.現在値の割合 ) ); // 20周
}
- //----------------
- #endregion
- }
-
- public void 描画する( グラフィックデバイス gd )
- {
- this._Bass.描画する( gd, 881f, 891f + this._Bassの振動幅 );
-
- this._LowTom.描画する( gd, 999f, 901f + this._LowTomの振動幅 + this._Bassの振動幅 );
-
- this._HiTom.描画する( gd, 850f, 901f + this._HiTomの振動幅 + this._Bassの振動幅 );
-
- this._FloorTom.描画する( gd, 1050f, 981f + this._FloorTomの振動幅 );
-
- this._Snare.描画する( gd, 741f, 988f + this._Snareの振動幅 );
-
- this._HiHatBottom.描画する( gd, 657f, 935f ); // Bottom は振動しない。
- this._HiHatTop.描画する( gd, 657f, ( 935f - 20f * this.ハイハットの開度 ) + this._HiHatの振動幅 );
-
- this._RCymbalStand.描画する( gd, 1229f, 920f ); // スタンドは振動しない。
- this._RCymbal.描画する( gd, ( 1257f - this._RCymbal.サイズ.Width / 2f ), ( 923f - this._RCymbal.サイズ.Height / 2f ) + this._RCymbalの振動幅 );
- this._RCymbalTop.描画する( gd, 1229f, 880f + this._RCymbalの振動幅 );
-
- this._LCymbalStand.描画する( gd, 472f, 916f ); // スタンドは振動しない。
+ this._LCymbalStand.描画する( gd, 472f, 916f ); // スタンドは振動しない。
this._LCymbal.描画する( gd, ( 649f - this._LCymbal.サイズ.Width / 2f ), ( 918f - this._LCymbal.サイズ.Height / 2f ) + this._LCymbalの振動幅 );
this._LCymbalTop.描画する( gd, 633f, 891f + this._LCymbalの振動幅 );
+ //----------------
+ #endregion
}
this._透明度カウンタ = new Counter( 最初の値, 最後の値, 値をひとつ増加させるのにかける時間ms );
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd, 画像 フェードアウトに使うタイル画像 )
{
- // チカるの防止のため、進行処理は描画で行う。
- }
+ Debug.Assert( this.活性化している );
- public void 描画する( グラフィックデバイス gd, 画像 フェードアウトに使うタイル画像 )
- {
if( this.開始されていない )
return;
this._透明度カウンタ = new Counter( 最初の値, 最後の値, 値をひとつ増加させるのにかける時間ms );
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd, 画像 フェードインに使うタイル画像 )
{
- // チカるの防止のため、進行処理は描画で行う。
- }
+ Debug.Assert( this.活性化している );
- public void 描画する( グラフィックデバイス gd, 画像 フェードインに使うタイル画像 )
- {
if( this.開始されていない )
return;
}
}
- public override void é«\98é\80\9fé\80²è¡\8cã\81\99ã\82\8b()
+ public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
+ Debug.Assert( this.活性化している );
+ Debug.Assert( null != gd );
+
if( this._活性化した直後である )
{
this._活性化した直後である = false;
this._背景動画.再生を開始する( 開始位置sec: 0.0, ループ再生する: true );
}
+ this._FPS.VPSをカウントする();
this._FPS.FPSをカウントしプロパティを更新する();
App.入力管理.すべての入力デバイスをポーリングする();
switch( this.現在のフェーズ )
{
case フェーズ.ログアウト:
+ App.ユーザ管理.ログアウトする( gd );
+ this.現在のフェーズ = ( App.ビュアーモードである ) ?
+ フェーズ.AutoPlayer選択 : // ビュアーモードでは常に AutoPlayer でログインする。
+ フェーズ.ユーザ一覧;
+ break;
+
+ case フェーズ.AutoPlayer選択:
+ App.ユーザ管理.ユーザを選択する( Properties.Resources.AUTOPLAYER );
+ this.現在のフェーズ = フェーズ.ログイン;
break;
case フェーズ.ユーザ一覧:
- #region " 進行・入力 "
+ #region " 描画 "
//----------------
- this._ドラムセット.進行する();
+ {
+ this._背景動画.描画する( gd, new SharpDX.RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
+
+ this._ステージ台.描画する( gd, 0, 0 );
+ this._ドラムセット.進行描画する( gd );
+
+ var user = App.ユーザ管理.選択されているユーザ;
+ this._SelectYourStyle.描画する( gd, 711f, 184f );
+ this._ユーザアイコン背景.描画する( gd, 445f, 377f );
+
+ var icon = ( user.写真.生成成功 ) ? user.写真 : this._既定のユーザアイコン;
+ icon.描画する( gd, 453, 385f,
+ X方向拡大率: ( this._既定のユーザアイコン.サイズ.Width / icon.サイズ.Width ),
+ Y方向拡大率: ( this._既定のユーザアイコン.サイズ.Height / icon.サイズ.Height ) );
+
+ this._テンプレート記号左.描画する( gd, 748f, 329f );
+ this._テンプレート記号右.描画する( gd, 748f + user.名前画像.レイアウトサイズ.Width + this._テンプレート記号右.サイズ.Width / 3f, 329f );
+
+ this._SSTロゴ.描画する( gd, 707f, 352f );
+
+ user.名前画像.描画する( gd, 848f, 480f );
+
+ this._FPS.描画する( gd );
+ }
+ //----------------
+ #endregion
+ #region " 入力 "
+ //----------------
if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) )
{
#region " ESC → キャンセル "
#endregion
break;
- case フェーズ.AutoPlayer選択:
- case フェーズ.ログイン:
- case フェーズ.完了:
- case フェーズ.キャンセル:
- break;
- }
- }
-
- public override void 描画する( グラフィックデバイス gd )
- {
- Debug.Assert( this.活性化している );
- Debug.Assert( null != gd );
-
- if( this._活性化した直後である )
- return; // まだ進行処理が行われていない。
-
- this._FPS.VPSをカウントする();
-
- switch( this.現在のフェーズ )
- {
- case フェーズ.ログアウト:
- App.ユーザ管理.ログアウトする( gd );
- this.現在のフェーズ = ( App.ビュアーモードである ) ?
- フェーズ.AutoPlayer選択 : // ビュアーモードでは常に AutoPlayer でログインする。
- フェーズ.ユーザ一覧;
- break;
-
- case フェーズ.AutoPlayer選択:
- App.ユーザ管理.ユーザを選択する( Properties.Resources.AUTOPLAYER );
- this.現在のフェーズ = フェーズ.ログイン;
- break;
-
- case フェーズ.ユーザ一覧:
- #region " 描画 "
- //----------------
- {
- this._背景動画.描画する( gd, new SharpDX.RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
-
- this._ステージ台.描画する( gd, 0, 0 );
- this._ドラムセット.描画する( gd );
-
- var user = App.ユーザ管理.選択されているユーザ;
-
- this._SelectYourStyle.描画する( gd, 711f, 184f );
- this._ユーザアイコン背景.描画する( gd, 445f, 377f );
-
- var icon = ( user.写真.生成成功 ) ? user.写真 : this._既定のユーザアイコン;
- icon.描画する( gd, 453, 385f,
- X方向拡大率: ( this._既定のユーザアイコン.サイズ.Width / icon.サイズ.Width ),
- Y方向拡大率: ( this._既定のユーザアイコン.サイズ.Height / icon.サイズ.Height ) );
-
- this._テンプレート記号左.描画する( gd, 748f, 329f );
- this._テンプレート記号右.描画する( gd, 748f + user.名前画像.レイアウトサイズ.Width + this._テンプレート記号右.サイズ.Width / 3f, 329f );
-
- this._SSTロゴ.描画する( gd, 707f, 352f );
-
- user.名前画像.描画する( gd, 848f, 480f );
-
- this._FPS.描画する( gd );
- }
- //----------------
- #endregion
- break;
-
case フェーズ.ログイン:
App.ユーザ管理.ログインする( gd );
this.現在のフェーズ = フェーズ.完了;
}
}
- public override void é«\98é\80\9fé\80²è¡\8cã\81\99ã\82\8b()
+ public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
Debug.Assert( this.活性化している );
- if( this.現在のフェーズ != フェーズ.開始 )
- return;
-
- var node = ( App.ビュアーモードではない ) ?
- (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード
- App.ビュアー用ノード; // (B) ビュアーモード時
-
- string 選択曲ファイルパス = node.曲ファイルパス;
- Trace.Assert( 選択曲ファイルパス.Nullでも空でもない() );
-
- // スコアを読み込む。
- using( Log.Block( "曲の読み込み" ) )
+ switch( this.現在のフェーズ )
{
- App.演奏スコア = new スコア( SST.IO.Folder.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ) );
-
- // サウンドデバイス遅延を取得し、全チップの発声時刻へ反映する。
- float 作成時遅延ms = App.演奏スコア.Header.サウンドデバイス遅延ms;
- if( 0 < 作成時遅延ms )
- {
- float 再生時遅延ms = (float) ( App.サウンドデバイス.遅延sec * 1000.0 );
- long 加算分ms = (long) ( 作成時遅延ms - 再生時遅延ms ); // 例: 作成時遅延 7ms, 再生時遅延 10ms の場合、発声時刻に 7-10 = -3ms 加算する(3ms 早く発声させる)。
-
- Log.Info( $"作成時遅延={作成時遅延ms}ms, 再生時遅延={再生時遅延ms}ms => 加算分 = {加算分ms}ms" );
-
- foreach( var chip in App.演奏スコア.チップリスト )
- chip.発声時刻ms += 加算分ms;
- }
-
- this.現在のフェーズ = フェーズ.完了;
+ case フェーズ.開始:
+ #region " *** "
+ //----------------
+ {
+ var node = ( App.ビュアーモードではない ) ?
+ (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード
+ App.ビュアー用ノード; // (B) ビュアーモード時
+
+ string 選択曲ファイルパス = node.曲ファイルパス;
+ Trace.Assert( 選択曲ファイルパス.Nullでも空でもない() );
+
+ // スコアを読み込む。
+ using( Log.Block( "曲の読み込み" ) )
+ {
+ App.演奏スコア = new スコア( SST.IO.Folder.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ) );
+
+ // サウンドデバイス遅延を取得し、全チップの発声時刻へ反映する。
+ float 作成時遅延ms = App.演奏スコア.Header.サウンドデバイス遅延ms;
+ if( 0 < 作成時遅延ms )
+ {
+ float 再生時遅延ms = (float) ( App.サウンドデバイス.遅延sec * 1000.0 );
+ long 加算分ms = (long) ( 作成時遅延ms - 再生時遅延ms ); // 例: 作成時遅延 7ms, 再生時遅延 10ms の場合、発声時刻に 7-10 = -3ms 加算する(3ms 早く発声させる)。
+
+ Log.Info( $"作成時遅延={作成時遅延ms}ms, 再生時遅延={再生時遅延ms}ms => 加算分 = {加算分ms}ms" );
+
+ foreach( var chip in App.演奏スコア.チップリスト )
+ chip.発声時刻ms += 加算分ms;
+ }
+
+ this.現在のフェーズ = フェーズ.完了;
+ }
+ }
+ //----------------
+ #endregion
+ break;
+
+ case フェーズ.完了:
+ break;
}
}
-
- public override void 描画する( グラフィックデバイス gd )
- {
- Debug.Assert( this.活性化している );
- Debug.Assert( null != gd );
-
- if( this.現在のフェーズ != フェーズ.開始 )
- return;
- }
}
}
{
public int COMBO値
{
- get
- {
- lock( this._スレッド間同期 )
- {
- return this._COMBO値;
- }
- }
- set
- {
- lock( this._スレッド間同期 )
- {
- this._COMBO値 = value;
- }
- }
- }
+ get;
+ set;
+ } = 0;
public コンボ()
protected override void On活性化( グラフィックデバイス gd )
{
this._現在のモード = EMode.非表示中;
- this._COMBO値 = 0;
+ this.COMBO値 = 0;
this._前回のCOMBO値 = 0;
this._コンボが切れたときのCOMBO値 = 0;
this._コンボが切れた時刻 = QPCTimer.未使用;
{
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd )
{
- lock( this._スレッド間同期 )
- {
- int COMBO値 = this._COMBO値;
-
- EEvent 今回の状態遷移イベント;
-
- #region " 前回と今回の COMBO 値から、今回の状態遷移イベントを決定する。"
- //-----------------
- int 前回の値 = this._前回のCOMBO値;
- int 今回の値 = COMBO値;
+ #region " 進行 "
+ //----------------
+ EEvent 今回の状態遷移イベント;
- if( 今回の値 < _表示可能な最小コンボ数 )
- {
- 今回の状態遷移イベント = EEvent.非表示;
- }
- else if( 前回の値 == 今回の値 )
- {
- 今回の状態遷移イベント = EEvent.同一数値;
- }
- else if( 前回の値 < 今回の値 )
- {
- 今回の状態遷移イベント = EEvent.数値更新;
- }
- else
- {
- 今回の状態遷移イベント = EEvent.ミス;
- }
- //-----------------
- #endregion
+ #region " 前回と今回の COMBO 値から、今回の状態遷移イベントを決定する。"
+ //-----------------
+ int 前回の値 = this._前回のCOMBO値;
+ int 今回の値 = COMBO値;
- this._前回のCOMBO値 = COMBO値;
+ if( 今回の値 < _表示可能な最小コンボ数 )
+ {
+ 今回の状態遷移イベント = EEvent.非表示;
+ }
+ else if( 前回の値 == 今回の値 )
+ {
+ 今回の状態遷移イベント = EEvent.同一数値;
+ }
+ else if( 前回の値 < 今回の値 )
+ {
+ 今回の状態遷移イベント = EEvent.数値更新;
+ }
+ else
+ {
+ 今回の状態遷移イベント = EEvent.ミス;
+ }
+ //-----------------
+ #endregion
- Retry: // モードが変化した場合はここからリトライする。(次のターンに回すと、間にPresentを挟んで表示がチラつくから。)
+ this._前回のCOMBO値 = COMBO値;
- switch( this._現在のモード )
- {
- case EMode.非表示中:
- #region " 数値が更新されたら 進行表示中モードへ。"
- //-----------------
- if( 今回の状態遷移イベント == EEvent.数値更新 )
- {
- this._現在のモード = EMode.表示中;
- goto Retry;
- }
- this._単位付き数値.表示する = false;
- //-----------------
- #endregion
- break;
-
- case EMode.表示中:
- #region " 遷移イベントが非表示・ミスのときは 残像表示中 モードへ。"
- //-----------------
- if( ( 今回の状態遷移イベント == EEvent.非表示 ) ||
- ( 今回の状態遷移イベント == EEvent.ミス ) )
- {
- this._現在のモード = EMode.残像表示中;
- this._コンボが切れたときのCOMBO値 = 前回の値;
- this._コンボが切れた時刻 = QPCTimer.生カウント;
- goto Retry;
- }
- this._単位付き数値.数値 = 今回の値;
- this._単位付き数値.表示する = true;
- //-----------------
- #endregion
- break;
-
- case EMode.残像表示中:
- #region " 数値が更新された場合は 進行表示中 モードへ、残像表示時間が切れたときは 非表示 モードへ。"
- //-----------------
- if( 今回の状態遷移イベント == EEvent.数値更新 )
- {
- this._現在のモード = EMode.表示中;
- goto Retry;
- }
- else if( QPCTimer.生カウント相対値を秒へ変換して返す( QPCTimer.生カウント - this._コンボが切れた時刻 ) > 1.0 ) // 1.0秒経った
- {
- this._現在のモード = EMode.非表示中;
- goto Retry;
- }
- this._単位付き数値.数値 = this._コンボが切れたときのCOMBO値;
- this._単位付き数値.表示する = true;
- //-----------------
- #endregion
- break;
- }
- }
- }
+ Retry: // モードが変化した場合はここからリトライする。(次のターンに回すと、間にPresentを挟んで表示がチラつくから。)
- public void 描画する( グラフィックデバイス gd )
- {
- lock( this._スレッド間同期 )
+ switch( this._現在のモード )
{
- // 描画。
+ case EMode.非表示中:
+ #region " 数値が更新されたら 進行表示中モードへ。"
+ //-----------------
+ if( 今回の状態遷移イベント == EEvent.数値更新 )
+ {
+ this._現在のモード = EMode.表示中;
+ goto Retry;
+ }
+ this._単位付き数値.表示する = false;
+ //-----------------
+ #endregion
+ break;
- float 中央X = 1920f / 2f;
- //switch( Global.Users.Config.ComboPosition ) → コンボのX位置の調整はあとまわし。
- //{
- // case Eコンボ表示位置.LEFT: n中央X = 300; break;
- // case Eコンボ表示位置.CENTER: n中央X = 440; break;
- // case Eコンボ表示位置.RIGHT: n中央X = 680; break;
- //}
- float 下辺Y = 130f; // Y座標は固定位置
+ case EMode.表示中:
+ #region " 遷移イベントが非表示・ミスのときは 残像表示中 モードへ。"
+ //-----------------
+ if( ( 今回の状態遷移イベント == EEvent.非表示 ) ||
+ ( 今回の状態遷移イベント == EEvent.ミス ) )
+ {
+ this._現在のモード = EMode.残像表示中;
+ this._コンボが切れたときのCOMBO値 = 前回の値;
+ this._コンボが切れた時刻 = QPCTimer.生カウント;
+ goto Retry;
+ }
+ this._単位付き数値.数値 = 今回の値;
+ this._単位付き数値.表示する = true;
+ //-----------------
+ #endregion
+ break;
- this._単位付き数値.進行描画する( gd, 中央X, 下辺Y, _ドラムコンボの文字間隔 );
+ case EMode.残像表示中:
+ #region " 数値が更新された場合は 進行表示中 モードへ、残像表示時間が切れたときは 非表示 モードへ。"
+ //-----------------
+ if( 今回の状態遷移イベント == EEvent.数値更新 )
+ {
+ this._現在のモード = EMode.表示中;
+ goto Retry;
+ }
+ else if( QPCTimer.生カウント相対値を秒へ変換して返す( QPCTimer.生カウント - this._コンボが切れた時刻 ) > 1.0 ) // 1.0秒経った
+ {
+ this._現在のモード = EMode.非表示中;
+ goto Retry;
+ }
+ this._単位付き数値.数値 = this._コンボが切れたときのCOMBO値;
+ this._単位付き数値.表示する = true;
+ //-----------------
+ #endregion
+ break;
}
+ //----------------
+ #endregion
+
+ #region " 描画 "
+ //----------------
+ float 中央X = 1920f / 2f;
+ //switch( Global.Users.Config.ComboPosition ) → コンボのX位置の調整はあとまわし。
+ //{
+ // case Eコンボ表示位置.LEFT: n中央X = 300; break;
+ // case Eコンボ表示位置.CENTER: n中央X = 440; break;
+ // case Eコンボ表示位置.RIGHT: n中央X = 680; break;
+ //}
+ float 下辺Y = 130f; // Y座標は固定位置
+
+ this._単位付き数値.進行描画する( gd, 中央X, 下辺Y, _ドラムコンボの文字間隔 );
+ //----------------
+ #endregion
}
private const int _表示可能な最小コンボ数 = 11;
- private int _COMBO値 = 0;
-
private int _前回のCOMBO値 = 0;
private long _コンボが切れた時刻 = QPCTimer.未使用;
private コンボジャンプ _単位付き数値 = null;
- private readonly object _スレッド間同期 = new object();
-
private class コンボジャンプ : Activity
{
/// </summary>
public int 数値
{
- get
- {
- lock( this._スレッド間同期 )
- {
- return this._表示する数値;
- }
- }
- set
- {
- lock( this._スレッド間同期 )
- {
- this._表示する数値 = value;
- }
- }
- }
+ get;
+ set;
+ } = 0;
/// <summary>
/// false にすると非表示。
/// </summary>
public bool 表示する
{
- get
- {
- lock( this._スレッド間同期 )
- {
- return this._表示する;
- }
- }
- set
- {
- lock( this._スレッド間同期 )
- {
- this._表示する = value;
- }
- }
- }
+ get;
+ set;
+ } = false;
public コンボジャンプ()
protected override void On活性化( グラフィックデバイス gd )
{
- this._表示する数値 = 0;
+ this.数値 = 0;
this._現在の数値 = 0;
- this._表示する = true;
+ this.表示する = true;
this._ジャンプインデックス値 = 99999;
this._ジャンプインデックス進行 = new 定間隔進行();
}
public void 進行描画する( グラフィックデバイス gd, float 中央X, float 下辺Y, float 文字間隔 )
{
- lock( this._スレッド間同期 )
+ // 進行。
+
+ #region " ジャンプインデックス値 の進行。"
+ //-----------------
+ if( 360 > this._ジャンプインデックス値 )
{
- // 進行。
+ this._ジャンプインデックス進行.経過時間の分だけ進行する(
+ 間隔ms: 2,
+ 定間隔処理: () => {
+ if( 2000 > this._ジャンプインデックス値 )
+ this._ジャンプインデックス値 += 3;
+ } );
+ }
+ //-----------------
+ #endregion
+
+ #region " 数値が増加していればジャンプを開始する。"
+ //-----------------
+ if( this.数値 > this._現在の数値 )
+ {
+ this._ジャンプインデックス値 = 0;
+ this._ジャンプインデックス進行 = new 定間隔進行();
+ }
+ //-----------------
+ #endregion
+
+ this._現在の数値 = this.数値;
+
+ // 描画。
+
+ if( this.表示する )
+ {
+ // 数値と単位を表示。
+ var 位の数 = new int[ 10 ]; // 10桁もあれば足りるやろ
+ int 桁数 = 0;
- #region " ジャンプインデックス値 の進行。"
+ #region " 現在の数値 の桁を 逆順に 位の数[] に格納する。(例:現在の数値=125 のとき 位の数 = { 5,2,1,0,0,0,0,0,0,0 }, 桁数 = 3 ) "
//-----------------
- if( 360 > this._ジャンプインデックス値 )
+ int n = this._現在の数値;
+ while( ( 0 < n ) && ( 10 > 桁数 ) )
{
- this._ジャンプインデックス進行.経過時間の分だけ進行する(
- 間隔ms: 2,
- 定間隔処理: () => {
- if( 2000 > this._ジャンプインデックス値 )
- this._ジャンプインデックス値 += 3;
- } );
+ 位の数[ 桁数 ] = n % 10; // 1の位を格納
+ n = ( n - ( n % 10 ) ) / 10; // 右へシフト(例: 12345 → 1234 )
+ 桁数++;
}
//-----------------
#endregion
- #region " 数値が増加していればジャンプを開始する。"
+ #region " 単位文字の矩形(COMBO矩形) と 数字と単位を合わせた画像の全幅を算出。"
//-----------------
- if( this._表示する数値 > this._現在の数値 )
- {
- this._ジャンプインデックス値 = 0;
- this._ジャンプインデックス進行 = new 定間隔進行();
- }
+ var COMBO矩形 = this._文字矩形[ 10 ];
+ float 数字と単位を合わせた画像の全幅 = this._文字矩形[ 10 ].Width;
+
+ for( int i = 0; i < 桁数; i++ )
+ 数字と単位を合わせた画像の全幅 += this._文字矩形[ 位の数[ i ] ].Width;
//-----------------
#endregion
- this._現在の数値 = this._表示する数値;
+ #region " 位の数[] を、COMBO文字→ 1の位 → 10の位 … の順に、右から左へ向かって順番に表示する。"
+ //-----------------
+ float x = 中央X + ( 数字と単位を合わせた画像の全幅 / 2f ); // 右端X
+ float y = 下辺Y;
+ int jump = this._ジャンプインデックス値 - ( 桁数 * _桁ごとのジャンプの遅れ );
- // 描画。
+ // "COMBO" を表示。
+ x -= COMBO矩形.Width;
+ this._数値と単位の画像.描画する( gd, x, ( 下辺Y - COMBO矩形.Height ), _不透明度0to1, 転送元矩形: COMBO矩形 );
- if( this._表示する )
+ // 数値を1の位から順に表示。
+ for( int i = 0; i < 桁数; i++ )
{
- // 数値と単位を表示。
- var 位の数 = new int[ 10 ]; // 10桁もあれば足りるやろ
- int 桁数 = 0;
-
- #region " 現在の数値 の桁を 逆順に 位の数[] に格納する。(例:現在の数値=125 のとき 位の数 = { 5,2,1,0,0,0,0,0,0,0 }, 桁数 = 3 ) "
- //-----------------
- int n = this._現在の数値;
- while( ( 0 < n ) && ( 10 > 桁数 ) )
- {
- 位の数[ 桁数 ] = n % 10; // 1の位を格納
- n = ( n - ( n % 10 ) ) / 10; // 右へシフト(例: 12345 → 1234 )
- 桁数++;
- }
- //-----------------
- #endregion
-
- #region " 単位文字の矩形(COMBO矩形) と 数字と単位を合わせた画像の全幅を算出。"
- //-----------------
- var COMBO矩形 = this._文字矩形[ 10 ];
- float 数字と単位を合わせた画像の全幅 = this._文字矩形[ 10 ].Width;
-
- for( int i = 0; i < 桁数; i++ )
- 数字と単位を合わせた画像の全幅 += this._文字矩形[ 位の数[ i ] ].Width;
- //-----------------
- #endregion
-
- #region " 位の数[] を、COMBO文字→ 1の位 → 10の位 … の順に、右から左へ向かって順番に表示する。"
- //-----------------
- float x = 中央X + ( 数字と単位を合わせた画像の全幅 / 2f ); // 右端X
- float y = 下辺Y;
- int jump = this._ジャンプインデックス値 - ( 桁数 * _桁ごとのジャンプの遅れ );
-
- // "COMBO" を表示。
- x -= COMBO矩形.Width;
- this._数値と単位の画像.描画する( gd, x, ( 下辺Y - COMBO矩形.Height ), _不透明度0to1, 転送元矩形: COMBO矩形 );
-
- // 数値を1の位から順に表示。
- for( int i = 0; i < 桁数; i++ )
- {
- var rc = this._文字矩形[ 位の数[ i ] ];
-
- x -= rc.Width + 文字間隔;
- y = 下辺Y - rc.Height;
-
- jump = this._ジャンプインデックス値 - ( ( ( 桁数 - i ) - 1 ) * _桁ごとのジャンプの遅れ );
- if( ( 0 <= jump ) && ( 180 > jump ) )
- y += this._ジャンプ差分値[ jump ];
-
- this._数値と単位の画像.描画する( gd, x, y, _不透明度0to1, 転送元矩形: rc );
- }
- //-----------------
- #endregion
+ var rc = this._文字矩形[ 位の数[ i ] ];
+
+ x -= rc.Width + 文字間隔;
+ y = 下辺Y - rc.Height;
+
+ jump = this._ジャンプインデックス値 - ( ( ( 桁数 - i ) - 1 ) * _桁ごとのジャンプの遅れ );
+ if( ( 0 <= jump ) && ( 180 > jump ) )
+ y += this._ジャンプ差分値[ jump ];
+
+ this._数値と単位の画像.描画する( gd, x, y, _不透明度0to1, 転送元矩形: rc );
}
+ //-----------------
+ #endregion
}
}
- private int _表示する数値 = 0;
-
- private bool _表示する = false;
-
private int _現在の数値 = -1;
private 画像 _数値と単位の画像 = null;
private int[] _ジャンプ差分値 = new int[ 180 ];
private 定間隔進行 _ジャンプインデックス進行 = null;
-
- private readonly object _スレッド間同期 = new object();
}
}
}
public void 表示開始( 表示レーン種別 laneType, ヒットランク種別 hitRankType )
{
- lock( this._スレッド間同期 )
- {
- if( laneType == 表示レーン種別.Unknown )
- return;
+ if( laneType == 表示レーン種別.Unknown )
+ return;
- // レーンに対応する進行描画コンテキストを更新し、表示を開始するためのパラメータを設定する。
- if( this._表示レーンto進行描画コンテキスト.ContainsKey( laneType ) ) // すでにあったら、
- this._表示レーンto進行描画コンテキスト.Remove( laneType ); // 削除してから、
+ // レーンに対応する進行描画コンテキストを更新し、表示を開始するためのパラメータを設定する。
+ if( this._表示レーンto進行描画コンテキスト.ContainsKey( laneType ) ) // すでにあったら、
+ this._表示レーンto進行描画コンテキスト.Remove( laneType ); // 削除してから、
- this._表示レーンto進行描画コンテキスト.Add( // 追加。
- laneType,
- new 進行描画コンテキスト() {
- ヒットランク種別 = hitRankType,
- 進行カウンタ = new FDK.カウンタ.Counter( 最初の値: 0, 最後の値: 300, 値をひとつ増加させるのにかける時間ms: 1 ), // カウント開始(=表示開始)
+ this._表示レーンto進行描画コンテキスト.Add( // 追加。
+ laneType,
+ new 進行描画コンテキスト() {
+ ヒットランク種別 = hitRankType,
+ 進行カウンタ = new FDK.カウンタ.Counter( 最初の値: 0, 最後の値: 300, 値をひとつ増加させるのにかける時間ms: 1 ), // カウント開始(=表示開始)
X方向拡大率 = 1f,
- Y方向拡大率 = 1f,
- 相対X座標 = 0,
- 相対Y座標 = 0,
- 透明度0to1 = 1f,
- } );
- }
+ Y方向拡大率 = 1f,
+ 相対X座標 = 0,
+ 相対Y座標 = 0,
+ 透明度0to1 = 1f,
+ } );
}
public void 表示開始( チップ種別 chipType, ヒットランク種別 hitRankType )
{
- lock( this._スレッド間同期 )
- {
- var laneType = App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表[ chipType ].表示レーン種別;
+ var laneType = App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表[ chipType ].表示レーン種別;
- if( laneType != 表示レーン種別.Unknown )
- this.表示開始( laneType, hitRankType );
- }
+ if( laneType != 表示レーン種別.Unknown )
+ this.表示開始( laneType, hitRankType );
}
protected override void On活性化( グラフィックデバイス gd )
this._表示レーンto進行描画コンテキスト.Clear();
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd, float レーンフレームの左端 )
{
- lock( this._スレッド間同期 )
+ #region " 進行 "
+ //----------------
+ foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
{
- foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
- {
- var context = this._表示レーンto進行描画コンテキスト[ lane ];
+ var context = this._表示レーンto進行描画コンテキスト[ lane ];
- if( context.進行カウンタ.停止中である )
- continue; // カウンタが停止中 → このレーンについては何もしない。
+ if( context.進行カウンタ.停止中である )
+ continue; // カウンタが停止中 → このレーンについては何もしない。
- if( context.進行カウンタ.終了値に達した )
+ if( context.進行カウンタ.終了値に達した )
+ {
+ #region " 進行カウンタが終了値に達したら停止 → 表示完了。"
+ //----------------
+ context.進行カウンタ.一時停止する();
+ continue;
+ //----------------
+ #endregion
+ }
+
+ if( context.ヒットランク種別 != ヒットランク種別.MISS )
+ {
+ #region " (A) Perfect, Great, Good, Poor, Auto のアニメーション進行。"
+ //-----------------
+ if( context.進行カウンタ.現在値 < 50 )
{
- #region " 進行カウンタが終了値に達したら停止 → 表示完了。"
- //----------------
- context.進行カウンタ.一時停止する();
- continue;
- //----------------
- #endregion
+ // (B-a) 0~49
+ context.X方向拡大率 = 1.0f + ( 1.0f * ( 1.0f - ( context.進行カウンタ.現在値 / 50.0f ) ) );
+ context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
}
-
- if( context.ヒットランク種別 != ヒットランク種別.MISS )
+ else if( context.進行カウンタ.現在値 < 130 )
{
- #region " (A) Perfect, Great, Good, Poor, Auto のアニメーション進行。"
- //-----------------
- if( context.進行カウンタ.現在値 < 50 )
- {
- // (B-a) 0~49
- context.X方向拡大率 = 1.0f + ( 1.0f * ( 1.0f - ( context.進行カウンタ.現在値 / 50.0f ) ) );
- context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- else if( context.進行カウンタ.現在値 < 130 )
- {
- // (B-b) 50~129
- context.X方向拡大率 = 1.0f;
- context.Y方向拡大率 = 1.0f;
- context.相対X座標 = 0;
- context.相対Y座標 = ( ( context.進行カウンタ.現在値 % 6 ) == 0 ) ? ( App.乱数.Next( 6 ) - 3 ) : context.相対Y座標;
- context.透明度0to1 = 1.0f;
- }
- else if( context.進行カウンタ.現在値 < 240 )
- {
- // (B-c) 130~239
- context.X方向拡大率 = 1.0f;
- context.Y方向拡大率 = 1.0f;
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- else
- {
- // (B-d) 240~300
- context.X方向拡大率 = 1.0f;
- context.Y方向拡大率 = 1.0f - ( ( 1.0f * ( context.進行カウンタ.現在値 - 240 ) ) / 60.0f );
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- //-----------------
- #endregion
+ // (B-b) 50~129
+ context.X方向拡大率 = 1.0f;
+ context.Y方向拡大率 = 1.0f;
+ context.相対X座標 = 0;
+ context.相対Y座標 = ( ( context.進行カウンタ.現在値 % 6 ) == 0 ) ? ( App.乱数.Next( 6 ) - 3 ) : context.相対Y座標;
+ context.透明度0to1 = 1.0f;
+ }
+ else if( context.進行カウンタ.現在値 < 240 )
+ {
+ // (B-c) 130~239
+ context.X方向拡大率 = 1.0f;
+ context.Y方向拡大率 = 1.0f;
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
}
else
{
- #region " (B) Miss のアニメーション進行だけ他とは違ってたり。"
- //-----------------
- if( context.進行カウンタ.現在値 < 50 )
- {
- // (A-a) 0~49
- context.X方向拡大率 = 1.0f;
- context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- else if( context.進行カウンタ.現在値 < 200 )
- {
- // (A-b) 50~199
- context.X方向拡大率 = 1.0f;
- context.Y方向拡大率 = 1.0f;
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- else
- {
- // (A-c) 200~300
- context.X方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
- context.Y方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
- context.相対X座標 = 0;
- context.相対Y座標 = 0;
- context.透明度0to1 = 1.0f;
- }
- //-----------------
- #endregion
+ // (B-d) 240~300
+ context.X方向拡大率 = 1.0f;
+ context.Y方向拡大率 = 1.0f - ( ( 1.0f * ( context.進行カウンタ.現在値 - 240 ) ) / 60.0f );
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
}
-
+ //-----------------
+ #endregion
+ }
+ else
+ {
+ #region " (B) Miss のアニメーション進行だけ他とは違ってたり。"
+ //-----------------
+ if( context.進行カウンタ.現在値 < 50 )
+ {
+ // (A-a) 0~49
+ context.X方向拡大率 = 1.0f;
+ context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
+ }
+ else if( context.進行カウンタ.現在値 < 200 )
+ {
+ // (A-b) 50~199
+ context.X方向拡大率 = 1.0f;
+ context.Y方向拡大率 = 1.0f;
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
+ }
+ else
+ {
+ // (A-c) 200~300
+ context.X方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
+ context.Y方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
+ context.相対X座標 = 0;
+ context.相対Y座標 = 0;
+ context.透明度0to1 = 1.0f;
+ }
+ //-----------------
+ #endregion
}
}
- }
+ //----------------
+ #endregion
- public void 描画する( グラフィックデバイス gd, float レーンフレームの左端 )
- {
- lock( this._スレッド間同期 )
+ #region " 描画 "
+ //----------------
+ foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
{
- foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
- {
- var context = this._表示レーンto進行描画コンテキスト[ lane ];
+ var context = this._表示レーンto進行描画コンテキスト[ lane ];
- if( context.進行カウンタ.停止中である )
- continue; // カウンタが停止中 → このレーンについては何もしない。
+ if( context.進行カウンタ.停止中である )
+ continue; // カウンタが停止中 → このレーンについては何もしない。
- var 判定文字列の画像 = this._ヒットランク画像[ context.ヒットランク種別 ];
- if( 判定文字列の画像.生成失敗 )
- return;
+ var 判定文字列の画像 = this._ヒットランク画像[ context.ヒットランク種別 ];
+ if( 判定文字列の画像.生成失敗 )
+ return;
- var 判定文字列の左上端位置 =
- new Vector2( context.相対X座標, context.相対Y座標 )
- + new Vector2( レーンフレームの左端 + レーンフレーム.レーンto横中央相対位置[ lane ], this._表示レーンtoレーン表示縦中央位置[ lane ] )
- + new Vector2(
- -( ( 判定文字列の画像.サイズ.Width * context.X方向拡大率 ) / 2f ),
- -( ( 判定文字列の画像.サイズ.Height * context.Y方向拡大率 ) / 2f ) );
+ var 判定文字列の左上端位置 =
+ new Vector2( context.相対X座標, context.相対Y座標 )
+ + new Vector2( レーンフレームの左端 + レーンフレーム.レーンto横中央相対位置[ lane ], this._表示レーンtoレーン表示縦中央位置[ lane ] )
+ + new Vector2(
+ -( ( 判定文字列の画像.サイズ.Width * context.X方向拡大率 ) / 2f ),
+ -( ( 判定文字列の画像.サイズ.Height * context.Y方向拡大率 ) / 2f ) );
- 判定文字列の画像?.描画する(
- gd,
- 左位置: 判定文字列の左上端位置.X,
- 上位置: 判定文字列の左上端位置.Y,
- 不透明度0to1: context.透明度0to1,
- X方向拡大率: context.X方向拡大率,
- Y方向拡大率: context.Y方向拡大率 );
- }
+ 判定文字列の画像?.描画する(
+ gd,
+ 左位置: 判定文字列の左上端位置.X,
+ 上位置: 判定文字列の左上端位置.Y,
+ 不透明度0to1: context.透明度0to1,
+ X方向拡大率: context.X方向拡大率,
+ Y方向拡大率: context.Y方向拡大率 );
}
+ //----------------
+ #endregion
}
{ 表示レーン種別.Tom3, 798f },
{ 表示レーン種別.RightCrash, 633f },
};
-
- private readonly object _スレッド間同期 = new object();
}
}
{
public float 高さ
{
- get
- {
- lock( this._スレッド間同期 )
- {
- return this._高さ;
- }
- }
- set
- {
- lock( this._スレッド間同期 )
- {
- this._高さ = value;
- }
- }
- }
+ get;
+ set;
+ } = 1080f;
/// <summary>
/// レーンフレーム左端から各レーンの中央位置までの相対距離。
};
}
- public void フラッシュ開始( 表示レーン種別 laneType )
+ protected override void On非活性化( グラフィックデバイス gd )
{
- this._フラッシュ情報[ laneType ].Item1.開始する( 0, 10, 15 );
}
- public void 進行する()
+ public void フラッシュ開始( 表示レーン種別 laneType )
{
+ this._フラッシュ情報[ laneType ].Item1.開始する( 0, 10, 15 );
}
- public void 描画する( グラフィックデバイス gd, float 左端 )
+ public void 進行描画する( グラフィックデバイス gd, float 左端 )
{
- lock( this._スレッド間同期 )
- {
- // (1) レーンフレームを描画する。
- this._レーンフレーム画像.描画する( gd, 左端, 0f );
+ // (1) レーンフレームを描画する。
+ this._レーンフレーム画像.描画する( gd, 左端, 0f );
- // (2) レーンフラッシュを描画する。
- var フラッシュ破片のサイズ = new SharpDX.Size2F( 16f, 32f );
- foreach( var kvp in this._フラッシュ情報 )
+ // (2) レーンフラッシュを描画する。
+ var フラッシュ破片のサイズ = new SharpDX.Size2F( 16f, 32f );
+ foreach( var kvp in this._フラッシュ情報 )
+ {
+ if( this._フラッシュ情報[ kvp.Key ].Item1.終了値に達していない )
{
- if( this._フラッシュ情報[ kvp.Key ].Item1.終了値に達していない )
- {
- float 割合 = this._フラッシュ情報[ kvp.Key ].Item1.現在値の割合; // 0 → 1
- float 横拡大率 = 0.2f + 0.8f * 割合; // 0.2 → 1.0
- 割合 = (float) Math.Cos( 割合 * Math.PI / 2f ); // 1 → 0(加速しながら)
+ float 割合 = this._フラッシュ情報[ kvp.Key ].Item1.現在値の割合; // 0 → 1
+ float 横拡大率 = 0.2f + 0.8f * 割合; // 0.2 → 1.0
+ 割合 = (float) Math.Cos( 割合 * Math.PI / 2f ); // 1 → 0(加速しながら)
- for( float y = ( 演奏ステージ.ヒット判定バーの中央Y座標 - フラッシュ破片のサイズ.Height ); y > -( フラッシュ破片のサイズ.Height ); y -= フラッシュ破片のサイズ.Height )
- {
- this._フラッシュ破片.描画する(
- gd,
- 演奏ステージ.レーンフレームの左端位置 + レーンフレーム.レーンto横中央相対位置[ kvp.Key ] - ( フラッシュ破片のサイズ.Width * 横拡大率 ) / 2f,
- y,
- 不透明度0to1: 割合 * 0.75f, // ちょっと暗めに。
- 転送元矩形: this._フラッシュ情報[ kvp.Key ].Item2,
- X方向拡大率: 横拡大率 );
- }
+ for( float y = ( 演奏ステージ.ヒット判定バーの中央Y座標 - フラッシュ破片のサイズ.Height ); y > -( フラッシュ破片のサイズ.Height ); y -= フラッシュ破片のサイズ.Height )
+ {
+ this._フラッシュ破片.描画する(
+ gd,
+ 演奏ステージ.レーンフレームの左端位置 + レーンフレーム.レーンto横中央相対位置[ kvp.Key ] - ( フラッシュ破片のサイズ.Width * 横拡大率 ) / 2f,
+ y,
+ 不透明度0to1: 割合 * 0.75f, // ちょっと暗めに。
+ 転送元矩形: this._フラッシュ情報[ kvp.Key ].Item2,
+ X方向拡大率: 横拡大率 );
}
}
}
private 画像 _レーンフレーム画像 = null;
- private float _高さ = 1080f;
-
private 画像 _フラッシュ破片 = null;
private Dictionary<表示レーン種別, (Counter, SharpDX.RectangleF)> _フラッシュ情報 = null;
-
- private readonly object _スレッド間同期 = new object();
}
}
public void 発火する( Vector2 中央位置 )
{
- lock( this._スレッド間同期 )
- {
- float 開始角度 = App.乱数.Next( 360 );
+ float 開始角度 = App.乱数.Next( 360 );
- // 羽を、小羽大羽あわせて 8 枚登録。
- int i = 0;
- for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。
+ // 羽を、小羽大羽あわせて 8 枚登録。
+ int i = 0;
+ for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。
+ {
+ for( ; i < this._コンテキスト.Length; i++ ) // 空いているコンテキストを探す。
{
- for( ; i < this._コンテキスト.Length; i++ ) // 空いているコンテキストを探す。
+ if( false == this._コンテキスト[ i ].使用中 )
{
- if( false == this._コンテキスト[ i ].使用中 )
- {
- this._コンテキスト[ i ].使用中 = true;
- this._コンテキスト[ i ].中央位置 = 中央位置;
- this._コンテキスト[ i ].回転開始角度 = MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) ); // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270
- this._コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する
- this._コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f; // 小羽は大羽の0.6倍
- this._コンテキスト[ i ].進行カウンタ = new Counter( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 ); // 0 to 70 (210ms)
- break;
- }
+ this._コンテキスト[ i ].使用中 = true;
+ this._コンテキスト[ i ].中央位置 = 中央位置;
+ this._コンテキスト[ i ].回転開始角度 = MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) ); // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270
+ this._コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する
+ this._コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f; // 小羽は大羽の0.6倍
+ this._コンテキスト[ i ].進行カウンタ = new Counter( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 ); // 0 to 70 (210ms)
+ break;
}
}
}
{
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd )
{
- lock( this._スレッド間同期 )
+ for( int i = 0; i < this._コンテキスト.Length; i++ )
{
- for( int i = 0; i < this._コンテキスト.Length; i++ )
- {
- var context = this._コンテキスト[ i ];
+ var context = this._コンテキスト[ i ];
- if( false == context.使用中 )
- continue; // 未使用の羽はスキップする。
-
- // 進行が終了した羽は未使用状態に戻す。
- if( context.進行カウンタ.終了値に達した )
- {
- context.進行カウンタ.一時停止する();
- context.使用中 = false;
- continue;
- }
- }
- }
- }
+ if( false == context.使用中 )
+ continue; // 未使用の羽はスキップする。
- public void 描画する( グラフィックデバイス gd )
- {
- lock( this._スレッド間同期 )
- {
- for( int i = 0; i < this._コンテキスト.Length; i++ )
+ // 進行が終了した羽は未使用状態に戻す。
+ if( context.進行カウンタ.終了値に達した )
{
- var context = this._コンテキスト[ i ];
-
- if( false == context.使用中 )
- continue; // 未使用の羽はスキップする。
+ context.進行カウンタ.一時停止する();
+ context.使用中 = false;
+ continue;
+ }
- // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。
- float 進行割合0to1 = context.進行カウンタ.現在値の割合;
- float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で)
- float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ ); // 0→1 のとき 1.0→0.1(加速しながら)
- float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ * 10.0f ); // 0→1 のとき 0→サイズ(減速しながら)
+ // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。
+ float 進行割合0to1 = context.進行カウンタ.現在値の割合;
+ float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で)
+ float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ ); // 0→1 のとき 1.0→0.1(加速しながら)
+ float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ * 10.0f ); // 0→1 のとき 0→サイズ(減速しながら)
- // 1枚描画する。
- var 変換行列2D =
- Matrix3x2.Translation( 平行移動量, 平行移動量 ) // 平行移動(1)
- * Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ ) // スケーリング
- * Matrix3x2.Rotation( Z軸回転率 ) //Z軸回転; 画像の左上端が中心。
- * Matrix3x2.Translation( context.中央位置.X, context.中央位置.Y ); // 平行移動(2)
+ // 1枚描画する。
+ var 変換行列2D =
+ Matrix3x2.Translation( 平行移動量, 平行移動量 ) // 平行移動(1)
+ * Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ ) // スケーリング
+ * Matrix3x2.Rotation( Z軸回転率 ) //Z軸回転; 画像の左上端が中心。
+ * Matrix3x2.Translation( context.中央位置.X, context.中央位置.Y ); // 平行移動(2)
- this._羽画像.描画する( gd, 変換行列2D );
- }
+ this._羽画像.描画する( gd, 変換行列2D );
}
}
private コンテキスト[] _コンテキスト = null;
private 画像 _羽画像 = null;
-
- private readonly object _スレッド間同期 = new object();
}
}
this._FPS.FPSをカウントしプロパティを更新する();
- #region " 譜面スクロール速度が変化している → 追い付き進行 "
- //----------------
- {
- double 倍率 = this._現在進行描画中の譜面スクロール速度の倍率;
-
- if( 倍率 < App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 )
- {
- if( 0 > this._スクロール倍率追い付き用_最後の値 )
- {
- this._スクロール倍率追い付き用カウンタ = new LoopCounter( 0, 1000, 10 ); // 0→100; 全部で10×1000 = 10000ms = 10sec あれば十分だろう
- this._スクロール倍率追い付き用_最後の値 = 0;
- }
- else
- {
- while( this._スクロール倍率追い付き用_最後の値 < this._スクロール倍率追い付き用カウンタ.現在値 )
- {
- 倍率 += 0.025;
- this._スクロール倍率追い付き用_最後の値++;
- }
-
- this._現在進行描画中の譜面スクロール速度の倍率 =
- Math.Min( 倍率, App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 );
- }
- }
- else if( 倍率 > App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 )
- {
- if( 0 > this._スクロール倍率追い付き用_最後の値 )
- {
- this._スクロール倍率追い付き用カウンタ = new LoopCounter( 0, 1000, 10 ); // 0→100; 全部で10×1000 = 10000ms = 10sec あれば十分だろう
- this._スクロール倍率追い付き用_最後の値 = 0;
- }
- else
- {
- while( this._スクロール倍率追い付き用_最後の値 < this._スクロール倍率追い付き用カウンタ.現在値 )
- {
- 倍率 -= 0.025;
- this._スクロール倍率追い付き用_最後の値++;
- }
-
- this._現在進行描画中の譜面スクロール速度の倍率 =
- Math.Max( 倍率, App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 );
- }
- }
- else
- {
- this._スクロール倍率追い付き用_最後の値 = -1;
- this._スクロール倍率追い付き用カウンタ = null;
- }
- }
- //----------------
- #endregion
-
#region " 背景動画が再生されているのにBGMがまだ再生されていないなら、すぐに再生を開始する。"
//----------------
if( this._背景動画開始済み && !( this._BGM再生開始済み ) )
//----------------
#endregion
- this._レーンフレーム.進行する();
- this._コンボ.進行する();
- this._ヒットランク.進行する();
- this._ドラムセット.進行する();
- this._回転羽.進行する();
-
double 現在の演奏時刻sec = this._演奏開始からの経過時間secを返す();
#region " 自動ヒット処理。"
//----------------
#endregion
break;
-
- case フェーズ.クリア時フェードアウト:
- #region " *** "
- //----------------
- if( this._クリア時フェードアウト.開始されていない )
- {
- this._クリア時フェードアウト.開始する();
- }
- else
- {
- this._クリア時フェードアウト.進行する();
-
- if( this._クリア時フェードアウト.完了した )
- {
- this.現在のフェーズ = フェーズ.クリア;
- }
- }
- //----------------
- #endregion
- break;
-
- case フェーズ.Failed:
- case フェーズ.クリア:
- case フェーズ.キャンセル:
- case フェーズ.ビュアーメッセージ待機:
- break;
}
}
- public override void 描画する( グラフィックデバイス gd )
+ public override void 進行描画する( グラフィックデバイス gd )
{
Debug.Assert( this.活性化している );
Debug.Assert( null != gd );
if( this._活性化した直後である )
break; // 進行処理がまだ行われていない。
+ #region " 譜面スクロール速度が変化している → 追い付き進行 "
+ //----------------
+ {
+ double 倍率 = this._現在進行描画中の譜面スクロール速度の倍率;
+
+ if( 倍率 < App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 )
+ {
+ if( 0 > this._スクロール倍率追い付き用_最後の値 )
+ {
+ this._スクロール倍率追い付き用カウンタ = new LoopCounter( 0, 1000, 10 ); // 0→100; 全部で10×1000 = 10000ms = 10sec あれば十分だろう
+ this._スクロール倍率追い付き用_最後の値 = 0;
+ }
+ else
+ {
+ while( this._スクロール倍率追い付き用_最後の値 < this._スクロール倍率追い付き用カウンタ.現在値 )
+ {
+ 倍率 += 0.025;
+ this._スクロール倍率追い付き用_最後の値++;
+ }
+
+ this._現在進行描画中の譜面スクロール速度の倍率 =
+ Math.Min( 倍率, App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 );
+ }
+ }
+ else if( 倍率 > App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 )
+ {
+ if( 0 > this._スクロール倍率追い付き用_最後の値 )
+ {
+ this._スクロール倍率追い付き用カウンタ = new LoopCounter( 0, 1000, 10 ); // 0→100; 全部で10×1000 = 10000ms = 10sec あれば十分だろう
+ this._スクロール倍率追い付き用_最後の値 = 0;
+ }
+ else
+ {
+ while( this._スクロール倍率追い付き用_最後の値 < this._スクロール倍率追い付き用カウンタ.現在値 )
+ {
+ 倍率 -= 0.025;
+ this._スクロール倍率追い付き用_最後の値++;
+ }
+
+ this._現在進行描画中の譜面スクロール速度の倍率 =
+ Math.Max( 倍率, App.ユーザ管理.選択されているユーザ.オプション設定.譜面スクロール速度の倍率 );
+ }
+ }
+ else
+ {
+ this._スクロール倍率追い付き用_最後の値 = -1;
+ this._スクロール倍率追い付き用カウンタ = null;
+ }
+ }
+ //----------------
+ #endregion
+
+ this._コンボ.進行描画する( gd );
+ this._回転羽.進行描画する( gd );
+
double 演奏時刻sec = this._演奏開始からの経過時間secを返す();
#region " 背景動画とBGMの進行描画。"
#endregion
this._ステージ台.描画する( gd, 0f, 0f );
- this._レーンフレーム.描画する( gd, レーンフレームの左端位置 );
- this._コンボ.描画する( gd );
- this._ヒットランク.描画する( gd, レーンフレームの左端位置 );
+ this._レーンフレーム.進行描画する( gd, レーンフレームの左端位置 );
+ this._コンボ.進行描画する( gd );
+ this._ヒットランク.進行描画する( gd, レーンフレームの左端位置 );
this._小節線拍線を描画する( gd, 演奏時刻sec );
this._ヒット判定バー.描画する( gd, 597f, ヒット判定バーの中央Y座標 - 43f );
- this._ドラムセット.描画する( gd );
+ this._ドラムセット.進行描画する( gd );
this._チップを描画する( gd, 演奏時刻sec );
- this._回転羽.描画する( gd );
+ this._回転羽.進行描画する( gd );
this._FPS.VPSをカウントする();
this._FPS.描画する( gd, 0f, 0f );
break;
case フェーズ.クリア時フェードアウト:
+ if( this._クリア時フェードアウト.開始されていない )
+ {
+ this._クリア時フェードアウト.開始する();
+ }
+ else
+ {
+ if( this._クリア時フェードアウト.完了した )
+ {
+ this.現在のフェーズ = フェーズ.クリア;
+ }
+ }
this._ステージ台.描画する( gd, 0f, 0f );
- this._レーンフレーム.描画する( gd, レーンフレームの左端位置 );
+ this._レーンフレーム.進行描画する( gd, レーンフレームの左端位置 );
this._ヒット判定バー.描画する( gd, 597f, ヒット判定バーの中央Y座標 - 43f );
- this._ドラムセット.描画する( gd );
- this._回転羽.描画する( gd );
- this._クリア時フェードアウト.描画する( gd, this._白パネル );
+ this._ドラムセット.進行描画する( gd );
+ this._回転羽.進行描画する( gd );
+ this._クリア時フェードアウト.進行描画する( gd, this._白パネル );
this._FPS.VPSをカウントする();
this._FPS.描画する( gd, 0f, 0f );
break;
using FDK;
using FDK.メディア;
-using FDKUtilities = FDK.FDKUtilities;
-
namespace SST.ステージ.結果
{
class 結果ステージ : ステージ
}
}
- public override void é«\98é\80\9fé\80²è¡\8cã\81\99ã\82\8b()
+ public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
- if( this.現在のフェーズ == フェーズ.完了 )
- return;
-
if( this._活性化した直後である )
{
this._背景動画.再生を開始する( 開始位置sec: 0.0, ループ再生する: true );
this._活性化した直後である = false;
}
- // 入力。
-
- App.入力管理.すべての入力デバイスをポーリングする();
-
- if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) || App.入力管理.シンバルが入力された() )
- {
- #region " シンバル or ESC → ステージ終了。"
- //----------------
- this.現在のフェーズ = フェーズ.完了;
- //----------------
- #endregion
- }
- }
-
- public override void 描画する( グラフィックデバイス gd )
- {
- if( this.現在のフェーズ == フェーズ.完了 )
- return;
-
- if( this._活性化した直後である )
- return; // まだ進行処理が行われていない。
-
- this._背景動画.描画する( gd, new RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
- this._背景画像.描画する( gd, 0f, 0f );
-
- #region " 結果表示パラメータ "
- //----------------
- this._結果表示パラメータパネル.描画する( gd, 60f, 196f );
-
- var 演奏ステージ = (演奏.演奏ステージ) App.ステージ管理.ステージリスト[ nameof( 演奏.演奏ステージ ) ];
- var hitRankTypes = new[] { 演奏.ヒットランク種別.PERFECT, 演奏.ヒットランク種別.GREAT, 演奏.ヒットランク種別.GOOD, 演奏.ヒットランク種別.POOR, 演奏.ヒットランク種別.MISS, 演奏.ヒットランク種別.AUTO };
-
- int 総数 = 0;
- foreach( var type in hitRankTypes )
- 総数 += 演奏ステージ.ヒットランク別ヒット回数[ type ];
-
- float X = 360f;
- float Y = 230f;
- foreach( var type in hitRankTypes )
+ switch( this.現在のフェーズ )
{
- int 回数 = 演奏ステージ.ヒットランク別ヒット回数[ type ];
- double 割合 = ( 0 < 総数 ) ? ( 回数 * 100.0 / 総数 ) : 0.0;
- this._結果表示パラメータ.描画する( gd, X, Y, $"{回数:00000}({割合:000.0}%)" );
- Y += 71f;
+ case フェーズ.表示中:
+ // 描画
+ this._背景動画.描画する( gd, new RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
+ this._背景画像.描画する( gd, 0f, 0f );
+ #region " 結果表示パラメータ "
+ //----------------
+ this._結果表示パラメータパネル.描画する( gd, 60f, 196f );
+
+ var 演奏ステージ = (演奏.演奏ステージ) App.ステージ管理.ステージリスト[ nameof( 演奏.演奏ステージ ) ];
+ var hitRankTypes = new[] { 演奏.ヒットランク種別.PERFECT, 演奏.ヒットランク種別.GREAT, 演奏.ヒットランク種別.GOOD, 演奏.ヒットランク種別.POOR, 演奏.ヒットランク種別.MISS, 演奏.ヒットランク種別.AUTO };
+
+ int 総数 = 0;
+ foreach( var type in hitRankTypes )
+ 総数 += 演奏ステージ.ヒットランク別ヒット回数[ type ];
+
+ float X = 360f;
+ float Y = 230f;
+ foreach( var type in hitRankTypes )
+ {
+ int 回数 = 演奏ステージ.ヒットランク別ヒット回数[ type ];
+ double 割合 = ( 0 < 総数 ) ? ( 回数 * 100.0 / 総数 ) : 0.0;
+ this._結果表示パラメータ.描画する( gd, X, Y, $"{回数:00000}({割合:000.0}%)" );
+ Y += 71f;
+ }
+ //----------------
+ #endregion
+
+ // 入力
+ App.入力管理.すべての入力デバイスをポーリングする();
+
+ if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) || App.入力管理.シンバルが入力された() )
+ {
+ #region " シンバル or ESC → ステージ終了。"
+ //----------------
+ this.現在のフェーズ = フェーズ.完了;
+ //----------------
+ #endregion
+ }
+ break;
+
+ case フェーズ.完了:
+ break;
}
- //----------------
- #endregion
}
private bool _活性化した直後である = false;
}
}
- public override void é«\98é\80\9fé\80²è¡\8cã\81\99ã\82\8b()
+ public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
Debug.Assert( this.活性化している );
+ Debug.Assert( null != gd );
+
+ retry:
switch( this.現在のフェーズ )
{
break;
case フェーズ.フェードイン:
- this._フェードイン.進行する();
if( this._フェードイン.完了した )
{
this._フェーズカウンタ.開始する( 最初の値: 0, 最後の値: 2, 値をひとつ増加させるのにかける時間ms: 1000 );
this.現在のフェーズ = フェーズ.表示;
+ goto retry;
+ }
+ else
+ {
+ this._背景画像.描画する( gd, 0f, 0f );
+ this._フェードイン.進行描画する( gd, this._フェードインアウト用パネル );
}
break;
case フェーズ.表示:
if( this._フェーズカウンタ.終了値に達した )
{
- this.現在のフェーズ = フェーズ.フェードアウト;
this._フェードアウト.開始する();
+ this.現在のフェーズ = フェーズ.フェードアウト;
+ goto retry;
+ }
+ else
+ {
+ this._背景画像.描画する( gd, 0f, 0f );
}
break;
case フェーズ.フェードアウト:
- this._フェードアウト.進行する();
if( this._フェードアウト.完了した )
{
this.現在のフェーズ = フェーズ.完了;
+ //goto retry; --> ちらつきが起きるのでコメントアウト
}
+ this._背景画像.描画する( gd, 0f, 0f );
+ this._フェードアウト.進行描画する( gd, this._フェードインアウト用パネル );
+
break;
case フェーズ.完了:
}
}
- public override void 描画する( グラフィックデバイス gd )
- {
- Debug.Assert( this.活性化している );
- Debug.Assert( null != gd );
-
- switch( this.現在のフェーズ )
- {
- case フェーズ.開始:
- break;
-
- case フェーズ.フェードイン:
- this._背景画像.描画する( gd, 0f, 0f );
- this._フェードイン.描画する( gd, this._フェードインアウト用パネル );
- break;
-
- case フェーズ.表示:
- this._背景画像.描画する( gd, 0f, 0f );
- break;
-
- case フェーズ.フェードアウト:
- this._背景画像.描画する( gd, 0f, 0f );
- this._フェードアウト.描画する( gd, this._フェードインアウト用パネル );
- break;
-
- case フェーズ.完了:
- break;
- }
- }
-
private 画像 _背景画像;
}
}
- public void 進行する()
+ public void 進行描画する( グラフィックデバイス gd )
{
+ Debug.Assert( this.活性化している );
+
if( this._活性化した直後である )
{
this._活性化した直後である = false;
this._横スクロール用カウンタ = new FDK.カウンタ.定間隔進行();
}
- else
- {
- #region " 全パネルの横方向スクロール進行残があれば進行する。"
- //----------------
- this._横スクロール用カウンタ.経過時間の分だけ進行する( 1, () => {
- int オフセットの加減算速度 = 1;
+ // 進行
- #region " カーソルが中央から遠いほど速くなるよう、オフセットの加減算速度(絶対値)を計算する。"
- //------------------
- int 距離 = Math.Abs( 4 - this._カーソル位置.X );
- if( 2 > 距離 )
- オフセットの加減算速度 = 1;
- else
- オフセットの加減算速度 = 2;
- //------------------
- #endregion
+ #region " 全パネルの横方向スクロール進行残があれば進行する。"
+ //----------------
+ this._横スクロール用カウンタ.経過時間の分だけ進行する( 1, () => {
+
+ int オフセットの加減算速度 = 1;
- // オフセット と カーソル位置.X を更新する。
- if( ( 4 > this._カーソル位置.X ) ||
- ( ( 4 == this._カーソル位置.X ) && ( 0 > this._パネル全体のY軸回転オフセット ) ) )
+ #region " カーソルが中央から遠いほど速くなるよう、オフセットの加減算速度(絶対値)を計算する。"
+ //------------------
+ int 距離 = Math.Abs( 4 - this._カーソル位置.X );
+ if( 2 > 距離 )
+ オフセットの加減算速度 = 1;
+ else
+ オフセットの加減算速度 = 2;
+ //------------------
+ #endregion
+
+ // オフセット と カーソル位置.X を更新する。
+ if( ( 4 > this._カーソル位置.X ) ||
+ ( ( 4 == this._カーソル位置.X ) && ( 0 > this._パネル全体のY軸回転オフセット ) ) )
+ {
+ #region " (A) パネルは、左から右へ、移動する。"
+ //-----------------
+ this._パネル全体のY軸回転オフセット += オフセットの加減算速度;
+
+ // 1列分移動した
+ if( _パネルのY軸回転単位 <= this._パネル全体のY軸回転オフセット )
{
- #region " (A) パネルは、左から右へ、移動する。"
- //-----------------
- this._パネル全体のY軸回転オフセット += オフセットの加減算速度;
-
- // 1列分移動した
- if( _パネルのY軸回転単位 <= this._パネル全体のY軸回転オフセット )
- {
- this._パネル全体のY軸回転オフセット -= _パネルのY軸回転単位; // 0 付近に戻る
- this._カーソル位置.X++;
- }
- //-----------------
- #endregion
+ this._パネル全体のY軸回転オフセット -= _パネルのY軸回転単位; // 0 付近に戻る
+ this._カーソル位置.X++;
}
- else if( ( 4 < this._カーソル位置.X ) ||
- ( ( 4 == this._カーソル位置.X ) && ( 0 < this._パネル全体のY軸回転オフセット ) ) )
+ //-----------------
+ #endregion
+ }
+ else if( ( 4 < this._カーソル位置.X ) ||
+ ( ( 4 == this._カーソル位置.X ) && ( 0 < this._パネル全体のY軸回転オフセット ) ) )
+ {
+ #region " (B) パネルは、右から左へ、移動する。"
+ //-----------------
+ this._パネル全体のY軸回転オフセット -= オフセットの加減算速度;
+
+ // 1列分移動した
+ if( -( _パネルのY軸回転単位 ) >= this._パネル全体のY軸回転オフセット )
{
- #region " (B) パネルは、右から左へ、移動する。"
- //-----------------
- this._パネル全体のY軸回転オフセット -= オフセットの加減算速度;
-
- // 1列分移動した
- if( -( _パネルのY軸回転単位 ) >= this._パネル全体のY軸回転オフセット )
- {
- this._パネル全体のY軸回転オフセット += _パネルのY軸回転単位; // 0 付近に戻る
- this._カーソル位置.X--;
- }
- //-----------------
- #endregion
+ this._パネル全体のY軸回転オフセット += _パネルのY軸回転単位; // 0 付近に戻る
+ this._カーソル位置.X--;
}
+ //-----------------
+ #endregion
+ }
- } );
- //----------------
- #endregion
- }
- }
+ } );
+ //----------------
+ #endregion
- public void 描画する( グラフィックデバイス gd )
- {
- if( this._活性化した直後である )
- return; // まだ進行処理が行われていない。
+ // 描画
var カーソル位置の曲ノード = (Node) null; // null 可
var 描画する曲ノード = App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード;
FDKUtilities.解放する( ref this._三角用ブラシ );
}
- public void 進行する()
- {
- if( this._活性化直後である )
- return; // まだ進行処理が行われていない。
- }
-
- public void 描画する( グラフィックデバイス gd )
+ public void 進行描画する( グラフィックデバイス gd )
{
if( this._活性化直後である )
{
public override void 高速進行する()
{
- Debug.Assert( this.活性化している );
-
- if( this.現在のフェーズ == フェーズ.キャンセル ||
- this.現在のフェーズ == フェーズ.曲決定 )
+ switch( this.現在のフェーズ )
{
- return;
+ case フェーズ.開始:
+
+ break;
}
+ }
+
+ public override void 進行描画する( グラフィックデバイス gd )
+ {
+ Debug.Assert( this.活性化している );
if( this._活性化した直後である )
{
- this._活性化した直後である = false;
this._背景動画.再生を開始する( 開始位置sec: 0.0, ループ再生する: true );
+ this._活性化した直後である = false;
}
switch( this.現在のフェーズ )
{
case フェーズ.キャンセル:
case フェーズ.曲決定:
- break;
+ return;
case フェーズ.曲決定アニメ:
// なんかデザインがマッチしてないので保留。
- //this._ドラムセット.進行する();
- //this._曲決定アニメ.進行する();
- //if( this._曲決定アニメ.アニメが完了した )
- this.現在のフェーズ = フェーズ.曲決定;
+ this.現在のフェーズ = フェーズ.曲決定;
break;
case フェーズ.開始:
- this._曲パネルビュー.進行する();
- this._ドラムセット.進行する();
+ // 描画
+ this._背景動画.描画する( gd, new SharpDX.RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
+ this._曲パネルビュー.進行描画する( gd );
+ this._ステージ台.描画する( gd, 0, 0 );
+ this._ドラムセット.進行描画する( gd );
+ this._FPS.VPSをカウントする();
this._FPS.FPSをカウントしプロパティを更新する();
+ this._FPS.描画する( gd, 0f, 0f );
- // 入力。
+ // 入力
App.入力管理.すべての入力デバイスをポーリングする();
}
}
- public override void 描画する( グラフィックデバイス gd )
- {
- Debug.Assert( this.活性化している );
- Debug.Assert( null != gd );
-
- if( this.現在のフェーズ == フェーズ.キャンセル ||
- this.現在のフェーズ == フェーズ.曲決定 )
- {
- return;
- }
-
- if( this._活性化した直後である )
- return; // まだ進行処理が行われていない。
-
- switch( this.現在のフェーズ )
- {
- case フェーズ.キャンセル:
- case フェーズ.曲決定:
- return;
-
- case フェーズ.曲決定アニメ:
- // なんかデザインがマッチしてないので保留。
- //this._背景動画.進行描画する( dr, new SharpDX.RectangleF( 0f, 0f, dr.設計画面サイズ.Width, dr.設計画面サイズ.Height ) );
- //this._曲パネルビュー.進行描画する( dr );
- //this._ステージ台.描画する( dr, 0, 0 );
- //this._ドラムセット.描画する( dr );
- //this._曲決定アニメ.描画する( dr );
- break;
-
- case フェーズ.開始:
- this._背景動画.描画する( gd, new SharpDX.RectangleF( 0f, 0f, gd.設計画面サイズ.Width, gd.設計画面サイズ.Height ) );
- this._曲パネルビュー.描画する( gd );
- this._ステージ台.描画する( gd, 0, 0 );
- this._ドラムセット.描画する( gd );
- this._FPS.VPSをカウントする();
- this._FPS.描画する( gd, 0f, 0f );
- break;
- }
- }
-
private bool _活性化した直後である = false;
private 画像 _ステージ台 = null;