【问题标题】:Timer stops working properly after a few seconds定时器在几秒钟后停止正常工作
【发布时间】:2013-06-20 02:36:17
【问题描述】:

我每隔几秒播放一次补间,一开始效果很好,但在补间进行到一半之前就开始紧张并重置。 知道为什么吗?我第一次运行动画时,计时器似乎也有更长的等待时间

import flash.events.Event;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.utils.Timer;
import flash.events.TimerEvent;

addEventListener(Event.ENTER_FRAME, move);

    var signalTimer:Timer = new Timer(3000, 0);

function move(e:Event){
    sender.x = mouseX;
    sender.y = mouseY;  

    signalTimer.addEventListener(TimerEvent.TIMER, sendSignal);
    signalTimer.start();
}

function sendSignal(e:TimerEvent){
    signalTimer.stop();
    var sigTween1X:Tween = new Tween(signal1, "x", None.easeOut, sender.x, mic1.x, 10, false);
    var sigTween1Y:Tween = new Tween(signal1, "y", None.easeIn, sender.y, mic1.y, 15, false);

    var sigTween3X:Tween = new Tween(signal3, "x", Strong.easeIn, sender.x, mic3.x, 7, true);
    var sigTween3Y:Tween = new Tween(signal3, "y", Strong.easeOut, sender.y, mic3.y, 7, true);

}

【问题讨论】:

  • 我猜这是一种累积效应:ENTER_FRAME 处理程序触发,它将另一个事件侦听器添加到 signalTimer 并启动它。然后,当计时器关闭时,它会为其运行所有补间的 TIMER 事件调用所有这些事件处理程序。
  • @mitim 我就是这么想的,但是有没有办法只添加一次监听器?

标签: actionscript-3 flash adobe


【解决方案1】:

这是一段繁重的代码;结合基于帧、计时器和补间计时。

目前每个框架都会调用move(),它会在您的signalTimer 中添加一个事件侦听器,而不会删除之前添加的事件侦听器:

signalTimer.removeEventListener(TimerEvent.TIMER, sendSignal);

但是,每帧添加和删除事件侦听器并不是最佳选择。

如果您真的希望计时器每 3 秒触发一次,请在实例化时实例化并添加一个事件侦听器(不在 move() 函数内):

var signalTimer:Timer = new Timer(3000, 0);
signalTimer.addEventListener(TimerEvent.TIMER, sendSignal);
signalTimer.start();

那么不要停止sendSignal()中的计时器。

解决补间问题,您可以实现基于帧的动画,例如:

signal1.x -= (signal1.x - mic1.x) * 0.9;
signal1.y -= (signal1.y - mic1.y) * 0.9;

因此,实现一个基于 delta 的函数来跟踪 x,y 坐标。

【讨论】:

  • 似乎即使我将定时器事件监听器放在移动函数之外,每次加载帧时它仍然会被调用,所以我所做的就是将signalTimer.removeEventListener(TimerEvent.TIMER, sendSignal);放在sendSignal函数中工作。我做错了吗?
  • 这个框架脚本是否在时间线上重复调用?如果它位于 move() 函数的范围之外,则只应调用一次。
  • 它被不断地调用,所以我认为它在时间轴上是重复的。如何让它不再重复?
  • stop(); 添加到该帧上的操作中。也许添加一个trace("called"); 语句并检查控制台输出以查看帧是否被重复调用。
  • 我添加了trace,它输出了很多次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多