OSDN Git Service

Merge branch 'SSTFEditorでデバイス情報保存に対応する' into develop
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 選曲 / 選曲ステージ.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using FDK.メディア;
6
7 namespace SST.ステージ.選曲
8 {
9         /// <remarks>
10         /// 入力:
11         ///  StrokeStyleT.曲ツリー管理
12         ///  
13         /// 出力:
14         ///  (A) 曲が確定した場合
15         ///    this.現在のフェーズ ← 曲確定
16         ///        StrokeStyleT.曲ツリー管理.現在選択されているノード ← 確定された曲のノード
17         ///        
18         ///  (B) キャンセルされた場合
19         ///    this.現在のフェーズ ← キャンセル
20         /// </remarks>
21         class 選曲ステージ : SST.ステージ.ステージ
22         {
23                 public enum フェーズ
24                 {
25                         初期状態,
26                         表示中,
27                         曲確定,
28                         キャンセル,
29                 }
30                 public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
31
32                 public 選曲ステージ()
33                 {
34                         this.子リスト.Add( this.背景動画 = new 動画( @"$(Static)\images\選曲画面BGV.mp4" ) );
35                         this.子リスト.Add( this.ステージ台 = new 画像( @"$(Static)\images\ステージ台.png" ) );
36                         this.子リスト.Add( this.ドラムセット = new ドラムセット() );
37                         this.子リスト.Add( this.曲パネルビュー = new 曲パネルビュー() );
38                 }
39                 protected override void On活性化( デバイスリソース dr )
40                 {
41                         FDK.Log.Info( "選曲ステージを開始します。" );
42
43                         this.背景動画.ループ再生する = true;
44                         this.現在のフェーズ = フェーズ.表示中;
45
46                         this.子リスト.Add( StrokeStyleT.曲ツリー管理 );       // コンストラクタで追加したら static への直接参照がずっと子リストに残るので、ここで。
47                 }
48                 protected override void On非活性化( デバイスリソース dr )
49                 {
50                         FDK.Log.Info( "選曲ステージを終了します。" );
51
52                         this.子リスト.Remove( StrokeStyleT.曲ツリー管理 );
53                 }
54                 public override void 進行描画する( デバイスリソース dr )
55                 {
56                         if( this.現在のフェーズ != フェーズ.表示中 )
57                                 return;
58
59                         // 描画。
60                         this.背景動画.進行描画する( dr, new SharpDX.RectangleF( 0f, 0f, dr.設計画面サイズdpx.Width, dr.設計画面サイズdpx.Height ) );
61                         switch( this.現在のフェーズ )
62                         {
63                                 case フェーズ.表示中:
64                                         this.現在のフェーズ = フェーズ.表示中;
65                                         this.曲パネルビュー.進行描画する( dr );
66                                         this.ステージ台.描画する( dr, 0.0f, 0.0f );
67                                         this.ドラムセット.進行描画する( dr );
68                                         break;
69                         }
70
71                         // 入力。
72
73                         StrokeStyleT.すべての入力デバイスをポーリングする();
74
75                         // Enter 押下
76                         if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Return ) )
77                         {
78                                 if( StrokeStyleT.曲ツリー管理.現在選択されているノード is 曲.MusicNode )
79                                 {
80                                         FDK.Log.Info( "MusicNode が選択されました。" );
81                                         this.現在のフェーズ = フェーズ.曲確定;
82                                 }
83                                 else if( StrokeStyleT.曲ツリー管理.現在選択されているノード is 曲.BoxNode )
84                                 {
85                                         FDK.Log.Info( "BoxNode が選択されました。" );
86                                         // todo: BOX が選択された場合の実装。
87                                 }
88                                 else if( StrokeStyleT.曲ツリー管理.現在選択されているノード is 曲.BackNode )
89                                 {
90                                         FDK.Log.Info( "BackNode が選択されました。" );
91                                         // todo: 戻る が選択された場合の実装。
92                                 }
93                                 else if( null == StrokeStyleT.曲ツリー管理.現在選択されているノード )
94                                 {
95                                         FDK.Log.Info( "曲リストが空です。何もしません。" );
96                                 }
97                                 else
98                                 {
99                                         Trace.Fail( "[バグあり] 確定された曲が、曲でも BOX でも 戻る でも null でもありません。" );
100                                 }
101                         }
102                         // Esc 押下 → 戻る
103                         else if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Escape ) )
104                         {
105                                 this.現在のフェーズ = フェーズ.キャンセル;
106                         }
107
108                         // カーソルキー(キーバインドに寄らず固定)→ 選曲カーソル移動
109                         else if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Left ) )
110                         {
111                                 this.曲パネルビュー.カーソルを左に移動する();
112                         }
113                         else if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Right ) )
114                         {
115                                 this.曲パネルビュー.カーソルを右に移動する();
116                         }
117                         else if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Up ) )
118                         {
119                                 this.曲パネルビュー.カーソルを上に移動する();
120                         }
121                         else if( StrokeStyleT.キーボード入力.キーが押された( SharpDX.DirectInput.Key.Down ) )
122                         {
123                                 this.曲パネルビュー.カーソルを下に移動する();
124                         }
125                 }
126
127                 protected FDK.メディア.動画 背景動画 = null;
128                 protected FDK.メディア.画像 ステージ台 = null;
129                 protected SST.ステージ.ドラムセット ドラムセット = null;
130                 protected 曲パネルビュー 曲パネルビュー = null;
131         }
132 }