Visual C# 7.0, Windows10 Desktop App
Revision | e22ce3a7c64acd0f52d81980fcc7ff491be9e185 (tree) |
---|---|
Time | 2017-04-05 16:51:56 |
Author | くまかみ工房 <kumakamikoubou@gmai...> |
Commiter | くまかみ工房 |
ステージ管理クラスを追加し、ステージ関連のコードを App から分離。
なんとなく。
@@ -73,6 +73,12 @@ namespace SST | ||
73 | 73 | protected set; |
74 | 74 | } = null; |
75 | 75 | |
76 | + public static ステージ管理 ステージ管理 | |
77 | + { | |
78 | + get; | |
79 | + protected set; | |
80 | + } = null; | |
81 | + | |
76 | 82 | #endregion |
77 | 83 | |
78 | 84 |
@@ -157,15 +163,12 @@ namespace SST | ||
157 | 163 | App.サウンドデバイス = new サウンドデバイス( CSCore.CoreAudioAPI.AudioClientShareMode.Shared ); |
158 | 164 | |
159 | 165 | App.ユーザ管理 = ユーザ管理.復元する(); |
160 | - //---------------- | |
161 | - #endregion | |
162 | 166 | |
163 | - #region " 最初のステージを起動する。" | |
164 | - //---------------- | |
165 | - this._現在のステージ = this._ステージs.ElementAt( 0 ).Value; // ステージリストの最初のステージ。 | |
166 | - this._現在のステージ.活性化する( App.デバイスリソース ); | |
167 | + App.ステージ管理 = new ステージ管理(); | |
167 | 168 | //---------------- |
168 | 169 | #endregion |
170 | + | |
171 | + App.ステージ管理.ステージを遷移する( App.デバイスリソース, App.ステージ管理.最初のステージ名 ); | |
169 | 172 | } |
170 | 173 | } |
171 | 174 |
@@ -176,14 +179,8 @@ namespace SST | ||
176 | 179 | { |
177 | 180 | using( Log.Block( Utilities.現在のメソッド名 ) ) |
178 | 181 | { |
179 | - // 現在活性化しているステージがあれば、すべて非活性化する。 | |
180 | - foreach( var kvp in this._ステージs ) | |
181 | - { | |
182 | - if( kvp.Value.活性化している ) | |
183 | - { | |
184 | - kvp.Value.非活性化する( App.デバイスリソース ); | |
185 | - } | |
186 | - } | |
182 | + App.ステージ管理.Dispose(); | |
183 | + App.ステージ管理 = null; | |
187 | 184 | |
188 | 185 | App.ユーザ管理.保存する(); // DataContract は新規追加メンバがあってもXMLファイルを更新しないので、アプリのライフサイクルの中で一度だけ保存して反映するようにする。 |
189 | 186 | App.システム設定.保存する(); // 同上。 |
@@ -212,7 +209,7 @@ namespace SST | ||
212 | 209 | /// </remarks> |
213 | 210 | public void Run() |
214 | 211 | { |
215 | - Debug.Assert( null != this._現在のステージ ); // この時点で最初のステージが設定されていること。 | |
212 | + Debug.Assert( null != App.ステージ管理.現在のステージ ); // この時点で最初のステージが設定されていること。 | |
216 | 213 | |
217 | 214 | // メインループを登録し、実行を開始する。 |
218 | 215 | SharpDX.Windows.RenderLoop.Run( this, () => { |
@@ -254,11 +251,8 @@ namespace SST | ||
254 | 251 | //---------------- |
255 | 252 | #endregion |
256 | 253 | |
257 | - #region " (3) 現在のステージの進行描画を行う。" | |
258 | - //---------------- | |
259 | - this._現在のステージ.進行描画する( App.デバイスリソース ); | |
260 | - //---------------- | |
261 | - #endregion | |
254 | + // (3) 現在のステージの進行描画を行う。 | |
255 | + App.ステージ管理.現在のステージ.進行描画する( App.デバイスリソース ); | |
262 | 256 | |
263 | 257 | #region " (4) スワップチェーンを表示する。" |
264 | 258 | //---------------- |
@@ -283,16 +277,14 @@ namespace SST | ||
283 | 277 | #endregion |
284 | 278 | |
285 | 279 | // (5) ステージの状態をチェックし、遷移処理を行う。(必要に応じてビュアーメッセージキューの処理も行う。) |
286 | - switch( this._現在のステージ.GetType().Name ) | |
280 | + switch( App.ステージ管理.現在のステージ.GetType().Name ) | |
287 | 281 | { |
288 | 282 | case nameof( 起動ステージ ): |
289 | 283 | #region " 完了 → タイトルステージへ " |
290 | 284 | //---------------- |
291 | - if( ( ( 起動ステージ ) this._現在のステージ ).現在のフェーズ == 起動ステージ.フェーズ.完了 ) | |
285 | + if( ( ( 起動ステージ ) App.ステージ管理.現在のステージ ).現在のフェーズ == 起動ステージ.フェーズ.完了 ) | |
292 | 286 | { |
293 | - this._現在のステージ.非活性化する( App.デバイスリソース ); | |
294 | - this._現在のステージ = this._ステージs[ nameof( タイトルステージ ) ]; | |
295 | - this._現在のステージ.活性化する( App.デバイスリソース ); | |
287 | + App.ステージ管理.ステージを遷移する( App.デバイスリソース, nameof( タイトルステージ ) ); | |
296 | 288 | } |
297 | 289 | //---------------- |
298 | 290 | #endregion |
@@ -301,20 +293,17 @@ namespace SST | ||
301 | 293 | case nameof( タイトルステージ ): |
302 | 294 | #region " 確定 → ユーザステージへ " |
303 | 295 | //---------------- |
304 | - if( ( ( タイトルステージ ) this._現在のステージ ).現在のフェーズ == タイトルステージ.フェーズ.確定 ) | |
296 | + if( ( ( タイトルステージ ) App.ステージ管理.現在のステージ ).現在のフェーズ == タイトルステージ.フェーズ.確定 ) | |
305 | 297 | { |
306 | - this._現在のステージ.非活性化する( App.デバイスリソース ); | |
307 | - this._現在のステージ = this._ステージs[ nameof( ユーザステージ ) ]; | |
308 | - this._現在のステージ.活性化する( App.デバイスリソース ); | |
298 | + App.ステージ管理.ステージを遷移する( App.デバイスリソース, nameof( ユーザステージ ) ); | |
309 | 299 | } |
310 | 300 | //---------------- |
311 | 301 | #endregion |
312 | 302 | #region " キャンセル → アプリを終了する。" |
313 | 303 | //---------------- |
314 | - else if( ( ( タイトルステージ ) this._現在のステージ ).現在のフェーズ == タイトルステージ.フェーズ.キャンセル ) | |
304 | + else if( ( ( タイトルステージ ) App.ステージ管理.現在のステージ ).現在のフェーズ == タイトルステージ.フェーズ.キャンセル ) | |
315 | 305 | { |
316 | - this._現在のステージ.非活性化する( App.デバイスリソース ); | |
317 | - this._現在のステージ = null; | |
306 | + App.ステージ管理.ステージを遷移する( App.デバイスリソース, null ); | |
318 | 307 | this._アプリを終了する(); |
319 | 308 | } |
320 | 309 | //---------------- |
@@ -330,21 +319,6 @@ namespace SST | ||
330 | 319 | |
331 | 320 | |
332 | 321 | /// <summary> |
333 | - /// 全ステージのリスト。 | |
334 | - /// 新しいステージができたら、ここに追加すること。 | |
335 | - /// </summary> | |
336 | - private Dictionary<string, SST.ステージ.ステージ> _ステージs = new Dictionary<string, ステージ.ステージ>() { | |
337 | - { nameof( 起動ステージ ), new 起動ステージ() }, | |
338 | - { nameof( タイトルステージ ), new タイトルステージ() }, | |
339 | - { nameof( ユーザステージ ), new ユーザステージ() }, | |
340 | - }; | |
341 | - | |
342 | - /// <summary> | |
343 | - /// 現在実行中のステージ。<see cref="_ステージs"/> の中のひとつを参照している(ので、うかつにDisposeとかしたりしないこと)。 | |
344 | - /// </summary> | |
345 | - private SST.ステージ.ステージ _現在のステージ = null; | |
346 | - | |
347 | - /// <summary> | |
348 | 322 | /// true なら、<see cref="_アプリを終了する"/> が呼ばれてアプリが終了処理を開始していることを意味する。 |
349 | 323 | /// <see cref="_アプリを終了する"/> 以外では変更しないこと。 |
350 | 324 | /// </summary> |
@@ -419,11 +393,12 @@ namespace SST | ||
419 | 393 | } |
420 | 394 | } |
421 | 395 | |
396 | + | |
422 | 397 | private void _デバイス依存リソースを解放する() |
423 | 398 | { |
424 | 399 | using( Log.Block( Utilities.現在のメソッド名 ) ) |
425 | 400 | { |
426 | - this._現在のステージ?.デバイス依存リソースを解放する( App.デバイスリソース ); | |
401 | + App.ステージ管理.現在のステージ?.デバイス依存リソースを解放する( App.デバイスリソース ); | |
427 | 402 | } |
428 | 403 | } |
429 | 404 |
@@ -431,7 +406,7 @@ namespace SST | ||
431 | 406 | { |
432 | 407 | using( Log.Block( Utilities.現在のメソッド名 ) ) |
433 | 408 | { |
434 | - this._現在のステージ?.デバイス依存リソースを作成する( App.デバイスリソース ); | |
409 | + App.ステージ管理.現在のステージ?.デバイス依存リソースを作成する( App.デバイスリソース ); | |
435 | 410 | } |
436 | 411 | } |
437 | 412 |
@@ -87,6 +87,7 @@ | ||
87 | 87 | <Compile Include="Viewer\ViewerMessageQueue.cs" /> |
88 | 88 | <Compile Include="ステージ\コンソールフォント.cs" /> |
89 | 89 | <Compile Include="ステージ\ステージ.cs" /> |
90 | + <Compile Include="ステージ\ステージ管理.cs" /> | |
90 | 91 | <Compile Include="ステージ\タイトル\タイトルステージ.cs" /> |
91 | 92 | <Compile Include="ステージ\ドラムセット.cs" /> |
92 | 93 | <Compile Include="ステージ\フェードアウト.cs" /> |
@@ -0,0 +1,86 @@ | ||
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.Diagnostics; | |
4 | +using System.Linq; | |
5 | +using FDK; | |
6 | +using FDK.メディア; | |
7 | + | |
8 | +namespace SST.ステージ | |
9 | +{ | |
10 | + class ステージ管理 : IDisposable | |
11 | + { | |
12 | + public string 最初のステージ名 | |
13 | + { | |
14 | + get | |
15 | + => this._ステージリスト.ElementAt( 0 ).Value.GetType().Name; | |
16 | + } | |
17 | + | |
18 | + public ステージ 現在のステージ | |
19 | + { | |
20 | + get | |
21 | + => this._現在のステージ; | |
22 | + } | |
23 | + | |
24 | + | |
25 | + public ステージ管理() | |
26 | + { | |
27 | + } | |
28 | + | |
29 | + public void Dispose() | |
30 | + { | |
31 | + Debug.Assert( null != App.デバイスリソース ); | |
32 | + | |
33 | + // 現在活性化しているステージがあれば、すべて非活性化する。 | |
34 | + foreach( var kvp in this._ステージリスト ) | |
35 | + { | |
36 | + if( kvp.Value.活性化している ) | |
37 | + { | |
38 | + kvp.Value.非活性化する( App.デバイスリソース ); | |
39 | + } | |
40 | + } | |
41 | + } | |
42 | + | |
43 | + /// <summary> | |
44 | + /// 現在のステージを非活性化し、指定されたステージに遷移して、活性化する。 | |
45 | + /// </summary> | |
46 | + /// <param name="遷移先ステージ名">Nullまたは空文字列なら、非活性化のみ行う。</param> | |
47 | + public void ステージを遷移する( デバイスリソース dr, string 遷移先ステージ名 ) | |
48 | + { | |
49 | + using( Log.Block( Utilities.現在のメソッド名 ) ) | |
50 | + { | |
51 | + if( null != this._現在のステージ ) | |
52 | + this._現在のステージ.非活性化する( dr ); | |
53 | + | |
54 | + if( 遷移先ステージ名.Nullでも空でもない() ) | |
55 | + { | |
56 | + Log.Info( "==============================" ); | |
57 | + Log.Info( $"{遷移先ステージ名} へ遷移します。" ); | |
58 | + Log.Info( "==============================" ); | |
59 | + this._現在のステージ = this._ステージリスト[ 遷移先ステージ名 ]; | |
60 | + this._現在のステージ.活性化する( dr ); | |
61 | + } | |
62 | + else | |
63 | + { | |
64 | + Log.Info( "ステージの遷移を終了します。" ); | |
65 | + this._現在のステージ = null; | |
66 | + } | |
67 | + } | |
68 | + } | |
69 | + | |
70 | + | |
71 | + /// <summary> | |
72 | + /// 全ステージのリスト。 | |
73 | + /// 新しいステージができたら、ここに追加すること。 | |
74 | + /// </summary> | |
75 | + private Dictionary<string, ステージ> _ステージリスト = new Dictionary<string, ステージ>() { | |
76 | + { nameof( 起動.起動ステージ ), new 起動.起動ステージ() }, | |
77 | + { nameof( タイトル.タイトルステージ ), new タイトル.タイトルステージ() }, | |
78 | + { nameof( ユーザ.ユーザステージ ), new ユーザ.ユーザステージ() }, | |
79 | + }; | |
80 | + | |
81 | + /// <summary> | |
82 | + /// 現在実行中のステージ。<see cref="_ステージリスト"/> の中のひとつを参照している(ので、うかつにDisposeとかしたりしないこと)。 | |
83 | + /// </summary> | |
84 | + private ステージ _現在のステージ; | |
85 | + } | |
86 | +} |
@@ -55,17 +55,8 @@ namespace SST.ステージ.ユーザ | ||
55 | 55 | switch( this.現在のフェーズ ) |
56 | 56 | { |
57 | 57 | case フェーズ.ログアウト: |
58 | - | |
59 | - App.ユーザ管理.選択されているユーザ?.保存する(); | |
60 | - | |
61 | - if( App.ビュアーモードである ) | |
62 | - { | |
63 | - this.現在のフェーズ = フェーズ.AutoPlayer選択; | |
64 | - } | |
65 | - else | |
66 | - { | |
67 | - this.現在のフェーズ = フェーズ.ユーザ一覧; | |
68 | - } | |
58 | + this._ログアウトする(); | |
59 | + this.現在のフェーズ = ( App.ビュアーモードである ) ? フェーズ.AutoPlayer選択 : フェーズ.ユーザ一覧; | |
69 | 60 | break; |
70 | 61 | |
71 | 62 | case フェーズ.AutoPlayer選択: |
@@ -74,12 +65,11 @@ namespace SST.ステージ.ユーザ | ||
74 | 65 | break; |
75 | 66 | |
76 | 67 | case フェーズ.ユーザ一覧: |
77 | - this._ステージ台.描画する( dr, 0, 0 ); | |
78 | - this._ドラムセット.進行描画する( dr ); | |
68 | + this.現在のフェーズ = this._ユーザ一覧フェーズの進行描画( dr ); | |
79 | 69 | break; |
80 | 70 | |
81 | 71 | case フェーズ.ログイン: |
82 | - App.ユーザ管理.ユーザを再構築する( App.ユーザ管理.選択されているユーザ.名前 ); | |
72 | + this._ログインする(); | |
83 | 73 | this.現在のフェーズ = フェーズ.完了; |
84 | 74 | break; |
85 | 75 |
@@ -92,5 +82,68 @@ namespace SST.ステージ.ユーザ | ||
92 | 82 | private 画像 _ステージ台 = null; |
93 | 83 | |
94 | 84 | private ドラムセット _ドラムセット = null; |
85 | + | |
86 | + | |
87 | + /// <summary> | |
88 | + /// <see cref="App.ユーザ管理.現在選択されているユーザ"/> のログイン処理を行う。 | |
89 | + /// 未選択なら何もしない。 | |
90 | + /// </summary> | |
91 | + private void _ログインする() | |
92 | + { | |
93 | + using( Log.Block( Utilities.現在のメソッド名 ) ) | |
94 | + { | |
95 | + var user = App.ユーザ管理.選択されているユーザ; | |
96 | + | |
97 | + if( null != user ) | |
98 | + { | |
99 | + #region " ログイン処理 " | |
100 | + //---------------- | |
101 | + App.ユーザ管理.ユーザを再構築する( App.ユーザ管理.選択されているユーザ.名前 ); | |
102 | + //---------------- | |
103 | + #endregion | |
104 | + | |
105 | + Log.Info( $"ユーザ [{App.ユーザ管理.選択されているユーザ.名前}] がログインしました。" ); | |
106 | + } | |
107 | + else | |
108 | + { | |
109 | + Log.WARNING( "現在選択されているユーザはいません。" ); | |
110 | + } | |
111 | + } | |
112 | + } | |
113 | + | |
114 | + /// <summary> | |
115 | + /// <see cref="App.ユーザ管理.現在選択されているユーザ"/> のログアウト処理を行う。 | |
116 | + /// 未選択なら何もしない。 | |
117 | + /// </summary> | |
118 | + private void _ログアウトする() | |
119 | + { | |
120 | + using( Log.Block( Utilities.現在のメソッド名 ) ) | |
121 | + { | |
122 | + var user = App.ユーザ管理.選択されているユーザ; | |
123 | + | |
124 | + if( null != user ) | |
125 | + { | |
126 | + #region " ログアウト処理 " | |
127 | + //---------------- | |
128 | + user.保存する(); | |
129 | + //---------------- | |
130 | + #endregion | |
131 | + | |
132 | + Log.Info( $"ユーザ [{user.名前}] をログアウトしました。" ); | |
133 | + } | |
134 | + else | |
135 | + { | |
136 | + Log.WARNING( "現在ログインしているユーザはいません。" ); | |
137 | + } | |
138 | + } | |
139 | + } | |
140 | + | |
141 | + private フェーズ _ユーザ一覧フェーズの進行描画( デバイスリソース dr ) | |
142 | + { | |
143 | + this._ステージ台.描画する( dr, 0, 0 ); | |
144 | + this._ドラムセット.進行描画する( dr ); | |
145 | + | |
146 | + return フェーズ.ユーザ一覧; | |
147 | + } | |
95 | 148 | } |
96 | 149 | } |