2 using System.Collections.Generic;
3 using System.Diagnostics;
11 /// 大羽4枚・小羽4枚がそれぞれ逆方向に回転する。
13 class 回転羽 : FDK.Activity
15 public 回転羽( int 最大同時発火数 )
17 this.子リスト.Add( this.羽画像 = new 画像( @"$(Static)\images\Chip Fire.png" ) );
20 this.コンテキスト = new Cコンテキスト[ 最大同時発火数 * 8 ]; // 1発火につき羽を大小 8 枚使う
22 public void 発火する( SSTFormat.チップ種別 chipType )
26 var レーン種別 = chipType.対応するヒットレーン種別を返す();
28 if( ヒットレーン種別.Unknown != レーン種別 )
29 this.発火する( new SharpDX.Vector2( レーン種別.レーンの中央X位置dpx(), 座標.判定バーの中央Y座標dpx ) );
32 public void 発火する( SharpDX.Vector2 中央位置dpx )
36 float 開始角度 = StrokeStyleT.乱数.Next( 360 );
40 for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。
42 for( ; i < this.コンテキスト.Length; i++ ) // 空いているコンテキストを探す。
44 if( false == this.コンテキスト[ i ].使用中 )
46 this.コンテキスト[ i ].使用中 = true;
47 this.コンテキスト[ i ].中央位置dpx = 中央位置dpx;
48 this.コンテキスト[ i ].回転開始角度 = SharpDX.MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) ); // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270
49 this.コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する
50 this.コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f; // 小羽は大羽の0.6倍
51 this.コンテキスト[ i ].進行カウンタ = new FDK.カウンタ.単純増加後不変カウンタ( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 ); // 0 to 70 (210ms)
58 protected override void On活性化( デバイスリソース dr )
61 for( int i = 0; i < this.コンテキスト.Length; i++ )
63 this.コンテキスト[ i ] = new Cコンテキスト() {
69 protected override void On非活性化( デバイスリソース dr )
72 public void 進行描画する( デバイスリソース dr )
76 for( int i = 0; i < this.コンテキスト.Length; i++ )
78 var context = this.コンテキスト[ i ];
80 if( false == context.使用中 )
81 continue; // 未使用の羽はスキップする。
84 if( context.進行カウンタ.終了値に達した )
86 context.進行カウンタ.一時停止する();
91 // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。
92 float 進行割合0to1 = context.進行カウンタ.現在値の割合;
93 float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * SharpDX.MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で)
94 float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ ); // 0→1 のとき 1.0→0.1(加速しながら)
95 float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ * 10.0f ); // 0→1 のとき 0→サイズ(減速しながら)
99 dr.拡大行列DPXtoPX // スケーリング(1) DPX → PX
100 * SharpDX.Matrix3x2.Translation( 平行移動量, 平行移動量 ) // 物理単位。
101 * SharpDX.Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ ) // スケーリング(2)
102 * SharpDX.Matrix3x2.Rotation( Z軸回転率 ) // 画像の左上端が中心。
103 * SharpDX.Matrix3x2.Translation( context.中央位置dpx.X * dr.拡大率DPXtoPX横方向, context.中央位置dpx.Y * dr.拡大率DPXtoPX縦方向 ); // 物理単位。
105 this.羽画像.描画する( dr, 変換行列2D );
110 protected class Cコンテキスト
113 public SharpDX.Vector2 中央位置dpx;
117 public FDK.カウンタ.単純増加後不変カウンタ 進行カウンタ;
119 protected Cコンテキスト[] コンテキスト = null;
120 protected readonly FDK.メディア.画像 羽画像;
122 private readonly object スレッド間同期 = new object();