\r
namespace FDK\r
{\r
- public class CCounter : IDisposable\r
+ /// <summary>\r
+ /// 一定間隔で単純増加する整数(カウント値)を扱う。\r
+ /// </summary>\r
+ public class CCounter\r
{\r
- // プロパティ(1) 値系\r
+ // 値プロパティ\r
\r
public int n開始値\r
{\r
get;\r
- protected set;\r
+ private set;\r
}\r
public int n終了値\r
{\r
get;\r
- protected set;\r
+ private set;\r
}\r
public int n現在の値\r
{\r
}\r
\r
\r
- // プロパティ(2) 状態系\r
+ // 状態プロパティ\r
\r
public bool b進行中\r
{\r
\r
// コンストラクタ\r
\r
- /// <summary>\r
- /// <para>生成のみ行い、開始はしない。</para>\r
- /// </summary>\r
public CCounter()\r
{\r
- this.timer = new CTimer( CTimer.E種別.MultiMedia );\r
+ this.timer = null;\r
this.n開始値 = 0;\r
this.n終了値 = 0;\r
this.n間隔ms = 0;\r
this.n現在の値 = 0;\r
this.n現在の経過時間ms = CTimer.n未使用;\r
- this.m一定間隔処理 = null;\r
- }\r
-\r
- /// <summary>\r
- /// <para>生成と同時に開始する。</para>\r
- /// </summary>\r
- public CCounter( int n最初のカウント値, int n最後のカウント値, int nカウント値を1増加させるのにかける時間ms )\r
- : this()\r
- {\r
- this.t開始( n最初のカウント値, n最後のカウント値, nカウント値を1増加させるのにかける時間ms );\r
}\r
\r
- #region [ DTXMania用の変換 ]\r
+ /// <summary>生成と同時に開始する。</summary>\r
public CCounter( int n開始値, int n終了値, int n間隔ms, CTimer timer )\r
: this()\r
{\r
-// this.timer = timer;\r
- this.t開始( n開始値, n終了値, n間隔ms );\r
- }\r
- public void t開始( int n最初のカウント値, int n最後のカウント値, int nカウント値を1増加させるのにかける時間ms, CTimer timer )\r
- {\r
-// this.timer = timer;\r
- this.t開始( n最初のカウント値, n最後のカウント値, nカウント値を1増加させるのにかける時間ms );\r
+ this.t開始( n開始値, n終了値, n間隔ms, timer );\r
}\r
- #endregion\r
+\r
\r
// 状態操作メソッド\r
\r
/// <summary>\r
- /// <para>カウントを開始する。</para>\r
+ /// カウントを開始する。\r
/// </summary>\r
- public void t開始( int n最初のカウント値, int n最後のカウント値, int nカウント値を1増加させるのにかける時間ms )\r
+ /// <param name="n開始値">最初のカウント値。</param>\r
+ /// <param name="n終了値">最後のカウント値。</param>\r
+ /// <param name="n間隔ms">カウント値を1増加させるのにかける時間(ミリ秒単位)。</param>\r
+ /// <param name="timer">カウントに使用するタイマ。</param>\r
+ public void t開始( int n開始値, int n終了値, int n間隔ms, CTimer timer )\r
{\r
- this.timer.tリセット();\r
- this.n開始値 = n最初のカウント値;\r
- this.n終了値 = n最後のカウント値;\r
- this.n間隔ms = nカウント値を1増加させるのにかける時間ms;\r
- this.n現在の経過時間ms = this.timer.n現在時刻ms;\r
- this.n現在の値 = n最初のカウント値;\r
- this.m一定間隔処理 = new C一定間隔処理();\r
+ this.n開始値 = n開始値;\r
+ this.n終了値 = n終了値;\r
+ this.n間隔ms = n間隔ms;\r
+ this.timer = timer;\r
+ this.n現在の経過時間ms = this.timer.n現在時刻;\r
+ this.n現在の値 = n開始値;\r
}\r
\r
/// <summary>\r
- /// <para>前回の t進行() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。</para>\r
- /// <para>カウント値が終了値に達している場合は、それ以上増加しない(終了値を維持する)。</para>\r
- /// <para>戻り値として自分自身を返す。</para>\r
+ /// 前回の t進行() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。\r
+ /// カウント値が終了値に達している場合は、それ以上増加しない(終了値を維持する)。\r
/// </summary>\r
- public CCounter t進行()\r
+ public void t進行()\r
{\r
- if ( this.m一定間隔処理 != null )\r
+ if ( ( this.timer != null ) && ( this.n現在の経過時間ms != CTimer.n未使用 ) )\r
{\r
- this.m一定間隔処理.t進行( this.n間隔ms, () =>\r
+ long num = this.timer.n現在時刻;\r
+ if ( num < this.n現在の経過時間ms )\r
+ this.n現在の経過時間ms = num;\r
+\r
+ while ( ( num - this.n現在の経過時間ms ) >= this.n間隔ms )\r
{\r
if ( ++this.n現在の値 > this.n終了値 )\r
this.n現在の値 = this.n終了値;\r
- } );\r
- }\r
\r
- return this;\r
+ this.n現在の経過時間ms += this.n間隔ms;\r
+ }\r
+ }\r
}\r
\r
/// <summary>\r
- /// <para>前回の t進行Loop() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。</para>\r
- /// <para>カウント値が終了値に達している場合は、次の増加タイミングで開始値に戻る(値がループする)。</para>\r
- /// <para>戻り値として自分自身を返す。</para>\r
+ /// 前回の t進行Loop() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。\r
+ /// カウント値が終了値に達している場合は、次の増加タイミングで開始値に戻る(値がループする)。\r
/// </summary>\r
- public CCounter t進行Loop()\r
+ public void t進行Loop()\r
{\r
- this.m一定間隔処理.t進行( this.n間隔ms, () => {\r
- if( ++this.n現在の値 > this.n終了値 )\r
- this.n現在の値 = this.n開始値;\r
- } );\r
+ if ( ( this.timer != null ) && ( this.n現在の経過時間ms != CTimer.n未使用 ) )\r
+ {\r
+ long num = this.timer.n現在時刻;\r
+ if ( num < this.n現在の経過時間ms )\r
+ this.n現在の経過時間ms = num;\r
\r
- return this;\r
+ while ( ( num - this.n現在の経過時間ms ) >= this.n間隔ms )\r
+ {\r
+ if ( ++this.n現在の値 > this.n終了値 )\r
+ this.n現在の値 = this.n開始値;\r
+\r
+ this.n現在の経過時間ms += this.n間隔ms;\r
+ }\r
+ }\r
}\r
\r
/// <summary>\r
- /// <para>カウントを停止する。</para>\r
- /// <para>これ以降に t進行() や t進行Loop() を呼び出しても何も処理されない。</para>\r
+ /// カウントを停止する。\r
+ /// これ以降に t進行() や t進行Loop() を呼び出しても何も処理されない。\r
/// </summary>\r
public void t停止()\r
{\r
\r
// その他\r
\r
- #region [ IDisposable 実装 ]\r
- //-----------------\r
- public void Dispose()\r
- {\r
- C共通.tDisposeする( ref this.timer );\r
- C共通.tDisposeする( ref this.m一定間隔処理 );\r
- }\r
- //-----------------\r
- #endregion\r
-\r
#region [ 応用:キーの反復入力をエミュレーションする ]\r
//-----------------\r
\r
const int n2回目 = 1;\r
const int n3回目以降 = 2;\r
\r
- if( bキー押下 )\r
+ if ( bキー押下 )\r
{\r
- switch( this.n現在の値 )\r
+ switch ( this.n現在の値 )\r
{\r
case n1回目:\r
\r
tキー処理();\r
this.n現在の値 = n2回目;\r
- this.n現在の経過時間ms = this.timer.n現在時刻ms;\r
+ this.n現在の経過時間ms = this.timer.n現在時刻;\r
return;\r
\r
case n2回目:\r
\r
- if( ( this.timer.n現在時刻ms - this.n現在の経過時間ms ) > 200 )\r
+ if ( ( this.timer.n現在時刻 - this.n現在の経過時間ms ) > 200 )\r
{\r
tキー処理();\r
- this.n現在の経過時間ms = this.timer.n現在時刻ms;\r
+ this.n現在の経過時間ms = this.timer.n現在時刻;\r
this.n現在の値 = n3回目以降;\r
}\r
return;\r
\r
case n3回目以降:\r
\r
- if( ( this.timer.n現在時刻ms - this.n現在の経過時間ms ) > 30 )\r
+ if ( ( this.timer.n現在時刻 - this.n現在の経過時間ms ) > 30 )\r
{\r
tキー処理();\r
- this.n現在の経過時間ms = this.timer.n現在時刻ms;\r
+ this.n現在の経過時間ms = this.timer.n現在時刻;\r
}\r
return;\r
}\r
//-----------------\r
#endregion\r
\r
- #region [ protected ]\r
+ #region [ private ]\r
//-----------------\r
- protected CTimer timer;\r
- protected int n間隔ms;\r
- protected C一定間隔処理 m一定間隔処理;\r
+ private CTimer timer;\r
+ private int n間隔ms;\r
//-----------------\r
#endregion\r
}\r