1
0
mirror of synced 2024-11-28 17:31:00 +01:00
OpenTaiko/FDK19/コード/00.共通/CCounter.cs
2021-09-21 00:16:38 +02:00

316 lines
9.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
namespace FDK
{
/// <summary>
/// 一定間隔で単純増加する整数(カウント値)を扱う。
/// </summary>
/// <remarks>
/// ○使い方
/// 1.CCounterの変数をつくる。
/// 2.CCounterを生成
/// ctCounter = new CCounter( 0, 3, 10, CDTXMania.Timer );
/// 3.進行メソッドを使用する。
/// 4.ウマー。
///
/// double値を使う場合、t進行db、t進行LoopDbを使うこと。
/// また、double版では間隔の値はミリ秒単位ではなく、通常の秒単位になります。
/// </remarks>
public class CCounter
{
public bool b開始した
{
get;
set;
}
// 値プロパティ
public float n開始値
{
get;
private set;
}
public float n終了値
{
get;
set;
}
public int n現在の値
{
get;
set;
}
public double _n間隔
{
get
{
return this.n間隔;
}
set
{
this.n間隔 = value >= 0 ? value : value * -1;
}
}
public float n現在の経過時間ms
{
get;
set;
}
// 状態プロパティ
public bool b進行中
{
get { return (this.n現在の経過時間ms != -1); }
}
public bool b停止中
{
get { return !this.b進行中; }
}
public bool b終了値に達した
{
get { return (this.n現在の値 >= this.n終了値); }
}
public bool b終了値に達してない
{
get { return !this.b終了値に達した; }
}
// コンストラクタ
public CCounter()
{
this.timer = null;
this.n開始値 = 0;
this.n終了値 = 0;
this.n現在の値 = 0;
this.n現在の値 = 0;
this.n現在の経過時間ms = CSoundTimer.n未使用;
}
/// <summary>生成と同時に開始する。</summary>
public CCounter(float n開始値, float n終了値, float n間隔ms, CTimer timer)
: this()
{
this.t開始(n開始値, n終了値, n間隔ms, timer);
}
/// <summary>生成と同時に開始する。(double版)</summary>
public CCounter(double db開始値, double db終了値, double db間隔, CSoundTimer timer)
: this()
{
this.t開始(db開始値, db終了値, db間隔 * 1000.0f, timer);
}
// 状態操作メソッド
/// <summary>
/// カウントを開始する。
/// </summary>
/// <param name="n開始値">最初のカウント値。</param>
/// <param name="n終了値">最後のカウント値。</param>
/// <param name="n間隔ms">カウント値を1増加させるのにかける時間(ミリ秒単位)。</param>
/// <param name="timer">カウントに使用するタイマ。</param>
public void t開始(float n開始値, float n終了値, float n間隔ms, CTimer timer)
{
this.n開始値 = n開始値;
this.n終了値 = n終了値;
this._n間隔 = n間隔ms;
this.timer = timer;
this.n現在の経過時間ms = this.timer.n現在時刻;
this.n現在の値 = (int)n開始値;
this.b開始した = true;
}
/// <summary>
/// カウントを開始する。(double版)
/// </summary>
/// <param name="db開始値">最初のカウント値。</param>
/// <param name="db終了値">最後のカウント値。</param>
/// <param name="db間隔">カウント値を1増加させるのにかける時間(秒単位)。</param>
/// <param name="timer">カウントに使用するタイマ。</param>
public void t開始(double db開始値, double db終了値, double db間隔, CSoundTimer timer)
{
this.n開始値 = (float)db開始値;
this.n終了値 = (float)db終了値;
this._n間隔 = db間隔;
this.timerdb = timer;
this.n現在の経過時間ms = (float)this.timerdb.dbシステム時刻;
this.n現在の値 = (int)db開始値;
this.b開始した = true;
}
/// <summary>
/// 前回の t進行() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。
/// カウント値が終了値に達している場合は、それ以上増加しない(終了値を維持する)。
/// </summary>
public void t進行()
{
if ((this.timer != null) && (this.n現在の経過時間ms != CTimer.n未使用))
{
long num = this.timer.n現在時刻;
if (num < this.n現在の経過時間ms)
this.n現在の経過時間ms = num;
while ((num - this.n現在の経過時間ms) >= this.n間隔)
{
if (++this.n現在の値 > this.n終了値)
this.n現在の値 = (int)this.n終了値;
this.n現在の経過時間ms += (float)this.n間隔;
}
}
}
/// <summary>
/// 前回の t進行() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。
/// カウント値が終了値に達している場合は、それ以上増加しない(終了値を維持する)。
/// </summary>
public void t進行db()
{
if ((this.timerdb != null) && (this.n現在の経過時間ms != CSoundTimer.n未使用))
{
double num = this.timerdb.n現在時刻;
if (num < this.n現在の経過時間ms)
this.n現在の経過時間ms = (float)num;
while ((num - this.n現在の経過時間ms) >= this.n間隔)
{
if (++this.n現在の値 > this.n終了値)
this.n現在の値 = (int)this.n終了値;
this.n現在の経過時間ms += (float)this.n間隔;
}
}
}
/// <summary>
/// 前回の t進行Loop() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。
/// カウント値が終了値に達している場合は、次の増加タイミングで開始値に戻る(値がループする)。
/// </summary>
public void t進行Loop()
{
if ((this.timer != null) && (this.n現在の経過時間ms != CTimer.n未使用))
{
long num = this.timer.n現在時刻;
if (num < this.n現在の経過時間ms)
this.n現在の経過時間ms = num;
while ((num - this.n現在の経過時間ms) >= this.n間隔)
{
if (++this.n現在の値 > this.n終了値)
this.n現在の値 = (int)this.n開始値;
this.n現在の経過時間ms += (float)this.n間隔;
}
}
}
/// <summary>
/// 前回の t進行Loop() の呼び出しからの経過時間をもとに、必要なだけカウント値を増加させる。
/// カウント値が終了値に達している場合は、次の増加タイミングで開始値に戻る(値がループする)。
/// </summary>
public void t進行LoopDb()
{
if ((this.timerdb != null) && (this.n現在の経過時間ms != CSoundTimer.n未使用))
{
double num = this.timerdb.n現在時刻;
if (num < this.n現在の経過時間ms)
this.n現在の経過時間ms = (float)num;
while ((num - this.n現在の経過時間ms) >= this.n間隔)
{
if (++this.n現在の値 > this.n終了値)
this.n現在の値 = (int)this.n開始値;
this.n現在の経過時間ms += (float)this.n間隔;
}
}
}
/// <summary>
/// カウントを停止する。
/// これ以降に t進行() や t進行Loop() を呼び出しても何も処理されない。
/// </summary>
public void t停止()
{
this.n現在の経過時間ms = CTimer.n未使用;
}
public void t間隔値変更(double Value)
{
this._n間隔 = Value;
}
// その他
#region [ ]
//-----------------
/// <summary>
/// <para>「bキー押下」引数が true の間中、「tキー処理」デリゲート引数を呼び出す。</para>
/// <para>ただし、2回目の呼び出しは1回目から 200ms の間を開けてから行い、3回目以降の呼び出しはそれぞれ 30ms の間隔で呼び出す。</para>
/// <para>「bキー押下」が false の場合は何もせず、呼び出し回数を 0 にリセットする。</para>
/// </summary>
/// <param name="bキー押下">キーが押下されている場合は true。</param>
/// <param name="tキー処理">キーが押下されている場合に実行する処理。</param>
public void tキー反復(bool bキー押下, DGキー処理 tキー処理)
{
const int n1回目 = 0;
const int n2回目 = 1;
const int n3回目以降 = 2;
if (bキー押下)
{
switch (this.n現在の値)
{
case n1回目:
tキー処理();
this.n現在の値 = n2回目;
this.n現在の経過時間ms = this.timer.n現在時刻;
return;
case n2回目:
if ((this.timer.n現在時刻 - this.n現在の経過時間ms) > 200)
{
tキー処理();
this.n現在の経過時間ms = this.timer.n現在時刻;
this.n現在の値 = n3回目以降;
}
return;
case n3回目以降:
if ((this.timer.n現在時刻 - this.n現在の経過時間ms) > 30)
{
tキー処理();
this.n現在の経過時間ms = this.timer.n現在時刻;
}
return;
}
}
else
{
this.n現在の値 = n1回目;
}
}
public delegate void DGキー処理();
//-----------------
#endregion
#region [ private ]
//-----------------
private CTimer timer;
private CSoundTimer timerdb;
private double n間隔;
//-----------------
#endregion
}
}