2013-11-09 3 views
-1

Я не знаю много Actionscript. Приносим извинения, если это действительно просто.Ошибка AS3 1009 root = null

Я написал файл .as как часть этого, мне нужно остановить анимацию вспышки с помощью .stop().

Я попытался несколько различных способов сделать это, некоторые из них работают - однако они всегда через эту ошибку:

TypeError: Error # 1009: Не удается получить доступ к свойству или методу нулевой ссылки на объект. в com.albionpreview :: looptimer/начальный кадр() в test_fla :: MainTimeline/frame1()

Вот все, что я пробовал:

this.stop(); 
root.stop(); 
MovieClip(root).stop(); 
MainTimeLine(parent).stop(); 
MovieClip(parent).stop(); 
parent.stop(); 
DisplayObject(stage).stop(); 
MainTimeline(parent).stop(); 
Main(root).stop(); 
Object(root).stop(); 
this.stage.stop(); 
MovieClip(this).stop(); 
MovieClip(this.root).stop(); 
(root as MovieClip).stop(); 

Там должно быть что-то просто попробовать. Кто-нибудь может помочь?

Вот мой код, если это помогает.

http://pastebin.com/HSHCdyr1

+0

У вас есть куча фреймов на шкале времени, и вы пытаетесь заставить все это остановить/приостановить таймер? –

+0

Да, у меня есть анимация на временной шкале, которая играет. Идея сценария - время анимации и остановка анимации через определенное количество времени. Например, я могу позволить анимации работать в течение 30 секунд. Я забуду первый цикл и посмотрю, сколько времени потребовалось для анимации, со времени первого цикла я вижу, есть ли у меня достаточно времени для повторного цикла или если я просто остановлю анимацию. Я хотел создать код, который мог бы использоваться во множестве разных проектов. –

+0

Хорошо, я могу помочь вам с первой частью. Установите время работы и остановитесь, когда отсчет закончится, но я не получаю вашу точку на второй части. Вы говорите, что анимация может длиться 1 минуту, если она работает в течение 30 секунд, тогда вы хотите, чтобы код оценивал, что еще 30 секунд остаются и снова воспроизводятся? Вы думаете о том, чтобы держать отсчет кадров во времени против времени? Я передам вам несколько инструкций в ответе, после чего мы улучшим с помощью комментариев ... –

ответ

1

На новом слое я сделал бы новый мувиклип, который собирается быть контейнером из кадров и управления, которые, чтобы остановить с помощью таймера.

Просто нарисуйте коробку с цветом заливки (без границы). Та же ширина & высота, как ваша сценическая, выровняйте до вершины & Влево (под Modify-> Align с отметкой «Align to stage»). Теперь это идеальное место для сцены, а затем преобразуйте его в movieClip (убедитесь, что регистрация установлена ​​как черная точка сверху/слева .. не центрированная точка).

Назовите это так, как вы хотите, но дайте ему имя экземпляра animMC (вы можете изменить это позже).

Теперь выберите весь диапазон кадров анимации и выберите «вырезать кадры» в меню правой кнопки мыши. Дважды щелкните анимационный клип animMC, чтобы ввести его временную шкалу, удалить форму окна и щелкнуть правой кнопкой мыши по первому кадру и «вставить кадры».

Теперь в вашем коде вы можете остановить его, как это:

package com.preview { 

import flash.utils.Timer; 
import flash.events.TimerEvent  
import flash.utils.getTimer; 
import flash.display.MovieClip; 

public class looptimer extends MovieClip 
{ 

var startTime:int = 0; 
var allowedTime:int = 5000; 
var loopTime:int = 0; 


    public function looptimer() 
    { 
     var myTimer:Timer = new Timer(5000, 1); //count before doing function "timerListener" the 1 means do once else it will loop forever 
     myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
     myTimer.start(); 

     function timerListener (e:TimerEvent):void 
     { 
     trace("Timer countdown finished"); 
     animMC.stop(); //anim stops 
     } 

    } 

} 

} 

========================

EDIT 2:

