{
public static class Extensions
{
- // System.WeakReference<>
-
- /// <summary>
- /// 弱参照から実参照を取得する。
- /// </summary>
- /// <typeparam name="T">弱参照で使用する型。</typeparam>
- /// <param name="wr">弱参照インスタンス。</param>
- /// <returns>実参照。null、または取得に失敗すれば null 。</returns>
- public static T GetTarget<T>( this WeakReference<T> wr ) where T : class
- {
- return wr.TryGetTarget( out T target ) ? target : null;
- }
-
-
// SharpDX.IUnknown
/// <summary>
/// 文字列が Null でも空でもないなら true を返す。
/// </summary>
public static bool Nullでも空でもない( this string 検査対象 )
- => !string.IsNullOrEmpty( 検査対象 );
+ => !( string.IsNullOrEmpty( 検査対象 ) );
/// <summary>
/// 文字列が Null または空なら true を返す。
public static long 変換_sec単位から100ns単位へ( double 数値sec )
{
- return ( long ) ( 数値sec * 10_000_000.0 + 0.5 ); // +0.5 で四捨五入できる。
+ return (long) ( 数値sec * 10_000_000.0 + 0.5 ); // +0.5 で四捨五入できる。
}
/// <summary>
}
/// <summary>
- /// フォルダ変数が未登録なら null を返す。
+ /// フォルダ変数の内容を返す。
+ /// 変数が未登録なら null を返す。
/// </summary>
/// <param name="変数名">フォルダ変数名。</param>
/// <returns>フォルダ変数の登録値。未登録なら null。</returns>
{
this._AudioClock.GetFrequencyNative( out Pu64Frequency );
- // IAudioClock::GetPosition() は、S_FALSE を返すことがある。
- // これは、WASAPI排他モードにおいて、GetPosition 時に優先度の高いイベントが発生しており
- // 既定時間内にデバイス位置を取得できなかった場合に返される。(MSDNより)
-
int hr = 0;
long pos = 0;
long qpcPos = 0;
{
hr = this._AudioClock.GetPositionNative( out pos, out qpcPos );
+ // ※IAudioClock::GetPosition() は、S_FALSE を返すことがある。
+ // これは、WASAPI排他モードにおいて、GetPosition 時に優先度の高いイベントが発生しており
+ // 規定時間内にデバイス位置を取得できなかった場合に返される。(MSDNより)
+
if( ( (int) HResult.S_OK ) == hr )
{
break; // OK
=> this._Volume;
set
- {
- if( ( 0.0f > value ) && ( 1.0f < value ) )
- throw new ArgumentOutOfRangeException();
-
- this._Volume = value;
- }
+ => this._Volume =
+ ( 0.0f > value ) ? throw new ArgumentOutOfRangeException() :
+ ( 1.0f < value ) ? throw new ArgumentOutOfRangeException() :
+ value;
}
/// <summary>
=> this._Volume;
set
- {
- if( ( 0.0f > value ) || ( 1.0f < value ) )
- throw new ArgumentOutOfRangeException();
-
- this._Volume = value;
- }
+ => this._Volume =
+ ( 0.0f > value ) ? throw new ArgumentOutOfRangeException() :
+ ( 1.0f < value ) ? throw new ArgumentOutOfRangeException() :
+ value;
}
/// <summary>
- /// Sound の生成は、コンストラクタではなく Device.CreateSound() で行うこと。
+ /// Sound の生成は、コンストラクタではなく <see cref="Device.サウンドを生成する(string)"/> で行うこと。
/// (Device 内部で持っている Mixer への参照が必要なため。)
/// </summary>
/// <param name="path">
private ISampleSource _SampleSource = null;
+ /// <summary>
+ /// この Sound が登録されているミキサーへの弱参照。
+ /// 循環参照を避けるため、強参照は持たない。
+ /// </summary>
private WeakReference<Mixer> _MixerRef = null;
private float _Volume = 1.0f;
protected override void Onデバイス依存リソースの作成( デバイスリソース dr )
{
- using( var d3dLock = new AutoD3DDeviceLock( dr.DXGIDeviceManager, out Device d3dDevice ) )
- using( d3dDevice )
- {
- _定数バッファを生成する();
-
- _テクスチャとシェーダーリソースビューを生成する();
-
- // 以下、ローカル関数。
-
- void _定数バッファを生成する()
- {
- var cBufferDesc = new BufferDescription() {
- Usage = ResourceUsage.Dynamic, // 動的使用法
- BindFlags = BindFlags.ConstantBuffer, // 定数バッファ
- CpuAccessFlags = CpuAccessFlags.Write, // CPUから書き込む
- OptionFlags = ResourceOptionFlags.None,
- SizeInBytes = SharpDX.Utilities.SizeOf<ST定数バッファの転送元データ>(), // バッファサイズ
- StructureByteStride = 0,
- };
- this._ConstantBuffer = new Buffer( d3dDevice, cBufferDesc );
- }
- void _テクスチャとシェーダーリソースビューを生成する()
- {
- if( this._画像ファイルパス.Nullでも空でもない() )
- {
- // (A) 画像ファイルから生成する場合。
- var 戻り値 = Utilities.CreateShaderResourceViewFromFile(
- d3dDevice,
- this._bindFlags,
- フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this._画像ファイルパス ) );
- this._ShaderResourceView = 戻り値.srv;
- this._ShaderResourceViewSize = 戻り値.viewSize;
- this.Texture = 戻り値.texture;
- }
- else if( this.ユーザ指定サイズdpx != Size2.Empty )
- {
- // (B) サイズを指定して生成する場合。
- var 戻り値 = Utilities.CreateShaderResourceView(
- d3dDevice,
- this._bindFlags,
- this.ユーザ指定サイズdpx );
- this._ShaderResourceView = 戻り値.srv;
- this.Texture = 戻り値.texture;
-
- this._ShaderResourceViewSize = new Size2F( this.ユーザ指定サイズdpx.Width, this.ユーザ指定サイズdpx.Height );
- }
- else
- {
- throw new InvalidOperationException();
- }
- }
- }
- }
+ using( var d3dLock = new AutoD3DDeviceLock( dr.DXGIDeviceManager, out Device d3dDevice ) )
+ using( d3dDevice )
+ {
+ #region " 定数バッファを生成する。"
+ //----------------
+ {
+ var cBufferDesc = new BufferDescription() {
+ Usage = ResourceUsage.Dynamic, // 動的使用法
+ BindFlags = BindFlags.ConstantBuffer, // 定数バッファ
+ CpuAccessFlags = CpuAccessFlags.Write, // CPUから書き込む
+ OptionFlags = ResourceOptionFlags.None,
+ SizeInBytes = SharpDX.Utilities.SizeOf<ST定数バッファの転送元データ>(), // バッファサイズ
+ StructureByteStride = 0,
+ };
+ this._ConstantBuffer = new Buffer( d3dDevice, cBufferDesc );
+ }
+ //----------------
+ #endregion
+
+ #region " テクスチャとシェーダーリソースビューを生成する。"
+ //----------------
+ if( this._画像ファイルパス.Nullでも空でもない() )
+ {
+ // (A) 画像ファイルから生成する場合。
+ var 戻り値 = Utilities.CreateShaderResourceViewFromFile(
+ d3dDevice,
+ this._bindFlags,
+ フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this._画像ファイルパス ) );
+ this._ShaderResourceView = 戻り値.srv;
+ this._ShaderResourceViewSize = 戻り値.viewSize;
+ this.Texture = 戻り値.texture;
+ }
+ else if( this.ユーザ指定サイズdpx != Size2.Empty )
+ {
+ // (B) サイズを指定して生成する場合。
+ var 戻り値 = Utilities.CreateShaderResourceView(
+ d3dDevice,
+ this._bindFlags,
+ this.ユーザ指定サイズdpx );
+ this._ShaderResourceView = 戻り値.srv;
+ this.Texture = 戻り値.texture;
+
+ this._ShaderResourceViewSize = new Size2F( this.ユーザ指定サイズdpx.Width, this.ユーザ指定サイズdpx.Height );
+ }
+ else
+ {
+ throw new InvalidOperationException();
+ }
+ //----------------
+ #endregion
+ }
+ }
protected override void Onデバイス依存リソースの解放( デバイスリソース dr )
{
protected Size2 ユーザ指定サイズdpx;
-
+
protected Texture2D Texture = null;
using( var d3dLock = new AutoD3DDeviceLock( dr.DXGIDeviceManager, out Device d3dDevice ) )
using( d3dDevice )
{
- var シェーダコンパイルのオプション =
- ShaderFlags.Debug |
- ShaderFlags.SkipOptimization |
+ var シェーダコンパイルのオプション =
+ ShaderFlags.Debug |
+ ShaderFlags.SkipOptimization |
ShaderFlags.EnableStrictness |
ShaderFlags.PackMatrixColumnMajor;
this.dicレーン別現在のチップ種別番号 = new Dictionary<編集レーン種別, int>();
this.dicレーン別チップ種別バックアップ = new Dictionary<編集レーン種別, int>();
- foreach( var obj in Enum.GetValues(typeof(編集レーン種別)))
+ foreach( 編集レーン種別 editLaneType in Enum.GetValues(typeof(編集レーン種別)))
{
- var e = (編集レーン種別) obj;
- this.dicレーン別現在のチップ種別番号[ e ] = 0;
- this.dicレーン別チップ種別バックアップ[ e ] = 0;
+ this.dicレーン別現在のチップ種別番号[ editLaneType ] = 0;
+ this.dicレーン別チップ種別バックアップ[ editLaneType ] = 0;
}
this.dicレーン別チップ種別対応表 = new Dictionary<編集レーン種別, List<チップ種別>>();
- foreach( var obj in Enum.GetValues( typeof( 編集レーン種別 ) ) )
- this.dicレーン別チップ種別対応表[ (編集レーン種別) obj ] = new List<チップ種別>();
+ foreach( 編集レーン種別 editLaneType in Enum.GetValues( typeof( 編集レーン種別 ) ) )
+ this.dicレーン別チップ種別対応表[ editLaneType ] = new List<チップ種別>();
foreach( var kvp in this.Form.譜面.dicチップ編集レーン対応表 )
this.dicレーン別チップ種別対応表[ kvp.Value ].Add( kvp.Key );
// レーン名を描画。
var レーン名描画領域 = new Rectangle( 0, 0, 0, 0 );
- foreach( var obj in Enum.GetValues( typeof( 編集レーン種別 ) ) )
+ foreach( 編集レーン種別 editLaneType in Enum.GetValues( typeof( 編集レーン種別 ) ) )
{
- var e編集レーン = (編集レーン種別) obj;
-
- if( e編集レーン == 編集レーン種別.Unknown )
+ if( editLaneType == 編集レーン種別.Unknown )
break;
- レーン名描画領域.X = レーン名描画領域下側.X + ( this.dicレーン番号[ e編集レーン ] * this.チップサイズpx.Width ) + 2;
+ レーン名描画領域.X = レーン名描画領域下側.X + ( this.dicレーン番号[ editLaneType ] * this.チップサイズpx.Width ) + 2;
レーン名描画領域.Y = レーン名描画領域下側.Y + 2;
レーン名描画領域.Width = this.チップサイズpx.Width;
レーン名描画領域.Height = 24;
g.DrawString(
- this.レーンto名前[ e編集レーン ],
+ this.レーンto名前[ editLaneType ],
this.レーン名文字フォント,
this.レーン名文字影ブラシ,
レーン名描画領域,
レーン名描画領域.Y -= 2;
g.DrawString(
- this.レーンto名前[ e編集レーン ],
+ this.レーンto名前[ editLaneType ],
this.レーン名文字フォント,
this.レーン名文字ブラシ,
レーン名描画領域,
//-----------------
var dicレーン別チップリスト = new Dictionary<レーン種別, List<チップ>>();
- foreach( var lane in Enum.GetValues( typeof( レーン種別 ) ) )
- dicレーン別チップリスト[ (レーン種別) lane ] = new List<チップ>();
+ foreach( レーン種別 laneType in Enum.GetValues( typeof( レーン種別 ) ) )
+ dicレーン別チップリスト[ laneType ] = new List<チップ>();
//-----------------
#endregion
#region " dicレーン別チップリストの構築; 小節番号 の小節に存在するチップのみをレーン別に振り分けて格納する。"
#endregion
#region " Lane, Resolution, Chip 行 出力。"
//-----------------
- foreach( var laneObj in Enum.GetValues( typeof( レーン種別 ) ) )
+ foreach( レーン種別 laneType in Enum.GetValues( typeof( レーン種別 ) ) )
{
- var lane = (レーン種別) laneObj;
-
- if( 0 < dicレーン別チップリスト[ lane ].Count )
+ if( 0 < dicレーン別チップリスト[ laneType ].Count )
{
- sw.Write( $"Lane={lane.ToString()}; " );
+ sw.Write( $"Lane={laneType.ToString()}; " );
#region " 新しい解像度を求める。"
//-----------------
int 新しい解像度 = 1;
- foreach( var cc in dicレーン別チップリスト[ lane ] )
+ foreach( var cc in dicレーン別チップリスト[ laneType ] )
新しい解像度 = this._最小公倍数を返す( 新しい解像度, cc.小節解像度 );
//-----------------
#endregion
#region " dicレーン別チップリスト[ lane ] 要素の 小節解像度 と 小節内位置 を 新しい解像度 に合わせて修正する。 "
//-----------------
- foreach( var cc in dicレーン別チップリスト[ lane ] )
+ foreach( var cc in dicレーン別チップリスト[ laneType ] )
{
int 倍率 = 新しい解像度 / cc.小節解像度; // 新しい解像度 は 小節解像度 の最小公倍数なので常に割り切れる。
sw.Write( $"Resolution = {新しい解像度}; " );
sw.Write( "Chips = " );
- for( int i = 0; i < dicレーン別チップリスト[ lane ].Count; i++ )
+ for( int i = 0; i < dicレーン別チップリスト[ laneType ].Count; i++ )
{
- チップ cc = dicレーン別チップリスト[ lane ][ i ];
+ チップ cc = dicレーン別チップリスト[ laneType ][ i ];
// 位置を出力。
sw.Write( cc.小節内位置.ToString() );
#endregion
// 区切り文字 または 終端文字 を出力
- sw.Write( ( i == dicレーン別チップリスト[ lane ].Count - 1 ) ? ";" : "," );
+ sw.Write( ( i == dicレーン別チップリスト[ laneType ].Count - 1 ) ? ";" : "," );
}
sw.WriteLine( "" ); // 改行
//-----------------
var dicレーン別チップリスト = new Dictionary<レーン種別, List<チップ>>();
- foreach( var lane in Enum.GetValues( typeof( レーン種別 ) ) )
- dicレーン別チップリスト[ (レーン種別) lane ] = new List<チップ>();
+ foreach( レーン種別 laneType in Enum.GetValues( typeof( レーン種別 ) ) )
+ dicレーン別チップリスト[ laneType ] = new List<チップ>();
//-----------------
#endregion
#region " dicレーン別チップリストの構築; 小節番号 の小節に存在するチップのみをレーン別に振り分けて格納する。"
#endregion
#region " Lane, Resolution, Chip 行 出力。"
//-----------------
- foreach( var laneObj in Enum.GetValues( typeof( レーン種別 ) ) )
+ foreach( レーン種別 laneType in Enum.GetValues( typeof( レーン種別 ) ) )
{
- var lane = (レーン種別) laneObj;
-
- if( 0 < dicレーン別チップリスト[ lane ].Count )
+ if( 0 < dicレーン別チップリスト[ laneType ].Count )
{
- sw.Write( $"Lane={lane.ToString()}; " );
+ sw.Write( $"Lane={laneType.ToString()}; " );
#region " 新しい解像度を求める。"
//-----------------
int 新しい解像度 = 1;
- foreach( var cc in dicレーン別チップリスト[ lane ] )
+ foreach( var cc in dicレーン別チップリスト[ laneType ] )
新しい解像度 = this._最小公倍数を返す( 新しい解像度, cc.小節解像度 );
//-----------------
#endregion
#region " dicレーン別チップリスト[ lane ] 要素の 小節解像度 と 小節内位置 を 新しい解像度 に合わせて修正する。 "
//-----------------
- foreach( var cc in dicレーン別チップリスト[ lane ] )
+ foreach( var cc in dicレーン別チップリスト[ laneType ] )
{
int 倍率 = 新しい解像度 / cc.小節解像度; // 新しい解像度 は 小節解像度 の最小公倍数なので常に割り切れる。
sw.Write( $"Resolution = {新しい解像度}; " );
sw.Write( "Chips = " );
- for( int i = 0; i < dicレーン別チップリスト[ lane ].Count; i++ )
+ for( int i = 0; i < dicレーン別チップリスト[ laneType ].Count; i++ )
{
- チップ cc = dicレーン別チップリスト[ lane ][ i ];
+ チップ cc = dicレーン別チップリスト[ laneType ][ i ];
// 位置を出力。
sw.Write( cc.小節内位置.ToString() );
#endregion
// 区切り文字 または 終端文字 を出力
- sw.Write( ( i == dicレーン別チップリスト[ lane ].Count - 1 ) ? ";" : "," );
+ sw.Write( ( i == dicレーン別チップリスト[ laneType ].Count - 1 ) ? ";" : "," );
}
sw.WriteLine( "" ); // 改行
{
using( Log.Block( Utilities.現在のメソッド名 ) )
{
+ // グローバルリソースのうち、デバイス依存リソースを持つものが対象。
+
App.ステージ管理.現在のステージ?.デバイス依存リソースを解放する( App.デバイスリソース );
+
App.ユーザ管理.デバイス依存リソースを解放する( App.デバイスリソース );
}
}
{
using( Log.Block( Utilities.現在のメソッド名 ) )
{
+ // グローバルリソースのうち、デバイス依存リソースを持つものが対象。
+
App.ユーザ管理.デバイス依存リソースを作成する( App.デバイスリソース );
+
App.ステージ管理.現在のステージ?.デバイス依存リソースを作成する( App.デバイスリソース );
}
}
Folder.フォルダ変数を追加または更新する( "AppData", Folder.AppData );
Folder.フォルダ変数を追加または更新する( "UserRoot", Folder.UserRoot );
- if (false == Directory.Exists( Folder.AppData ))
+ if( false == Directory.Exists( Folder.AppData ) )
Directory.CreateDirectory( Folder.AppData );
}
if( this.現在のフェーズ != フェーズ.開始 )
return;
- var node = (App.ビュアーモードではない) ?
- (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード
+ var node = ( App.ビュアーモードではない ) ?
+ (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード
App.ビュアー用ノード; // (B) ビュアーモード時
string 選択曲ファイルパス = node.曲ファイルパス;
private readonly List<RectangleF> _文字矩形dpx = new List<RectangleF>() {
#region " [0]~[9]: '0'~'9', [10]:'COMBO' "
- //----------------
- new RectangleF( 0, 0, 45, 70 ),
- new RectangleF( 45, 0, 45, 70 ),
- new RectangleF( 90, 0, 45, 70 ),
- new RectangleF( 135, 0, 45, 70 ),
- new RectangleF( 180, 0, 45, 70 ),
- new RectangleF( 0, 70, 45, 70 ),
- new RectangleF( 45, 70, 45, 70 ),
- new RectangleF( 90, 70, 45, 70 ),
- new RectangleF( 135, 70, 45, 70 ),
- new RectangleF( 180, 70, 45, 70 ),
- new RectangleF( 0, 140, 90, 32 ),
- //----------------
- #endregion
+ //----------------
+ new RectangleF( 0, 0, 45, 70 ),
+ new RectangleF( 45, 0, 45, 70 ),
+ new RectangleF( 90, 0, 45, 70 ),
+ new RectangleF( 135, 0, 45, 70 ),
+ new RectangleF( 180, 0, 45, 70 ),
+ new RectangleF( 0, 70, 45, 70 ),
+ new RectangleF( 45, 70, 45, 70 ),
+ new RectangleF( 90, 70, 45, 70 ),
+ new RectangleF( 135, 70, 45, 70 ),
+ new RectangleF( 180, 70, 45, 70 ),
+ new RectangleF( 0, 140, 90, 32 ),
+ //----------------
+ #endregion
};
private const int _桁ごとのジャンプの遅れ = 50; // 1桁につき 50 インデックス遅れる
namespace SST.ステージ.演奏
{
/// <summary>
- /// AutoPlay用のドラムサウンド。
+ /// AutoPlayer用のドラムサウンド。
/// </summary>
class ドラムサウンド : Activity
{
lock( this._スレッド間同期 )
{
if( false == this._チップtoコンテキスト.ContainsKey( chipType ) )
- return; // ã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88æ\9cªç\99»é\8c²ã\81®ã\83\81ã\83\83ã\83\97ã\81ªã\82\89何もしない。
+ return; // ã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88æ\9cªç\99»é\8c²ã\81®ã\83\81ã\83\83ã\83\97ã\81ªã\81®ã\81§何もしない。
var context = this._チップtoコンテキスト[ chipType ];
{
lock( this._スレッド間同期 )
{
- var laneType = App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表.対応表[ chipType ].表示レーン種別;
+ var laneType = App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表[ chipType ].表示レーン種別;
if( laneType != 表示レーン種別.Unknown )
this.表示開始( laneType, hitRankType );
{
// すべての表示レーンについて、進行描画コンテキストを生成する。
this._表示レーンto進行描画コンテキスト = new Dictionary<表示レーン種別, 進行描画コンテキスト>();
- foreach( var laneType in typeof( 表示レーン種別 ).GetEnumValues() )
- this._表示レーンto進行描画コンテキスト.Add( ( 表示レーン種別 ) laneType, new 進行描画コンテキスト() );
+ foreach( 表示レーン種別 laneType in Enum.GetValues(typeof( 表示レーン種別 ) ) )
+ this._表示レーンto進行描画コンテキスト.Add( laneType, new 進行描画コンテキスト() );
}
protected override void On非活性化( デバイスリソース dr )
lock( this._スレッド間同期 )
{
// すべての表示レーン種別について、進行描画する。
- foreach( var lane_object in typeof( 表示レーン種別 ).GetEnumValues() )
+ foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
{
- var lane = (表示レーン種別) lane_object;
var context = this._表示レーンto進行描画コンテキスト[ lane ];
if( context.進行カウンタ.停止中である )
// 進行。
- #region " 進行カウンタが終了値に達したら停止 → 表示完了。"
- //----------------
if( context.進行カウンタ.終了値に達した )
{
+ #region " 進行カウンタが終了値に達したら停止 → 表示完了。"
+ //----------------
context.進行カウンタ.一時停止する();
continue;
+ //----------------
+ #endregion
}
- //----------------
- #endregion
if( context.ヒットランク種別 != ヒットランク種別.MISS )
{
using FDK;
using FDK.メディア;
using FDK.カウンタ;
-using SSTFormat.v2;
using Utilities = FDK.Utilities;
this._チップ画像の矩形リスト = new 矩形リスト( @"$(System)\images\Chips Rectangle List.xml" ); // デバイスリソースは持たないので、子Activityではない。
this.ヒットランク別ヒット回数.Clear();
- foreach( var hitRankType in typeof( ヒットランク種別 ).GetEnumValues() )
- this.ヒットランク別ヒット回数[ ( ヒットランク種別 ) hitRankType ] = 0;
+ foreach( ヒットランク種別 hitRankType in Enum.GetValues( typeof( ヒットランク種別 ) ) )
+ this.ヒットランク別ヒット回数[ hitRankType ] = 0;
#region " 背景動画とBGMを生成する。"
//----------------
private double _現在進行描画中の譜面スクロール速度の倍率 = 1.0;
/// <summary>
- /// 演奏スコア.チップリスト[] のうち、描画を始めるチップのインデックス番号。
+ /// <see cref="スコア.チップリスト"/> のうち、描画を始めるチップのインデックス番号。
/// 未演奏時・演奏終了時は -1 。
/// </summary>
/// <remarks>
this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離dpx ) => {
var オプション設定 = App.ユーザ管理.選択されているユーザ.オプション設定;
- var 対応表 = オプション設定.ドラムとチップと入力の対応表.対応表[ chip.チップ種別 ];
+ var 対応表 = オプション設定.ドラムとチップと入力の対応表[ chip.チップ種別 ];
var AutoPlay = オプション設定.AutoPlay[ 対応表.AutoPlay種別 ];
bool チップはヒット済みである = chip.ヒット済みである;
this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離dpx ) => {
var オプション設定 = App.ユーザ管理.選択されているユーザ.オプション設定;
- var 対応表 = オプション設定.ドラムとチップと入力の対応表.対応表[ chip.チップ種別 ];
+ var 対応表 = オプション設定.ドラムとチップと入力の対応表[ chip.チップ種別 ];
bool AutoPlay = オプション設定.AutoPlay[ 対応表.AutoPlay種別 ];
double ヒット判定バーとの時間の絶対値sec = Math.Abs( ヒット判定バーとの時間sec );
bool チップはヒット済みである = chip.ヒット済みである;
this._コンボ.COMBO値++;
this._回転羽.発火する(
new Vector2(
- レーンフレームの左端位置dpx + レーンフレーム.レーンto横中央相対位置dpx[ App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表.対応表[ chip.チップ種別 ].表示レーン種別 ],
+ レーンフレームの左端位置dpx + レーンフレーム.レーンto横中央相対位置dpx[ App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表[ chip.チップ種別 ].表示レーン種別 ],
ヒット判定バーの中央Y座標dpx ) );
this._ヒットランク.表示開始( chip.チップ種別, hitRankType );
this.ヒットランク別ヒット回数[ hitRankType ]++;
App.入力管理.すべての入力デバイスをポーリングする();
- #region " ESC → キャンセル "
- //----------------
if( App.入力管理.キーボードデバイス.キーが押された( 0, Key.Escape ) )
{
+ #region " ESC → キャンセル "
+ //----------------
this.現在のフェーズ = フェーズ.キャンセル;
return;
+ //----------------
+ #endregion
}
- //----------------
- #endregion
- #region " シンバル → 曲決定 "
- //----------------
if( App.入力管理.シンバルが入力された() )
{
+ #region " シンバル → 曲決定 "
+ //----------------
if( null != App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード )
{
this.現在のフェーズ = フェーズ.曲決定;
{
Log.WARNING( "演奏する曲が選択されていません。" );
}
+ //----------------
+ #endregion
}
- //----------------
- #endregion
- #region " 上, Tom2 → 曲カーソル上移動 "
- //----------------
if( App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom2 ) ||
App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom2_Rim ) ||
App.入力管理.キーボードデバイス.キーが押された( 0, Key.Up ) )
{
+ #region " 上, Tom2 → 曲カーソル上移動 "
+ //----------------
this._曲パネルビュー.カーソルを上に移動する();
+ //----------------
+ #endregion
}
- //----------------
- #endregion
- #region " 下, Snare → 曲カーソル下移動 "
- //----------------
if( App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Snare ) ||
App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Snare_ClosedRim ) ||
App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Snare_OpenRim ) ||
App.入力管理.キーボードデバイス.キーが押された( 0, Key.Down ) )
{
+ #region " 下, Snare → 曲カーソル下移動 "
+ //----------------
this._曲パネルビュー.カーソルを下に移動する();
+ //----------------
+ #endregion
}
- //----------------
- #endregion
- #region " 左, Tom1 → 曲カーソル左移動 "
- //----------------
if( App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom1 ) ||
App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom1_Rim ) ||
App.入力管理.キーボードデバイス.キーが押された( 0, Key.Left ) )
{
+ #region " 左, Tom1 → 曲カーソル左移動 "
+ //----------------
this._曲パネルビュー.カーソルを左に移動する();
+ //----------------
+ #endregion
}
- //----------------
- #endregion
- #region " 右, Tom3 → 曲カーソル右移動 "
- //----------------
if( App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom3 ) ||
App.入力管理.ドラムが入力された( 入力.ドラム入力種別.Tom3_Rim ) ||
App.入力管理.キーボードデバイス.キーが押された( 0, Key.Right ) )
{
+ #region " 右, Tom3 → 曲カーソル右移動 "
+ //----------------
this._曲パネルビュー.カーソルを右に移動する();
+ //----------------
+ #endregion
}
- //----------------
- #endregion
}
// ポーリングされた入力イベントのうち、キーバインディングに登録されているイベントだけを ポーリング結果 に追加する。
foreach( var ev in 入力デバイス.入力イベントリスト )
{
- // ã\83\87ã\83\90ã\82¤ã\82¹toã\83\89ã\83©ã\83 対å¿\9c表 ã\82\92使ã\81£ã\81¦ã\80\81å\85¥å\8a\9bã\82¤ã\83\99ã\83³ã\83\88 ev ã\82\92ã\83\89ã\83©ã\83 å\85¥å\8a\9bにマッピングする。
+ // ã\82ã\83¼ã\83\90ã\82¤ã\83³ã\83\87ã\82£ã\83³ã\82°ã\82\92使ã\81£ã\81¦ã\80\81å\85¥å\8a\9bã\82¤ã\83\99ã\83³ã\83\88 ev ã\82\92ã\83\89ã\83©ã\83 å\85¥å\8a\9b evKey にマッピングする。
var evKey = new キーバインディング.IdKey( ev );
if( false == デバイスtoドラム対応表.ContainsKey( evKey ) )
/// すべてのノードで同一、固定値。
/// </summary>
public static Size2F 全体サイズdpx
- => new Size2F( 314f, 220f );
+ {
+ get
+ => new Size2F( 314f, 220f );
+ }
public Node()
{
using( Log.Block( Utilities.現在のメソッド名 ) )
{
- if( !Directory.Exists( ユーザフォルダパス ) )
+ if( false == Directory.Exists( ユーザフォルダパス ) )
Directory.CreateDirectory( ユーザフォルダパス ); // 失敗したら例外発生。
var xmlPath = Path.Combine( ユーザフォルダパス, _OptionXmlファイル名 );
};
this.最大ヒット距離sec = new Dictionary<ヒットランク種別, double>();
- foreach( ヒットランク種別 hr in Enum.GetValues( typeof( ヒットランク種別 ) ) )
- this.最大ヒット距離sec[ hr ] = this._最大ヒット距離secの既定値[ hr ];
+ foreach( ヒットランク種別 hitRankType in Enum.GetValues( typeof( ヒットランク種別 ) ) )
+ this.最大ヒット距離sec[ hitRankType ] = this._最大ヒット距離secの既定値[ hitRankType ];
this.AutoPlay = new Dictionary<AutoPlay種別, bool>();
- foreach( AutoPlay種別 apt in Enum.GetValues( typeof( AutoPlay種別 ) ) )
- this.AutoPlay[ apt ] = false;
+ foreach( AutoPlay種別 autoPlayType in Enum.GetValues( typeof( AutoPlay種別 ) ) )
+ this.AutoPlay[ autoPlayType ] = false;
this.譜面スクロール速度の倍率 = 1.0;
this.動画表示パターン種別 = 動画表示パターン種別.中央表示;
public SharpDX.Size2 物理画面サイズpx { get; set; }
/// <summary>
- /// スワップチェーンの表示をディスプレイの垂直帰線中に行う場合は true。
+ /// スワップチェーンの表示切替をディスプレイの垂直帰線中に行う場合は true。
/// </summary>
/// <remarks>
/// false にすると、ティアリングや、ビデオカードの不要な発熱が生じる可能性がある。
- /// なお、入出力や発声など高精度なタイミング制御が必要なアクションは常に垂直帰線を待たずに行われるため、ここで設定される値とは無関係。
+ /// なお、演奏時の入出力や発声など高精度なタイミング制御が必要なアクションは常に垂直帰線を待たずに行われるため、ここで設定される値とは無関係。
/// </remarks>
[DataMember]
public bool 垂直帰線待ちを行う { get; set; }
protected set;
}
+ public Column this[ チップ種別 chipType ]
+ {
+ get
+ => this.対応表[ chipType ];
+ }
+
/// <summary>
/// コンストラクタ。対応表を生成する。
/// </summary>
{
var ユーザフォルダパス = SST.IO.Folder.User( this.プロパティ.名前 );
- if( !Directory.Exists( ユーザフォルダパス ) )
+ if( false == Directory.Exists( ユーザフォルダパス ) )
Directory.CreateDirectory( ユーザフォルダパス ); // 失敗したら例外発生。
// プロパティを保存。
/// <remarks>
/// ユーザクラスを <see cref="FDK.Activity"/> から派生可能にするため、DataContract 部分をこのクラスに抽出。
/// </remarks>
-
[DataContract( Name = "Properties", Namespace = "" )]
class ユーザプロパティ : IExtensibleDataObject
{
var userManager = new ユーザ管理();
// ユーザルートフォルダがなければ作成する。
- if( !Directory.Exists( SST.IO.Folder.UserRoot ) )
+ if( false == Directory.Exists( SST.IO.Folder.UserRoot ) )
Directory.CreateDirectory( SST.IO.Folder.UserRoot );
// 条件に適合するフォルダをユーザフォルダとみなし、そのパスを列挙する。
try
{
- var 新ユーザ = ユーザ.復元する( SST.IO.Folder.User( ユーザ名 ) );
- var 旧ユーザ = this.ユーザリスト[ index ];
-
// 既存のユーザを削除して、
this.ユーザを削除する( index );
// 同じ位置に新ユーザを挿入して。
+ var 新ユーザ = ユーザ.復元する( SST.IO.Folder.User( ユーザ名 ) );
this.ユーザを追加する( 新ユーザ, index );
// 削除した際に選択ユーザが変更されているので、再選択する。