0

我正在开发一款游戏,我正在使用postDelay()它来使动画更流畅。我遇到的一个问题是,如果我在其中执行该方法,postDelay()则该方法操作的变量不再以意想不到的方式发生变化。这会导致奇怪的行为,例如位图无法正确绘制。

以下是麻烦的部分:

       synchronized private void rotate(int dir) {
            final int originalAngle = angle; //angle is the suspicious variable
            final int steps = 4;

            for (int i = 0; i != steps; i++) {
                smoothAnimateRotate(i, steps, originalAngle, dir);
            }
            finishAnimateRotate(steps);
        }

        private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    angle = originalAngle + dir*(90*(i+1))/steps;
                    rotateStep();
                }
            }, 100 * (i + 1));
        }


        private void rotateStep() {
            angle = (angle+1800) % 360;
            viewdx = (int) (Math.cos(radify(angle))*(1<<16));
            viewdy = (int) (Math.sin(radify(angle))*(1<<16));
            moveStep();
        }

        private void moveStep() {
            notifyViewerRedraw() ;
            try {
                Thread.currentThread().sleep(25);
            } catch (Exception e) { }
        }

rotate()被快速调用时,我认为变量angle会以某种方式搞砸。当我间隔大约一秒钟调用时不会发生这种情况rotate(),但如果我做得非常快,angle则仅假设为 0、90、180 或 270 的 0、90、180 或 270 会更改为 45 度或其他。我不知道为什么调试没有提供丰硕的成果。那么我如何确保angle以这种意想不到的方式进行修改呢?

4

1 回答 1

0

我修好了它。我在 Runnables 中放置了一个名为 isRunning 的布尔值并打开和关闭它。

synchronized private void rotate(int dir) {
    final int originalAngle = angle;
    final int steps = 4;

    if (!isRunning) {
        for (int i = 0; i != steps; i++) {
            smoothAnimateRotate(i, steps, originalAngle, dir);
        }
        finishAnimateRotate(steps);
    }
}

private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) {
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            isRunning = true;
            angle = originalAngle + dir*(90*(i+1))/steps;
            rotateStep();
        }
    }, 100 * (i + 1));
}

private void finishAnimateRotate(final int steps) {
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            rotateFinish();
            isRunning = false;
        }
    }, 100 * (steps + 1));
}
于 2014-11-24T07:54:25.097 回答