动作3动画晃动问题

时间:2011-08-21 21:00:29

标签: flash actionscript-3 animation

请帮助我,我的客户正在杀了我!

这是一个链接:http://aradon.co.il/test/circles.html

现在你看到圈子是如何摇晃的!我的客户不会这样批评它。

是什么导致这种情况?

它像这样建造

一个类调用具有EnterFrame事件的路径

和6圈每个圈子都有:

    private var _aPosition:Number = 0;

    public function get aPosition():Number
    {
        return _aPosition;
    }

    public function get aRadians():Number
    {
        return  180 / Math.PI * _aPosition;
    }

    public function set aPosition(value:Number):void
    {
        _aPosition = value % 360;

        if(parentPath)
        {
            x = Math.cos(aRadians) * (parentPath.width / 2);
            y = Math.sin(aRadians) * (parentPath.height / 2);
        }
    }

如何围绕路径旋转圆圈。

现在路径类在enterframe上有这个代码:

    private function this_enterframe(e:Event=null):void
    {
        for(var i:int = 0; i < numCircles; i++)
        {
            getCircleAt(i).aPosition += direction == RIGHT ? -speed : speed;


        }
    }

圆圈上的图像是动态的,也是文字,但是在我添加它们之前它就是摇晃。

帧率是30我也试过25 20 40而且它也在摇晃??

请给我一个线索。

更新: 我在圈子类构造函数中添加了:

      z = 1
像@Sean Fujiwara一样建议有一个很大的改进

这是一个链接:http://aradon.co.il/test2/circle.htm

但客户告诉我,钢铁并不好。

7 个答案:

答案 0 :(得分:1)

如果您在Circle类中设置它,

cacheAsBitmap可能会有所帮助。如果你在主类上设置它,它不会帮助,实际上可能会受到伤害。在cacheAsBitmap上设置它的子对象没有变化的DisplayObject时,你将获得最大的提升,因此它可以缓存一次,然后只在舞台上翻译该对象。如果孩子们正在移动(就像你parent上的情况一样),那么它必须每帧重绘并重新学习该元素,并且你不会获得任何性能提升。 cacheAsBitmap对于具有复杂矢量图形的元素最有效,这些元素很难重绘但很少会改变。

我不认为舍入你的x和y值会有所帮助,我从来没有遇到过设置分数x,y的问题。对于矢量图形,它通常在子像素放置方面做得非常好,对于位图,它通常以我期望的方式工作。

我想你可能想要使用一些与帧速率无关的动画。现在,您的代码的结构方式,每帧渲染您移动特定数量的度数。这意味着如果帧率由于某种原因而断断续续,那么你仍然会移动相同数量的像素。

以下是我要去的方向:

首先,您的输入框架事件处理程序会获得一些更新。 getTimer()返回自swf启动以来的当前毫秒数。因此,通过记住我们渲染的lastTime并减去currentTime,我们应该能够确切地确定自上一帧以来已经过了多少毫秒。然后我们可以使用该时间而不是任意速度/距离更新我们的圆圈。

private var lastTime:int;

private function this_enterframe(e:Event = null):void {
    var currentTime:int = getTimer();
    var elapsedTime:int = currentTime - lastTime;
    lastTime = currentTime;

    for(var i:int = 0; i<numCircles; i++)
    {
        getCircleAt(i).updatePosition(elapsedTime, direction)
    }
}

然后在你的Circle类中,我们应该能够计算它在一段时间内应该移动了多远(在这种情况下,我已经将它的速度作为它应该移动的每秒弧度数)。

类似的东西:

public class Circle extends MovieClip {

    // Set the default speed to 10 degrees per second
    public const DEFAULT_SPEED:Number = 10 * Math.PI / 180;

    private var _radiansPerSecond = Circle.DEFAULT_SPEED;
    private var _rotationPosition:Number = 0;

    public function updatePosition(elapsedTime:int, direction:*):void { 
        var chng:Number = _radiansPerSecond * (elapsedTime / 1000) * (direction == RIGHT ? -1 : 1);
        _rotationPosition += chng;
        this.x = Math.cos(_rotationPosition) * (parentPath.width / 2);
        this.y = Math.sin(_rotationPosition) * (parentPath.height / 2); 
    }
}

在使用弧度而不是度数并根据自上次渲染后经过的时间动态计算圆圈移动距离之间时,我认为你应该能够减轻你所看到的颤抖。

答案 1 :(得分:0)

尝试在每个移动的DisplayObject上将cacheAsBitmap设置为true。这可以平滑你的动画。

如果你的圈子是位图,那么你也可以尝试打开平滑。

答案 2 :(得分:0)

始终确保您的xy位置是整数,没有像半像素这样的东西,但Flash无论如何都试图让它发生.. * 叹气*

它应该简化为xy值的舍入:

x = Math.round( Math.cos(aRadians) * (parentPath.width / 2) );
y = Math.round( Math.sin(aRadians) * (parentPath.height / 2) );

答案 3 :(得分:0)

因为听起来你很匆忙,试着把它放在Path构造函数中:

z = 1;

如果设置speed = 0.00001

,您可以看到它正在进行子像素渲染

另外,我看到你在路径对象中设置了cacheAsBitmap = true。这只对性能不利。

答案 4 :(得分:0)

如果我尝试动画文字,我会得到这个。所以,为了解决它,我只是将文本分开(单击文本并按两次CTRL + B)。

那些小男人的照片是否分崩离析?尝试选择一个并打破它(按CTRL + B)。此外,圆圈内的文字,如果是静态文字,只需尝试打破它,看看是否能解决这些问题。

答案 5 :(得分:0)

将您的圆圈绘制成位图,然后应用平滑。

答案 6 :(得分:-1)

e.updateAfterEvent();

但要使用此功能,您需要使用Timer类。

这将在事情发生时增加平稳性。