在AS3中重置计时器

时间:2013-12-26 19:28:36

标签: actionscript-3 timer

我很沮丧。我有一个按钮,当它被点击时,三个计时器开始。第一次点击按钮是没问题的,因为它贯穿了它想要做的三件事。当我点击另一个按钮离开舞台的那个区域然后再次单击同一个按钮时,就会出现问题。如果我太快点击回来并且没有让计时器用完,那么我会看到序列的尾端...它没有重置。

你认为这很容易......我应该能够放入一个timer.reset(),但它似乎不起作用。我无法将重置调用放入代码中,因为它一直说我引用的定时器不存在(TypeError:错误#1009:无法访问空对象引用的属性或方法。)

我尝试了不同的方法来确保计时器在尝试重置之前被调用但是我一直收到#1009错误,并且我尝试使用重置的各种方法似乎无效。我不知道为什么timer.reset()不起作用以及如何解决这个错误。谢谢,

else if (
                        event.target.name == "num6a" 
                        )
                        {
                        trace("num6a clicked on");
                        TweenLite.to(shape, 1, {x:-608.55, y:-423.05});

                        close2.visible = true;
                        close2.addEventListener(MouseEvent.CLICK, checkforclose);
                        shape.grey6.visible=true;

                        counterSix++;               
                        if(counterSix > 1){
                        trace("inside counterSix");

                        myDelay_sec6a.reset()
                        myDelay_sec6b.reset()
                        myDelay_sec6c.reset()

                        //if(myDelay_sec6a != null){ 
                        //trace("myDelay_sec6a is not null!");
                        //myDelay_sec6a.stop(); 
                        //myDelay_sec6a.reset(); 
                        //}

                        }

                        //section6 timing

                        var myDelay_sec6a:Timer = new Timer(1000,1);
                        myDelay_sec6a.addEventListener(TimerEvent.TIMER, goTosec6a);
                        //myDelay_sec6a.reset();
                        myDelay_sec6a.start();

                        function goTosec6a(event:TimerEvent):void
                        {   
                        TweenLite.to(shape.section6_a, 2, {alpha:1});
                        trace("seconds 1: cutting edge title appears");
                        }

                        var myDelay_sec6b:Timer = new Timer(3000,1);
                        myDelay_sec6b.addEventListener(TimerEvent.TIMER, goTosec6b);
                        //myDelay_sec6b.reset();
                        myDelay_sec6b.start();

                        function goTosec6b(event:TimerEvent):void
                        {   
                        TweenLite.to(shape.section6_b, 2, {alpha:1});
                        TweenLite.to(shape.section6_c, 2, {alpha:1});
                        trace("seconds 3: first paragraph appears");

                        }

1 个答案:

答案 0 :(得分:0)

按照目前设置的方式对您的代码进行高峰处理,您将会遇到一些麻烦,无法对其进行任何调整。我不确定您是在时间轴中还是在单独的.as文件中执行此操作,但您可能会遇到基本的范围问题。那就是你的定时器变量是在一个函数中创建的,这意味着它们是该函数的本地变量,因此下次单击此按钮变量myDelay_将被引用为null(这意味着运行它的任何方法都是出于问题)。无论哪种情况或不是这种情况,我都重写了一些使其更灵活的方法。

我改变的一些事情包括:

  • 移动你的计时器功能以删除本地范围(目前它们可能是在一个函数内部设置的?无论哪种方式,如果它们被大量使用,最好将它们分开)。

  • 设置跟踪计时器的方法,并在再次调用该函数时将其删除。

  • 在您尝试添加新计时器之前添加了对当前计时器的评估。

另外,作为旁注,我还没有测试过这段代码,但希望这会让你走上正轨。

     close2.visible = true;
     close2.addEventListener(MouseEvent.CLICK, checkforclose);
     shape.grey6.visible=true;

     counterSix++;               
     if(counterSix > 1){
         trace("inside counterSix");
         var i:int;
         for ( ; i < _timerList.length; i++ ) {
             //reset all the timers
             _timerList[i].timer.reset();
         }
         //clear the list
         _timerList.length = 0;
     }
     addTimer( "timer_sec6a", 1000 );
     addTimer( "timer_sec6b", 3000 );
     //addTimer( "timer_sec6c", 1000 );

然后这些是我添加的功能:

    private function goTosec6a(event:TimerEvent):void {   
        TweenLite.to(shape.section6_a, 2, {alpha:1});
        trace("seconds 1: cutting edge title appears");
    }

    private function goTosec6b(event:TimerEvent):void {   
        TweenLite.to(shape.section6_b, 2, {alpha:1});
        TweenLite.to(shape.section6_c, 2, {alpha:1});
        trace("seconds 3: first paragraph appears");                
    }
     private function goTosec6b(event:TimerEvent):void {   
         TweenLite.to(shape.section6_b, 2, {alpha:1});
         TweenLite.to(shape.section6_c, 2, {alpha:1});
         trace("seconds 3: first paragraph appears");
    }

     //create this somewhere to kepe track of your timers, dont forget to instantiate it _timerList = new Vector.<Object>();`
     private var _timerList:Vector.<Object>;

     //set the name parameter to timer_sec6a, timer_sec6b etc and it will setup the timer event function for you 
     private function addTimer( name:String, delay:Number, repeat:int=1  ):void {
         //check to see if timer already exists before creating another
         if ( !evalCurrentTimers( name ) ) {
             //create new timer
             var timer:Timer = new Timer( delay, repeat );
             timer.addEventListener( TimerEvent.TIMER, this["goTo" + name.split("_")[1]] );
             _timerList.push( {timer: timer, name: name} );
         }
     }
     private function evalCurrentTimers( timerName:String ):Boolean {
         var i:int;
         //check to see that we don't already have a timer with the same name
         for ( ; i < _timerList.length; i++ ) {
             if ( _timerList[i].name == timerName ) {
                 return true;
             }
         }
         return false;
     }