7

QTimer を使用する QT で書かれたアプリがあります。これは基本的にゲームであり、すべてのアクションはタイマーによって制御されます。ゲームには、ゲーム速度を増減する機能が含まれています。速度を上げるためのコードは次のとおりです。

    timerValue -= speedUpValue;
    if (timerValue < maxSpeed) {
        timerValue = maxSpeed;
    }
    timer -> setInterval(timerValue); 

speedUpValueおよびmaxSpeedは定数です。速度を下げるためにほぼ同じコードが使用されます。問題はsetInterval、内部タイマーをリセットすることです。したがって、速度を急速に上げたり下げたりし続けると、remainingTime常にリセットされているため、最終的にゲームが進行しなくなります。remainingTime手動で設定したり、リセットせずに間隔を変更したりする方法はありますか?

4

1 に答える 1

4

タイマー オブジェクトを完全に省略し、代わりに静的メソッド を使用QTimer::singleShot(...)して、timerValue. そのため、 がどれほど頻繁timerValueに変更されても、各タイマー サイクルは古い値で完了し、現在の値でスケジュールされます。

RA が述べたように、タイマー オブジェクトを保持したまま同じことを効果的に達成できますがsetInterval()、タイマー イベントに移動します。基本的には上記と同じですが、何らかの理由で必要な場合はタイマー オブジェクトを保持します。

Craig がコメントで述べたように、最初のアプローチでは、ゲーム ロジックに時間がかかる場合に備えて、タイマー イベントが蓄積されないようにすることもできます。また、非同期設計を使用する場合、継続的に実行されるタイマーを使用すると、古いゲーム サイクルが完了する前に次のゲーム サイクルが実行を開始する可能性があります。

この点については、継続的に実行されるタイマーを使用するのではなく、必要な場合にのみ、次のゲーム サイクルを手動でスケジュールすることをお勧めします。たとえば、ゲームが終了した場合、別のスケジュールを設定する必要がない場合があります。また、これにより、ゲーム速度の正確さをより細かく制御できます。ゲーム サイクルの実行が完了した後、次のサイクルが必要になるまでの残り時間を計算し、その値でスケジュールするか、または実行にかかった時間を計算できます。長すぎる場合は、すぐにスケジュールできます。

于 2015-10-03T07:30:01.667 に答える