私はただの馬鹿かもしれませんが、一日中ゲームループを実装しようとしていて、クリックしていません。私は文字通り、Google で見つけたすべての記事を読みましたが、問題は、それらがすべて異なるタイミング メカニズムを使用しているため、特定の状況に適用するのが難しいことです (ミリ秒を使用するものもあれば、ティックを使用するものもあります)。
基本的にClock
、ゲーム ループが実行されるたびに更新されるオブジェクトがあります。
internal class Clock {
public static long Timestamp {
get { return Stopwatch.GetTimestamp(); }
}
public static long Frequency {
get { return Stopwatch.Frequency; }
}
private long _startTime;
private long _lastTime;
private TimeSpan _totalTime;
private TimeSpan _elapsedTime;
/// <summary>
/// The amount of time that has passed since the first step.
/// </summary>
public TimeSpan TotalTime {
get { return _totalTime; }
}
/// <summary>
/// The amount of time that has passed since the last step.
/// </summary>
public TimeSpan ElapsedTime {
get { return _elapsedTime; }
}
public Clock() {
Reset();
}
public void Reset() {
_startTime = Timestamp;
_lastTime = 0;
_totalTime = TimeSpan.Zero;
_elapsedTime = TimeSpan.Zero;
}
public void Tick() {
long currentTime = Timestamp;
if (_lastTime == 0)
_lastTime = currentTime;
_totalTime = TimestampToTimeSpan(currentTime - _startTime);
_elapsedTime = TimestampToTimeSpan(currentTime - _lastTime);
_lastTime = currentTime;
}
public static TimeSpan TimestampToTimeSpan(long timestamp) {
return TimeSpan.FromTicks(
(timestamp * TimeSpan.TicksPerSecond) / Frequency);
}
}
そのほとんどは XNA に基づいていGameClock
ますが、大幅に単純化されています。次に、メソッドとメソッドが知る必要がTime
あるさまざまな時間を保持するクラスがあります。Update
Draw
public class Time {
public TimeSpan ElapsedVirtualTime { get; internal set; }
public TimeSpan ElapsedRealTime { get; internal set; }
public TimeSpan TotalVirtualTime { get; internal set; }
public TimeSpan TotalRealTime { get; internal set; }
internal Time() { }
internal Time(TimeSpan elapsedVirtualTime, TimeSpan elapsedRealTime,
TimeSpan totalVirutalTime, TimeSpan totalRealTime) {
ElapsedVirtualTime = elapsedVirtualTime;
ElapsedRealTime = elapsedRealTime;
TotalVirtualTime = totalVirutalTime;
TotalRealTime = totalRealTime;
}
}
私のメイン クラスは の 1 つのインスタンスを保持しTime
、ゲーム ループ中に常に更新する必要があります。これまでのところ、私はこれを持っています:
private static void Loop() {
do {
Clock.Tick();
Time.TotalRealTime = Clock.TotalTime;
Time.ElapsedRealTime = Clock.ElapsedTime;
InternalUpdate(Time);
InternalDraw(Time);
} while (!_exitRequested);
}
時間クラスのリアルタイム プロパティは非常に優れています。ここで、状態がフレームごとに可変回数更新されるように、適切な更新/描画ループが機能するようにしたいと思いますが、タイムステップは固定です。同時に、それに応じてTime.TotalVirtualTime
とTime.ElapsedVirtualTime
を更新する必要があります。さらに、ゲームループの設計に違いが生じた場合に備えて、将来的にマルチプレイヤーをサポートする予定です。
これを実装する方法に関するヒントや例はありますか (記事へのリンクは別として)?