我是动作脚本的新手。 我想知道如何运行计时器类并继续运行,即使我去其他框架。 例如。我在第2帧运行计时器,当我进入第1帧计时器继续运行,直到我回到第2帧停止计时器。 我很感激帮助。
更新: 我尝试使用这些代码制作秒表:
var sec,min,hr:uint = 0;
sec_txt.text = min_txt.text = hr_txt.text = "00";
var timerStopWatch:Timer = new Timer(1000);
timerStopWatch.addEventListener(TimerEvent.TIMER, timerHandler);
function timerHandler(e:TimerEvent){
var sec:String = String(uint(timerStopWatch.currentCount%60));
var min:String = String(uint((timerStopWatch.currentCount/60)%60));
var hr:String = String(uint((timerStopWatch.currentCount/60)/60));
sec_txt.text = (uint(sec)< 10) ? "0" + sec:sec;
min_txt.text = (uint(min)< 10) ? "0" + min:min;
hr_txt.text = (uint(hr) < 10) ? "0" + hr:hr;
}
当我启动计时器时,它可以工作,但当我转到第二帧时,它会停止并显示输出错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Stopwatch_fla::MainTimeline/timerHandler()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
我想要的是,当我启动计时器并转到另一帧时,它仍然会运行(滴答作响),当我回到计时器帧时,我可以阻止它。
答案 0 :(得分:0)
如果您遇到此问题,可能是在框架中输入代码。写一个文档类并在那里创建你的计时器,所以无论哪个框架,所有属性仍然存在并继续运行。
答案 1 :(得分:0)
首先,如果您要重新访问已发布代码所在的帧,您需要确保每次都不会重新创建计时器并导致内存泄漏。
更改以下行
var timerStopWatch:Timer = new Timer(1000);
这两行:
var timerStopWatch:Timer;
if(!timerStopWatch) timerStopWatch = new Timer(1000);
这将确保您的计时器仅创建一次。该事件监听器会将计时器保留在内存中,因此如果您不断创建新计时器并向其添加监听器,它们将全部保留在内存中,您的应用程序将变得越来越慢。
其次,请确保自己清理干净。
当你想要你的计时器消失时,停止它,删除事件监听器并使引用为空:
timerStopWatch.stop();
timerStopWatch.removeEventListener(TimerEvent.TIMER, timerHandler);
timerStopWatch = null;
第三,如果您希望此对象跨越多个帧,则事件处理程序中引用的任何内容都需要在这些帧中保留。
这意味着:
sec_txt
min_txt
hr_txt
所有必须存在于运行此计时器的任何帧上。确保在那些框架上正确设置了实例名称。
或者,在使用之前检查它们是否存在:
if(sec_txt) sec_txt.text = (uint(sec)< 10) ? "0" + sec:sec;