请帮帮我,我的客户正在杀了我!
这是一个链接: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,它正在摇晃??
请给我一个线索。
更新:我在 circle 类构造函数中添加了:
z = 1
就像@Sean藤原建议的那样,有很大的改进
这是一个链接:http://aradon.co.il/test2/circle.htm
但是钢客户对我说,它钢不好。
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);
}
}
在使用弧度而不是度和根据自上次渲染以来经过的时间动态计算圆应该移动多远之间,我认为您应该能够减轻您所看到的抖动。
由于听起来您很着急,请尝试将其放入Path
构造函数中:
z = 1;
如果您设置了speed = 0.00001
,您可以看到它现在正在执行子像素渲染。
另外,我看到您正在路径对象中设置cacheAsBitmap = true
。 这只会对性能不利。
尝试将cacheAsBitmap
设置为在每个移动的显示对象上true
。这可能会使您的动画变得平滑。
如果您的圆圈是位图,那么您也可以尝试打开平滑。
始终确保你的x
和y
位置是整数,没有半像素这样的东西,但Flash无论如何都试图让它发生。 *叹息*
它应该像舍入x
和y
值一样简单:
x = Math.round( Math.cos(aRadians) * (parentPath.width / 2) );
y = Math.round( Math.sin(aRadians) * (parentPath.height / 2) );
如果我尝试对文本进行动画处理,我会得到这个。 因此,为了修复它,我只需将文本分开(单击文本并按两次 CTRL+B(。
你对那些小人物的印象是不是支离破碎了? 尝试选择一个,然后打破它(按 Ctrl+B(。 另外,圆圈内的文字,如果是静态文本,请尝试打破它,看看是否能解决抖动。
将圆圈绘制成位图,然后应用平滑。
e.updateAfterEvent();
.
但是要使用它,您需要使用Timer
类。
这将在事情发生时增加平滑度。