2011-08-21 68 views
1

请帮我,我的客户正在杀我!actionscript 3动画抖动问题

这里是一个链接: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,它摇晃?

请给我一点线索。

UPDATE: 我在圈内类的构造函数中添加:

 z = 1 

像@Sean藤原建议在有大的起色

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

但钢客户对我说,钢铁不好。

回答

0

因为它听起来就像你在忙乱之中,尝试把这个在Path构造:

z = 1; 

你可以看到它现在做的子像素渲染如果你设置了speed = 0.00001

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

+0

我尝试也,声音整蛊(; – ygaradon

+0

怎么敢给你投下来!!!!!!!!!!! – ygaradon

+0

z = 1伎俩给大改进!!!检查:http://aradon.co.il/test2/circle.htm – ygaradon

0

尝试在每个移动的DisplayObject上设置cacheAsBitmaptrue。这可能会消除你的动画。

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

+0

我试过在圆圈或主类中的任何地方,或在路径中,它不工作。 :( – ygaradon

0

务必确保您的xy位置是整数,有没有这样的事,作为一个半象素但是Flash试图让反正这一点.. * 叹*

应该为四舍五入为简单的xy值:

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

它只是让他们更难摇! – ygaradon

1

cacheAsBitmap可能有点帮助,如果你在Circle类设置。如果你把它放在主要课程上,它不会帮助,而且实际上可能会受到伤害。当将其设置在DisplayObject的子对象没有改变时,您可以从cacheAsBitmap获得最佳提升,因此它可以缓存一次,然后仅在舞台周围翻译该对象。如果孩子正在移动(就像你的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); 
    } 
} 

使用弧度而不是度和动态找出一个圆圈应该移动多远基础上经过自上次渲染,我想你应该能够减轻摇晃的时间之间你看到了。

+0

我尝试...谢谢 – ygaradon

+0

感谢您提供非常有用的信息,但它不解决它 – ygaradon

-1

e.updateAfterEvent();

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

这会在事情发生时增加平滑度。

+0

hello ...下降评论为downvote ... – Benny

0

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

这些小男人的形象是分开的吗?尝试选择一个,并打破它(按CTRL + B)。另外,圆圈内的文字,如果是静态文字,只要试着打破它看看是否能修复震动。

0

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