-2

これが、間隔を制御するために使用する私のタイマークラスです。どなたでもご利用いただけます。

私が抱えている問題は、一時停止と再開にあります。正しく一時停止しますが、resume() を使用しようとすると、時間が再開しません。理由はありますか?

    public class Timer implements IUpdateHandler {
        // ===========================================================
        // Constants
        // ===========================================================

        // ===========================================================
        // Fields
        // ===========================================================
        private final ITimerCallback    mCallback;
        private float                                   mInterval;

        private float                                   mSecondsElapsed;
        protected boolean                               mPause  = false;

        private float                                   pausedSecond;

        // ===========================================================
        // Constructors
        // ===========================================================
        public Timer(final float interval, final ITimerCallback pCallback) {
        this.mInterval = interval;
        this.mCallback = pCallback;

        }

        // ===========================================================
        // Getter & Setter
        // ===========================================================
        public void setInterval(final float pInterval) {
        this.mInterval = pInterval;
        }

        // ===========================================================
        // Methods for/from SuperClass/Interfaces
        // ===========================================================
        @Override
        public void onUpdate(float pSecondsElapsed) {

        this.mSecondsElapsed += pSecondsElapsed;
        if (this.mSecondsElapsed >= this.mInterval) {
        if (!this.mPause) {
        this.mSecondsElapsed -= this.mInterval;
        this.mCallback.onTick();
        }
        }
        }

        @Override
        public void reset() {
        this.mSecondsElapsed = 0;

        }

        // ===========================================================
        // Methods
        // ===========================================================

        // ===========================================================
        // Inner and Anonymous Classes
        // ===========================================================
        public interface ITimerCallback {
                public void onTick();
        }

        public void pause() {

        this.mPause = true;
        this.pausedSecond = this.mSecondsElapsed;
        }

        public void resume() {
        if (this.mPause) {
        this.mSecondsElapsed = this.pausedSecond;
        this.mPause = false;

        } else {
        // not paused
        }
        }
}
4

2 に答える 2

1

シーンが言ったこと

    @Override
    public void onUpdate(float pSecondsElapsed) {

        this.mSecondsElapsed += pSecondsElapsed;
        if (this.mSecondsElapsed >= this.mInterval) {
            if (!this.mPause) {
                this.mSecondsElapsed -= this.mInterval;
            }
            this.mCallback.onTick();
        }
    }

これでうまくいくはずです。一時停止していない場合は、onTick を外側に移動するだけです

于 2012-08-06T18:47:51.243 に答える
0

Timer の onUpdate 関数がどのように呼び出されているかを駆動しているコードを見ることができず、使用している IUpdateHandler インターフェイスについてもよくわからないため、ここで手足を踏み出すつもりです。

タイマーが一時停止していない場合にのみ、 mCallback.onTick() を呼び出しているようです。

ただし、onTick が Timer の onUpdate 関数への次の呼び出しをセットアップする場合、一時停止して「ティック」すると、onTick メソッドが呼び出されず、関数への次の呼び出しがセットアップされません。

于 2012-08-06T18:45:37.607 に答える