我有一个计时器,每隔10毫秒旋转图像2次1000次。它旋转得很好,但有时(并非总是)我看到一段时间的口吃,它并不大但是很明显。如何更改我的代码以防止这种情况?有没有比使用“mc.rotationZ”更快更好的方法?可能是我的计时器有10ms的时间周期,这会导致问题吗?
编辑:如果计时器有问题,它的替代品是什么?
startbtn.addEventListener(MouseEvent.CLICK,okreni1);
var tajmer:Timer=new Timer(10,1000);
tajmer.addEventListener(TimerEvent.TIMER,okreni2);
function okreni1(e:Event){
startbtn.mouseEnabled = false;
tajmer.start();
}
function okreni2(e:Event){
wheel.wrotate.rotationZ += 2;
if(tajmer.currentCount == 1000){
trace("tajmer se zavrsio");
startbtn.mouseEnabled = true;
tajmer.reset();
}
}
答案 0 :(得分:2)
wrotate
的父级。当事情变得非常紧张时,你可以进入不稳定的动作。如果您每帧更新对象而不是计时器事件,则可能会解决问题。虽然这不是你的主要问题,但最好这样做。
在10ms时,你实际上的变化速度超过60fps(16.6ms)。在flash pro的默认24fps(41.6ms),即4个计时器滴答之前,您的更改将被绘制。另外,即使您正确地计算了数学,计时器也无法可靠地同步到帧速率。
我已经修改了你的代码,这样定时器只有一个时间跨越整个旋转持续时间。输入框架侦听器处理旋转,以便与应用程序的实际帧速率同步。
startbtn.addEventListener(MouseEvent.CLICK,okreni1);
var tajmer:Timer=new Timer(10000, 1); //just fire it once
tajmer.addEventListener(TimerEvent.TIMER,okreni2);
function okreni1(e:Event){
startbtn.mouseEnabled = false;
tajmer.reset();
tajmer.start();
wheel.addEventListener(Event.ENTER_FRAME, updateWheel,false,0,true); //run updateWheel every frame
}
function okreni2(e:Event){
wheel.removeEventListener(Event.ENTER_FRAME,updateWheel,false); //remove the listener so it stops rotating
trace("tajmer se zavrsio");
startbtn.mouseEnabled = true;
}
function updateWheel(e:Event){
wheel.wrotate.rotationZ += 2;
}
顺便说一句,这种情况是补间的理想选择。如果您想使用流行的TweenLite,您的代码将如下所示:
import com.greensock.TweenLite;
import com.greensock.easing.Linear;
import com.greensock.easing.Quad;
startbtn.addEventListener(MouseEvent.CLICK,okreni1);
function okreni1(e:Event){
startbtn.mouseEnabled = false;
//this tells wheel.wrotate to animate over 10 seconds from the current rotationZ value to an additional 20000. Ease none means have the velocity constant the whole time.
//alternatively you could use a different ease, like Quad.easeInOut if you want a nice smooth start and stop
TweenLite.to(wheel.wrotate, 10, { rotationZ: wheel.wrotate.rotationZ + 20000, ease: Linear.easeNone, onComplete: okreni2 });
}
function okreni2(e:Event){
startbtn.mouseEnabled = true;
}
答案 1 :(得分:0)
奇怪的是,我在学校的旧电脑上测试了我的FLA(swf),其中包含1个cpu核心和集成的gpu,旋转(动画)完美无缺。但我想也许问题出在我的flash专业版或flash播放器中。我将重新安装并更新我的软件。非常感谢@LMDS提供所有帮助。