Привет, этот код проверяет событие, вызванное в конце вашего анимации. Для того, чтобы иметь такое событие идти в MC, который содержит кадры и на последнем кадре (и на пустой слой) добавить действия код: (Это будет вещь, которая

dispatchEvent(new Event("Banner_end)")); //end frame 

Это будет эквивалентно получать вашу «конец кадра» в код ниже события прилагается к данной инструкции:.

animMC.addEventListener("Banner_end", check_Time);

это означает, что по достижении конечного кадра мероприятие под названием «Баннер конец» является послан с таймлайн, в свою очередь, выполняет функцию check_Time и другая функция (см. код).

Теперь этот код ниже проверяет время и таймер, когда было отправлено событие «конечный кадр», и выясните, достаточно ли времени для второго цикла или более. Две вещи влияют на время, в течение которого MC может зацикливаться.Во-первых, это ограничение по времени, тем дольше, чем больше циклов вы будете соответствовать этому пределу. Во-вторых, длина анимации MC, которая, если более короткие средства, может соответствовать большему количеству циклов в течение срока. Отрегулируйте эти две вещи. Самый простой - это ограничение по времени, потому что вы просто изменяете число («allowed_playing_Time») для тестирования, но позже, когда у вас нет контроля над лимитом, вы при необходимости настраиваете кадры баннера (anim MC), добавляя/отбрасывая кадры.

package com.preview 
{ 
    import flash.utils.*; 
    import flash.events.*; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.utils.getTimer; 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class looptimer extends MovieClip 
    { 


     var allowed_playing_Time:int = 10; //time limit in seconds 
     var play_Count:int = 0; //tracking number of times played 
     var can_play_Amount:int = 1; //total times can be played 

     var _startTime:Date;//Number; 
     var _endTime:Date;//Number; 

     //for time check using actual [computer] clock = more accurate than timer 
     var real_Time:Date; 
     var anim_start_time:int; 
     var anim_end_time:int; 
     var anim_play_length:int; 

     public function looptimer() 
     { 
      //starting the Banner 
      play_Banner_anim(); 
     } 

     function play_Banner_anim():void 
     { 
      animMC.stop(); //set strating banner state as paused; 

      _startTime = real_Time = new Date();//Real Time value initial set here 
      trace("current time at START is: " + _startTime.minutes + " mins past and " + _startTime.seconds + " secs"); 

      animMC.addEventListener("Banner_end", check_Time); 
      animMC.addEventListener("Banner_end", calculate_Replay); 
      anim_start_time = getTimer(); 
      animMC.play(); 
     } 

     function check_Time(e:Event):void 
     { 
      animMC.stop(); trace("Banner has reached last frame"); 
      animMC.removeEventListener("Banner_end", check_Time); 
      play_Count = play_Count + 1; 
      trace("Times banner has played/looped): " + play_Count); 


      _endTime = real_Time = new Date();//new update of Real Time value 
      trace("current time at END is: " + _endTime.minutes + " mins past and " + _endTime.seconds + " secs"); 

      anim_end_time = getTimer(); 
      anim_end_time = Math.ceil(anim_end_time); 
      anim_play_length = Math.round(Math.floor(anim_end_time - anim_start_time)/1000); 

      anim_play_length = anim_play_length; 

      trace("checking if Real Time: "); 
      var date1:Date = _startTime; 
      var date2:Date = _endTime; 

      var elapsed1:Number = Date.UTC(date1.minutes,date1.seconds); 
      var elapsed2:Number = Date.UTC(date2.minutes,date2.seconds); 

      var playingTime:Number = Math.round((elapsed2/1000) - (elapsed1/1000)); 
      trace ("time elasped (delta) is " + playingTime); 


      //check seconds elapsed in banner playback (i.e total play length) 
      trace("Banner total playing length was " + anim_play_length + " seconds"); 

      //so how many times can banner play within allowed time limit? 
      var can_fit_Num:Number = allowed_playing_Time/anim_play_length; 

      trace("can fit this many plays in allowed time limit: " + can_fit_Num); 
      can_play_Amount = can_fit_Num; 
      trace("can_play_Amount is : " + can_play_Amount); 
      if (can_play_Amount <= 0) 
      { 
       trace("Warning: Banner Anim is either longer than allowed time limit or has a play length of zero"); 
      } 

     } 

     function calculate_Replay(e:Event):void 
     { 
      trace("Calculating replay function :::::: "); 
      trace("Play/looped amount is: " + play_Count); 
      trace("Can play amount times is : " + can_play_Amount); 

      if (play_Count < can_play_Amount) 
      { 
       trace("anim_play_length is:" + anim_play_length); 
       replay_tings(); 
       trace("replaying anim"); 
      } 
      else 
      { 
       animMC.stop(); 
       trace("reached replaying times (" + can_play_Amount + ") available within limit (" + allowed_playing_Time + " secs)"); 
       if (can_play_Amount <= 0) 
       { trace("Warning: Banner Anim is either longer than allowed time limit or has a play length of zero"); } 

       //do something else. Currently just stops since no time for replay 
      } 

     } 

     function replay_tings():void 
     { 

      animMC.addEventListener("Banner_end", calculate_Replay); 
      animMC.play(); 
      play_Count = play_Count + 1; 
      trace("Play Count/loops: " + play_Count); 

     } 

    } 

} 

Надеюсь, это поможет. Я поставил много следов, чтобы дать вам обратную связь. Удалите все, что вам кажется ненужным, и, конечно, вы можете оптимизировать код, если вы что-то заметили.

+0

Это поможет вам начать. Он насчитывает 5 секунд (5000 милисек), а затем останавливает анимацию. Я немного обновлю его, чтобы включить в него другой материал, когда я пойму больше, что вы имели в виду в приведенном выше комментарии. –

+0

Это хорошо, однако я не просто хочу остановить анимацию после определенного времени, когда мне нужно, чтобы она остановилась на конкретный кадр. Вот почему у меня есть функции startFrame и endFrame. Идея состоит в том, что анимация остановится только там, где вызывается функция endFrame. –

+0

Должен ли я разместить все в MC? Я думал, что это может быть решением, но старался не делать этого, если это возможно. –

Смежные вопросы