OSDN Git Service

インストーラでインストールした SSTFEditor を起動するとメッセージが規定(英語)になるミスを修正。
[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         /// <summary>
10         ///             羽を回転させる点フラッシュ。
11         /// </summary>
12         class 回転羽 : FDK.Activity
13         {
14                 public 回転羽( int 最大同時発火数 )
15                 {
16                         this.子リスト.Add( this._羽画像 = new 画像( @"$(Static)\images\Chip Fire.png" ) );
17                         this._羽画像.加算合成 = true;
18
19                         this._コンテキスト = new コンテキスト[ 最大同時発火数 * 8 ];  // 1発火につき羽を大小 8 枚使う
20                 }
21
22                 public void 発火する( SSTFormat.チップ種別 chipType )
23                 {
24                         lock( this._スレッド間同期 )
25                         {
26                                 var レーン種別 = chipType.対応するヒットレーン種別を返す();
27
28                                 if( ヒットレーン種別.Unknown != レーン種別 )
29                                         this.発火する( new SharpDX.Vector2( レーン種別.レーンの中央X位置dpx(), 座標.判定バーの中央Y座標dpx ) );
30                         }
31                 }
32
33                 public void 発火する( SharpDX.Vector2 中央位置dpx )
34                 {
35                         lock( this._スレッド間同期 )
36                         {
37                                 float 開始角度 = StrokeStyleT.乱数.Next( 360 );
38
39                                 // 羽を、小羽大羽あわせて 8 枚登録。
40                                 int i = 0;
41                                 for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。
42                                 {
43                                         for( ; i < this._コンテキスト.Length; i++ )    // 空いているコンテキストを探す。
44                                         {
45                                                 if( false == this._コンテキスト[ i ].使用中 )
46                                                 {
47                                                         this._コンテキスト[ i ].使用中 = true;
48                                                         this._コンテキスト[ i ].中央位置dpx = 中央位置dpx;
49                                                         this._コンテキスト[ i ].回転開始角度 = SharpDX.MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) );  // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270
50                                                         this._コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する
51                                                         this._コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f;   // 小羽は大羽の0.6倍
52                                                         this._コンテキスト[ i ].進行カウンタ = new FDK.カウンタ.単純増加後不変カウンタ( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 );    // 0 to 70 (210ms)
53                                                         break;
54                                                 }
55                                         }
56                                 }
57                         }
58                 }
59
60                 protected override void On活性化( デバイスリソース dr )
61                 {
62                         // 全コンテキストを初期化。
63                         for( int i = 0; i < this._コンテキスト.Length; i++ )
64                         {
65                                 this._コンテキスト[ i ] = new コンテキスト() {
66                                         使用中 = false,
67                                         進行カウンタ = null,
68                                 };
69                         }
70                 }
71
72                 protected override void On非活性化( デバイスリソース dr )
73                 {
74                 }
75
76                 public void 進行描画する( デバイスリソース dr )
77                 {
78                         lock( this._スレッド間同期 )
79                         {
80                                 for( int i = 0; i < this._コンテキスト.Length; i++ )
81                                 {
82                                         var context = this._コンテキスト[ i ];
83
84                                         if( false == context.使用中 )
85                                                 continue;   // 未使用の羽はスキップする。
86
87                                         // 進行が終了した羽は未使用状態に戻す。
88                                         if( context.進行カウンタ.終了値に達した )
89                                         {
90                                                 context.進行カウンタ.一時停止する();
91                                                 context.使用中 = false;
92                                                 continue;
93                                         }
94
95                                         // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。
96                                         float 進行割合0to1 = context.進行カウンタ.現在値の割合;
97                                         float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * SharpDX.MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で)
98                                         float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ );    // 0→1 のとき 1.0→0.1(加速しながら)
99                                         float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ * 10.0f ); // 0→1 のとき 0→サイズ(減速しながら)
100
101                                         // 1枚描画する。
102                                         var 変換行列2D =
103                                                 dr.拡大行列DPXtoPX  // スケーリング(1) DPX → PX
104                                                 * SharpDX.Matrix3x2.Translation( 平行移動量, 平行移動量 )  // 物理単位。
105                                                 * SharpDX.Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ )  // スケーリング(2)
106                                                 * SharpDX.Matrix3x2.Rotation( Z軸回転率 )   // 画像の左上端が中心。
107                                                 * SharpDX.Matrix3x2.Translation( context.中央位置dpx.X * dr.拡大率DPXtoPX横方向, context.中央位置dpx.Y * dr.拡大率DPXtoPX縦方向 );   // 物理単位。
108
109                                         this._羽画像.描画する( dr, 変換行列2D );
110                                 }
111                         }
112                 }
113
114                 private class コンテキスト
115                 {
116                         public bool 使用中;
117                         public SharpDX.Vector2 中央位置dpx;
118                         public float 回転開始角度;
119                         public float 回転速度;
120                         public float サイズ;
121                         public FDK.カウンタ.単純増加後不変カウンタ 進行カウンタ;
122                 }
123
124                 private コンテキスト[] _コンテキスト = null;
125
126                 private FDK.メディア.画像 _羽画像 = null;
127
128                 private readonly object _スレッド間同期 = new object();
129         }
130 }