在Flash AS3上平滑滚动

时间:2013-01-05 11:03:50

标签: actionscript-3 flash bitmapdata

是否可以在Flash中完全平滑滚动(ActionScript 3)?在下面的测试中,我创建了一个由随机噪声组成的位图,然后定期向左移动它。我没有在后台运行繁重的任务。我正在寻找的是与1987年的Amiga 500相同的平滑度: - )

package {
    import flash.display.*;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Game extends Sprite {
        var noiseBitmap;

        public function Game() {
            var noiseBitmapData = new BitmapData(stage.stageWidth * 3, stage.stageHeight);
            noiseBitmapData.noise(0, 0, 255, 7, true);
            noiseBitmap = new Bitmap(noiseBitmapData);
            addChild(noiseBitmap);

            var t = new Timer(1000/30, 999999);
            t.addEventListener("timer", function (e:TimerEvent) {
                noiseBitmap.x--;
            });
            t.start();
        }
    }
}

“渲染代码”在我的计算机(2.4 GHz Mac)上运行时需要<1毫秒,但仍然会在一两帧时间内卡住这种移动,使得机芯看起来不稳定。

FPS在Flash中设置为30。我尝试使用“测试电影”和浏览器(Chrome)运行它。目标是Flash Player 11.2。我也试过调用e.updateAfterEvent()来强制重绘。我也玩过将延迟和FPS设置为稍微不同的值,但没有改善。

这与not smooth scrolling in AS3不同,因为我已经在使用BitmapData。此外,我尝试使用ENTER_FRAME事件而不是回答该问题时建议的计时器,但它没有帮助。

2 个答案:

答案 0 :(得分:3)

使用计时器时,您将无法与帧速率完全同步。正如您所提到的,帧速率稍微波动,使您的计时器有时会在一帧中跳过两次或跳过一帧。为了确保与帧速率更加同步,您应该收听Event.ENTER_FRAME事件。

一个例子:

this.addEventListener(Event.ENTER_FRAME, updateFrame);

function updateFrame(e:Event):void {
    noiseBitmap.x--;
}

答案 1 :(得分:3)

我建议你试试Greensock的TweenLite。它是一个高度优化的引擎,可以通过代码进行各种补间,可用于AS2和AS3。你可以找到它here

Walkietokyo的解决方案仍然基于框架,不会消除您遇到的问题。而是使用基于时间的动画(TweenLite实际实现)。有关详细信息,请参阅this article

相关问题