OSDN Git Service

ログインステージを実装。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 18 Sep 2016 13:22:49 +0000 (22:22 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 18 Sep 2016 13:22:49 +0000 (22:22 +0900)
現在は AutoPlayer でオートログインする。

StrokeStyleT/StrokeStyleT.cs
StrokeStyleT/StrokeStyleT.csproj
StrokeStyleT/ステージ/ログイン/ログインステージ.cs [new file with mode: 0644]
StrokeStyleT/ユーザ/ユーザ管理.cs

index 09cf4b7..d6e4d56 100644 (file)
@@ -14,6 +14,7 @@ namespace SST
                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 すべての入力デバイスをポーリングする()
                {
@@ -30,6 +31,9 @@ namespace SST
                        SST.フォルダ.フォルダ変数を追加する( "Static", StrokeStyleT.フォルダ.StaticFolder );
                        SST.フォルダ.フォルダ変数を追加する( "AppData", StrokeStyleT.フォルダ.AppDataFolder );
                        SST.フォルダ.フォルダ変数を追加する( "User", null );
+
+                       // その他の static の生成。
+                       StrokeStyleT.bs_ユーザ管理 = new ユーザ.ユーザ管理();
                }
 
                public override void 初期化する()
@@ -58,6 +62,16 @@ namespace SST
                        //-----------------
                        #endregion
 
+                       #region " ユーザを初期化する。"
+                       //-----------------
+                       FDK.Log.Info( "ユーザ情報を初期化します。" );
+                       StrokeStyleT.ユーザ管理.UsersXmlを読み込む();
+
+                       // ユーザ別の初期化。
+                       foreach( var ユーザ in StrokeStyleT.ユーザ管理.ユーザリスト )
+                               ユーザ.SourcesXmlを読み込む();
+                       //-----------------
+                       #endregion
                        #region " WASAPI デバイスを初期化する。"
                        //----------------
                        StrokeStyleT.bs_Wasapiデバイス = new FDK.メディア.サウンド.WASAPI排他.ExclusiveDevice();
@@ -85,10 +99,12 @@ namespace SST
 
                        #region " ステージを終了し、解放する。"
                        //----------------
-                       this.現在のステージ.非活性化する( this.デバイスリソース );
+                       if( this.現在のステージ.活性化している )
+                               this.現在のステージ.非活性化する( this.デバイスリソース );
                        this.最初のダミーステージ  = null;
                        this.起動ステージ = null;
                        this.タイトルステージ = null;
+                       this.ログインステージ = null;
                        //----------------
                        #endregion
                        #region " MIDI入力 を解放する。"
@@ -173,6 +189,28 @@ namespace SST
                                        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 " *** "
                                        //----------------
                                        //----------------
@@ -187,6 +225,7 @@ namespace SST
                protected SST.ステージ.ステージ 最初のダミーステージ = new ステージ.ステージ();
                protected SST.ステージ.起動.起動ステージ 起動ステージ = new ステージ.起動.起動ステージ();
                protected SST.ステージ.タイトル.タイトルステージ タイトルステージ = new ステージ.タイトル.タイトルステージ();
+               protected SST.ステージ.ログイン.ログインステージ ログインステージ = new ステージ.ログイン.ログインステージ();
 
                private SST.ステージ.ステージ 現在のステージ = null;
 
@@ -197,6 +236,7 @@ namespace SST
                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
 
index 9e1c417..529a963 100644 (file)
@@ -96,6 +96,7 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ステージ\ステージ.cs" />
     <Compile Include="ステージ\タイトル\タイトルステージ.cs" />
+    <Compile Include="ステージ\ログイン\ログインステージ.cs" />
     <Compile Include="ステージ\汎用\フェードアウト.cs" />
     <Compile Include="ステージ\汎用\フェードイン.cs" />
     <Compile Include="ステージ\起動\起動ステージ.cs" />
diff --git a/StrokeStyleT/ステージ/ログイン/ログインステージ.cs b/StrokeStyleT/ステージ/ログイン/ログインステージ.cs
new file mode 100644 (file)
index 0000000..b7e496b
--- /dev/null
@@ -0,0 +1,123 @@
+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 文字列画像( "ユーザ選択" );
+       }
+}
index 9d1ff5a..2076c48 100644 (file)
@@ -144,7 +144,7 @@ namespace SST.ユーザ
                        }
                }
 
-               private readonly string ユーザXmlファイルパス = @"$(Common)Users.xml";
+               private readonly string ユーザXmlファイルパス = @"$(AppData)\Users.xml";
 
                private void 初期化する()
                {