+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 文字列画像( "ユーザ選択" );
+ }
+}