public static FDK.入力.MidiIn MIDI入力 => StrokeStyleT.bs_MIDI入力;
public static FDK.メディア.サウンド.WASAPI排他.ExclusiveDevice Wasapiデバイス => StrokeStyleT.bs_Wasapiデバイス;
public static Random 乱数 => StrokeStyleT.bs_乱数;
+ public static SST.ユーザ.ユーザ管理 ユーザ管理 => StrokeStyleT.bs_ユーザ管理;
public static void すべての入力デバイスをポーリングする()
{
SST.フォルダ.フォルダ変数を追加する( "Static", StrokeStyleT.フォルダ.StaticFolder );
SST.フォルダ.フォルダ変数を追加する( "AppData", StrokeStyleT.フォルダ.AppDataFolder );
SST.フォルダ.フォルダ変数を追加する( "User", null );
+
+ // その他の static の生成。
+ StrokeStyleT.bs_ユーザ管理 = new ユーザ.ユーザ管理();
}
public override void 初期化する()
//-----------------
#endregion
+ #region " ユーザを初期化する。"
+ //-----------------
+ FDK.Log.Info( "ユーザ情報を初期化します。" );
+ StrokeStyleT.ユーザ管理.UsersXmlを読み込む();
+
+ // ユーザ別の初期化。
+ foreach( var ユーザ in StrokeStyleT.ユーザ管理.ユーザリスト )
+ ユーザ.SourcesXmlを読み込む();
+ //-----------------
+ #endregion
#region " WASAPI デバイスを初期化する。"
//----------------
StrokeStyleT.bs_Wasapiデバイス = new FDK.メディア.サウンド.WASAPI排他.ExclusiveDevice();
#region " ステージを終了し、解放する。"
//----------------
- this.現在のステージ.非活性化する( this.デバイスリソース );
+ if( this.現在のステージ.活性化している )
+ this.現在のステージ.非活性化する( this.デバイスリソース );
this.最初のダミーステージ = null;
this.起動ステージ = null;
this.タイトルステージ = null;
+ this.ログインステージ = null;
//----------------
#endregion
#region " MIDI入力 を解放する。"
break;
case nameof( ステージ.タイトル.タイトルステージ ):
+ #region " 確定 → ログインステージへ。"
+ //---------------
+ if( this.タイトルステージ.現在のフェーズ == ステージ.タイトル.タイトルステージ.フェーズ.確定 )
+ {
+ this.現在のステージ.非活性化する( this.デバイスリソース );
+ this.現在のステージ = this.ログインステージ;
+ this.現在のステージ.活性化する( this.デバイスリソース );
+ }
+ //---------------
+ #endregion
+ #region " キャンセル → アプリを終了する。"
+ //---------------
+ else if( this.タイトルステージ.現在のフェーズ == ステージ.タイトル.タイトルステージ.フェーズ.キャンセル )
+ {
+ this.現在のステージ.非活性化する( this.デバイスリソース );
+ this.アプリを終了せよ = true;
+ }
+ //---------------
+ #endregion
+ break;
+
+ case nameof( ステージ.ログイン.ログインステージ ):
#region " *** "
//----------------
//----------------
protected SST.ステージ.ステージ 最初のダミーステージ = new ステージ.ステージ();
protected SST.ステージ.起動.起動ステージ 起動ステージ = new ステージ.起動.起動ステージ();
protected SST.ステージ.タイトル.タイトルステージ タイトルステージ = new ステージ.タイトル.タイトルステージ();
+ protected SST.ステージ.ログイン.ログインステージ ログインステージ = new ステージ.ログイン.ログインステージ();
private SST.ステージ.ステージ 現在のステージ = null;
private static FDK.入力.MidiIn bs_MIDI入力 = null;
private static FDK.メディア.サウンド.WASAPI排他.ExclusiveDevice bs_Wasapiデバイス = null;
private static readonly Random bs_乱数 = new Random( DateTime.Now.Millisecond );
+ private static SST.ユーザ.ユーザ管理 bs_ユーザ管理 = null;
//----------------
#endregion
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using FDK.メディア;
+
+namespace SST.ステージ.ログイン
+{
+ /// <summary>
+ /// ユーザを選択するステージ。
+ /// </summary>
+ /// <remarks>
+ /// ユーザが選択されると、グローバルリソースの「ユーザリスト.現在選択されているユーザ」に該当ユーザを設定し、このステージを終了する。
+ /// ユーザ選択操作がキャンセルされた場合は、このプロパティを null とし、このステージを終了する。
+ /// </remarks>
+ class ログインステージ : SST.ステージ.ステージ
+ {
+ public enum フェーズ
+ {
+ 初期状態,
+ 表示中,
+ 確定,
+ キャンセル,
+ }
+ public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
+ public int ユーザインデックス { get; protected set; } = 0;
+
+ public ログインステージ()
+ {
+ }
+ protected override void On活性化( デバイスリソース dr )
+ {
+ FDK.Log.Info( "ログインステージを開始します。" );
+
+ this.現在のフェーズ = フェーズ.表示中;
+ this.ログイン画面見出し.活性化する( dr );
+
+ // ユーザ数分のユーザパネルを作成し、活性化する。
+ this.ユーザパネル = new List<文字列画像>();
+ var ユーザリスト = StrokeStyleT.ユーザ管理.ユーザリスト;
+ for( int i = 0; i < ユーザリスト.Count; i++ ) // ユーザの選択はインデックスで行うが、IEnumerator が List 順に返すという保証はないので、ここでは念のため foreach は使わない。
+ {
+ var user = ユーザリスト[ i ];
+ var panel = new 文字列画像( user.名前 );
+ this.ユーザパネル.Add( panel );
+ panel.活性化する( dr );
+ }
+
+ // 最初のユーザを選択する。
+ this.ユーザインデックス = 0;
+ StrokeStyleT.ユーザ管理.ユーザを選択する( this.ユーザインデックス );
+ }
+ protected override void On非活性化( デバイスリソース dr )
+ {
+ FDK.Log.Info( "ログインステージを終了します。" );
+
+ this.ログイン画面見出し.非活性化する( dr );
+ foreach( var panel in this.ユーザパネル )
+ panel.非活性化する( dr );
+ this.ユーザパネル.Clear();
+ }
+ public override void 進行描画する( デバイスリソース dr )
+ {
+ if( this.現在のフェーズ != フェーズ.表示中 )
+ return;
+
+#if ユーザ選択画面が実装できてる
+ // 描画。
+
+ // 見出し
+ this.ログイン画面見出し.進行描画する( dr, 0.0f, 0.0f );
+
+ // ユーザ名一覧
+ for( int i = 0; i < this.ユーザパネル.Count; i++ )
+ {
+ this.ユーザパネル[ i ].進行描画する(
+ dr,
+ ( i == this.ユーザインデックス ) ? 20.0f : 10.0f,
+ 50.0f + 50.0f * i );
+ }
+
+ // 入力。
+
+ StrokeStyleT.すべての入力デバイスをポーリングする();
+
+ // Enter 押下 → ユーザ名を確定する。
+ if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Return ) )
+ {
+ this.現在のフェーズ = フェーズ.確定;
+ }
+
+ // Esc 押下 → ユーザ選択操作をキャンセルする。
+ if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Escape ) )
+ {
+ FDK.Log.Info( "ユーザ選択操作がキャンセルされました。" );
+ StrokeStyleT.ユーザ管理.ユーザを選択する( 選択対象ユーザ: null );
+ this.現在のフェーズ = フェーズ.キャンセル;
+ }
+
+ // 下矢印 押下 → 次のユーザを選択する。
+ if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Down ) )
+ {
+ this.ユーザインデックス = Math.Min( this.ユーザインデックス + 1, this.ユーザパネル.Count - 1 );
+ }
+
+ // 上矢印 押下 → 前のユーザを選択する。
+ if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Up ) )
+ {
+ this.ユーザインデックス = Math.Max( this.ユーザインデックス - 1, 0 );
+ }
+#else
+#warning ユーザ選択画面が完成するまでは、AutoPlayer で自動的にログインするようにする。
+ this.ユーザインデックス = StrokeStyleT.ユーザ管理.ユーザリスト.FindIndex( ( user ) => user.名前 == Properties.Resources.AUTOPLAYER );
+ this.現在のフェーズ = フェーズ.確定;
+ return;
+#endif
+ }
+
+ private List<FDK.メディア.文字列画像> ユーザパネル = null;
+ private readonly FDK.メディア.文字列画像 ログイン画面見出し = new 文字列画像( "ユーザ選択" );
+ }
+}