X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=StrokeStyleT%2F%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%2F%E6%BC%94%E5%A5%8F%2F%E5%9B%9E%E8%BB%A2%E7%BE%BD.cs;h=e0a8a4c17c8747c5bb075bdb657025305d6dcf40;hb=fa87af256b555c298ebdfd963dbc259403401b86;hp=1d7cd1ed6731d89bc5644af722f185d203a4671d;hpb=f7fe85a7a0d1ee2ca61bd5cc11a39639a99ea03a;p=strokestylet%2FCsWin10Desktop3.git diff --git a/StrokeStyleT/ステージ/演奏/回転羽.cs b/StrokeStyleT/ステージ/演奏/回転羽.cs index 1d7cd1e..e0a8a4c 100644 --- a/StrokeStyleT/ステージ/演奏/回転羽.cs +++ b/StrokeStyleT/ステージ/演奏/回転羽.cs @@ -7,98 +7,111 @@ using FDK.メディア; namespace SST.ステージ.演奏 { /// - /// 羽を回転させる点フラッシュ。 - /// 大羽4枚・小羽4枚がそれぞれ逆方向に回転する。 + /// 羽を回転させる点フラッシュ。 /// class 回転羽 : FDK.Activity { public 回転羽( int 最大同時発火数 ) { - this.子リスト.Add( this.羽画像 = new 画像( @"$(Static)\images\Chip Fire.png" ) ); - this.羽画像.加算合成 = true; + this.子リスト.Add( this._羽画像 = new 画像( @"$(Static)\images\Chip Fire.png" ) ); + this._羽画像.加算合成 = true; - this.コンテキスト = new Cコンテキスト[ 最大同時発火数 * 8 ]; // 1発火につき羽を大小 8 枚使う + this._コンテキスト = new コンテキスト[ 最大同時発火数 * 8 ]; // 1発火につき羽を大小 8 枚使う } + public void 発火する( SSTFormat.チップ種別 chipType ) { - var レーン種別 = chipType.対応するヒットレーン種別を返す(); + lock( this._スレッド間同期 ) + { + var レーン種別 = chipType.対応するヒットレーン種別を返す(); - if( ヒットレーン種別.Unknown != レーン種別 ) - this.発火する( new SharpDX.Vector2( レーン種別.レーンの中央X位置dpx(), 座標.判定バーの中央Y座標dpx ) ); + if( ヒットレーン種別.Unknown != レーン種別 ) + this.発火する( new SharpDX.Vector2( レーン種別.レーンの中央X位置dpx(), 座標.判定バーの中央Y座標dpx ) ); + } } + public void 発火する( SharpDX.Vector2 中央位置dpx ) { - float 開始角度 = StrokeStyleT.乱数.Next( 360 ); - - // 羽を、小羽大羽あわせて 8 枚登録。 - int i = 0; - for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。 + lock( this._スレッド間同期 ) { - for( ; i < this.コンテキスト.Length; i++ ) // 空いているコンテキストを探す。 + float 開始角度 = StrokeStyleT.乱数.Next( 360 ); + + // 羽を、小羽大羽あわせて 8 枚登録。 + int i = 0; + for( int 羽番号 = 0; 羽番号 < 8; 羽番号++ ) // 0~3:大羽、4~7:小羽、計8枚。 { - if( false == this.コンテキスト[ i ].使用中 ) + for( ; i < this._コンテキスト.Length; i++ ) // 空いているコンテキストを探す。 { - this.コンテキスト[ i ].使用中 = true; - this.コンテキスト[ i ].中央位置dpx = 中央位置dpx; - this.コンテキスト[ i ].回転開始角度 = SharpDX.MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) ); // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270 - this.コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する - this.コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f; // 小羽は大羽の0.6倍 - this.コンテキスト[ i ].進行カウンタ = new FDK.カウンタ.単純増加後不変カウンタ( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 ); // 0 to 70 (210ms) - break; + if( false == this._コンテキスト[ i ].使用中 ) + { + this._コンテキスト[ i ].使用中 = true; + this._コンテキスト[ i ].中央位置dpx = 中央位置dpx; + this._コンテキスト[ i ].回転開始角度 = SharpDX.MathUtil.DegreesToRadians( 開始角度 + ( 羽番号 * 90.0f ) ); // 回転開始角度 = 0, 90, 180, 270, 0, 90, 180, 270 + this._コンテキスト[ i ].回転速度 = ( 羽番号 < 4 ) ? -1.5f : 1.5f; // 小羽と大羽は反対の方向に回転する + this._コンテキスト[ i ].サイズ = ( 羽番号 < 4 ) ? 1.0f : 0.6f; // 小羽は大羽の0.6倍 + this._コンテキスト[ i ].進行カウンタ = new FDK.カウンタ.単純増加後不変カウンタ( 最初の値: 0, 最後の値: 70, 値をひとつ増加させるのにかける時間ms: 3 ); // 0 to 70 (210ms) + break; + } } } } } + protected override void On活性化( デバイスリソース dr ) { // 全コンテキストを初期化。 - for( int i = 0; i < this.コンテキスト.Length; i++ ) + for( int i = 0; i < this._コンテキスト.Length; i++ ) { - this.コンテキスト[ i ] = new Cコンテキスト() { + this._コンテキスト[ i ] = new コンテキスト() { 使用中 = false, - 進行カウンタ = new FDK.カウンタ.単純増加後不変カウンタ(), + 進行カウンタ = null, }; } } + protected override void On非活性化( デバイスリソース dr ) { } + public void 進行描画する( デバイスリソース dr ) { - for( int i = 0; i < this.コンテキスト.Length; i++ ) + lock( this._スレッド間同期 ) { - var context = this.コンテキスト[ i ]; + for( int i = 0; i < this._コンテキスト.Length; i++ ) + { + var context = this._コンテキスト[ i ]; - if( false == context.使用中 ) - continue; // 未使用の羽はスキップする。 + if( false == context.使用中 ) + continue; // 未使用の羽はスキップする。 - // 進行が終了した羽は未使用状態に戻す。 - if( context.進行カウンタ.終了値に達した ) - { - context.進行カウンタ.一時停止する(); - context.使用中 = false; - continue; - } + // 進行が終了した羽は未使用状態に戻す。 + if( context.進行カウンタ.終了値に達した ) + { + context.進行カウンタ.一時停止する(); + context.使用中 = false; + continue; + } + + // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。 + float 進行割合0to1 = context.進行カウンタ.現在値の割合; + float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * SharpDX.MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で) + float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ ); // 0→1 のとき 1.0→0.1(加速しながら) + float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ * 10.0f ); // 0→1 のとき 0→サイズ(減速しながら) - // 現在の進行カウンタの進行割合に応じて、Z軸回転率・幅拡大率・移動量を計算する。 - float 進行割合0to1 = context.進行カウンタ.現在値の割合; - float Z軸回転率 = context.回転開始角度 + ( context.回転速度 * SharpDX.MathUtil.DegreesToRadians( 60.0f * 進行割合0to1 ) ); // 0→1 のとき 0→60度(等速で) - float 幅拡大率 = (float) ( ( 0.1 + 0.9 * Math.Cos( 進行割合0to1 * Math.PI / 2.0 ) ) * context.サイズ ); // 0→1 のとき 1.0→0.1(加速しながら) - float 平行移動量 = (float) ( Math.Sin( 進行割合0to1 * Math.PI / 2.0 ) * context.サイズ ); // 0→1 のとき 0→サイズ(減速しながら) - - // 1枚描画する。 - var 変換行列2D = - dr.拡大行列DPXtoPX // スケーリング(1) DPX → PX - * SharpDX.Matrix3x2.Translation( ( 40f * 平行移動量 ) * dr.拡大率DPXtoPX横方法, ( 40f * 平行移動量 ) * dr.拡大率DPXtoPX縦方向 ) // 物理単位。 - * SharpDX.Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ ) // スケーリング(2) - * SharpDX.Matrix3x2.Rotation( Z軸回転率 ) // 画像の左上端が中心。 - * SharpDX.Matrix3x2.Translation( context.中央位置dpx.X * dr.拡大率DPXtoPX横方法, context.中央位置dpx.Y * dr.拡大率DPXtoPX縦方向 ); // 物理単位。 - - this.羽画像.描画する( dr, 変換行列2D ); + // 1枚描画する。 + var 変換行列2D = + dr.拡大行列DPXtoPX // スケーリング(1) DPX → PX + * SharpDX.Matrix3x2.Translation( 平行移動量, 平行移動量 ) // 物理単位。 + * SharpDX.Matrix3x2.Scaling( 0.2f + 幅拡大率, 0.2f + context.サイズ ) // スケーリング(2) + * SharpDX.Matrix3x2.Rotation( Z軸回転率 ) // 画像の左上端が中心。 + * SharpDX.Matrix3x2.Translation( context.中央位置dpx.X * dr.拡大率DPXtoPX横方向, context.中央位置dpx.Y * dr.拡大率DPXtoPX縦方向 ); // 物理単位。 + + this._羽画像.描画する( dr, 変換行列2D ); + } } } - protected class Cコンテキスト + private class コンテキスト { public bool 使用中; public SharpDX.Vector2 中央位置dpx; @@ -107,7 +120,11 @@ namespace SST.ステージ.演奏 public float サイズ; public FDK.カウンタ.単純増加後不変カウンタ 進行カウンタ; } - protected Cコンテキスト[] コンテキスト = null; - protected readonly FDK.メディア.画像 羽画像; + + private コンテキスト[] _コンテキスト = null; + + private FDK.メディア.画像 _羽画像 = null; + + private readonly object _スレッド間同期 = new object(); } }