1

メソッドが最後に呼び出されてから経過した時間を返すメソッドを作成しようとしています。次のようになります。

package JGame.Util;

import java.util.Date;

public class Util{

    protected static Long lastTime = null;

    public static long getLastTime(){
        long time = new Date().getTime();
        if(Util.lastTime == null){
            Util.lastTime = time;
            return 0;
        }
        long ftime = time - Util.lastTime;
        Util.lastTime = time;
        return ftime;
    }
}

次に、キーを押すイベント内で、次のようなメソッドを呼び出します。

long lastTime = Util.getLastTime();
if(lastTime > 1000){
    return;
}
System.out.println(lastTime);

私が抱えている問題は、キーを押すとlastTime印刷されますが、1秒に1回しか印刷されないということです。

出力は次のとおりです。

122
6
7
13
9
7
10
9
10

キーを押している間、私はすべてが1秒間隔に非常に近いことを期待していました。しかし、数字は近くさえありません。

4

3 に答える 3

5

あなたはあなたの状態を間違った方向に持っています。これを見てください:

if (lastTime > 1000) {
    return;
}

つまり、メソッドが最後に呼び出されたのが1秒以上前の場合は、何も出力しないでください。したがって、何度も連続して呼び出すと、最初のチェック以降は常にこのチェックを通過します。

私はあなたが欲しいと思うと思う

if (lastTime < 1000) {
    return;
}

...しかし、それでも実際には期待どおりの結果は得られません。そのコードを頻繁に実行を押すと、最初にそのチェックを通過するだけになるためです。

「最後に印刷された」時刻をリセットする必要があるのは、1秒以上前の場合のみです。

System.nanoTime()ああ、代わりに使用することをお勧めしますnew Date().getTime()-単調に増加することが保証されており、「現在の」壁時間ではなく時間差を測定するように設計されています。また、静的変数を使用するだけでなく、これを作成します。「しきい値」を許可し、そのしきい値を超えたかどうかを確認するメソッドを持つクラスを作成し、超えた場合はタイマーをリセットします。

public class TimeRegulator {
    private final long periodMilliseconds;

    private long lastTick = 0L; // 1970 will be long before the current time :)

    public TimeRegulator(long periodMilliseconds) {
        this.periodMilliseconds = periodMilliseconds;
    }

    public boolean checkTime() {
        long now = System.nanoTime();
        long diffNanos = now - lastTick;
        long diffMilliseconds = TimeUnit.NANOSECONDS.toMillis(diffNanos);
        if (diffMilliseconds < periodMilliseconds) {
            return false;
        }
        lastTick = now;
        return true;
    }
}

また、このすべてをテスト可能にするために、「現在の時刻を取得する」の抽象化を挿入することを検討してください...また、組み込みライブラリの代わりにJodaTimeを使用することも検討してください:)

于 2012-12-23T22:42:15.540 に答える
2

最後の呼び出しが1秒以上離れていた場合は戻ってきますが、1秒未満離れていた場合は戻る必要があると思います。

コードが(修正しない限り)決して実行しないのは、1000より大きい値を出力することです。

于 2012-12-23T22:40:39.060 に答える
2

ifステートメントが逆になります。

if(lastTime > 1000){
    return;
}

最後の間隔が1秒を超える場合に戻ります。これは、説明しているものとは逆です。これをに変更してみてくださいif(lastTime < 1000){

そうでなければ、私はあなたのコードに何も悪いことを見ることができません。

于 2012-12-23T22:42:19.683 に答える