Использование MovieClip(root) в ActionScript 3

я в кадре 3.. у меня есть текстовое поле на имени сцены scoreTxt.. в кадре 3 я добавил TryClass..

 var Try:TryClass = new TryClass();

TryClass имеет функцию updateScore.. это работает нормально, если я на кадре 3. поэтому мой код

     public function updateScore(amount:int):void
     {
           score += amount;
           if(score < 0) score = 0;

           realNumber = score;

           setInterval(updateDisplayedScore, 10);

     }

     public function updateDisplayedScore():void
           {
               displayedNumber += Math.round((realNumber-displayedNumber)/5);
               if (realNumber - displayedNumber < 5 && realNumber - displayedNumber > -5)
               {
                     displayedNumber = realNumber;
               }
               addZeros();
           }

     public function addZeros():void
           {
               var str:String = displayedNumber.toString();
               MovieClip(root).scoreNa.text = str;
           }

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

MovieClip(this.root).gotoAndStop("Main"); this code is on the class..

он достигает кадра "Main", но указывает на это ошибки -->

MovieClip(root).scoreTxt.text

этот «основной» фрейм находится на фрейме 4.. который я еще не добавил в TryClass.. должен ли я добавить ко всем своим фреймам TryClass? и как это?

Извините за вопрос .. я еще не знаю, как идеально кодировать в классе .. и получать доступ к временным шкалам и другому внешнему классу .. Пожалуйста, не используйте более глубокий язык actionscript .. только для начинающих ..

вот полное сообщение об ошибке, когда я перехожу к кадру "Основной"

TypeError: Error #1009: Cannot access a property or method of a null object reference.
          atTumba/addZeros()[C:\Documents and Settings\Chrissan\Desktop\Game and Docs\Game\Tumba.as:686]
          atTumba/updateDisplayedScore()[C:\Documents and Settings\Chrissan\Desktop\Game and Docs\Game\Tumba.as:680]
          atFunction/http://adobe.com/AS3/2006/builtin::apply()
          atSetIntervalTimer/onTimer()
          atflash.utils::Timer/_timerDispatch()
          atflash.utils::Timer/tick()

это строка 686 Tumba.as - MovieClip(root).scoreNa.text = str;

public function updateDisplayedScore():void
               {
                   displayedNumber += Math.round((realNumber-displayedNumber)/5);
                   if (realNumber - displayedNumber < 5 && realNumber - displayedNumber > -5)
                   {
                         displayedNumber = realNumber;
                   }
                   addZeros(); -->> this is the line 680 of Tumba.as
               }

о setInterval, сэр.. он работает нормально, потому что я импортировал flash.utils. это не..


person Earl Burdeos    schedule 11.10.2013    source источник
comment
scoreTxt или scoreNa? правильный ли счетNa?   -  person ton    schedule 11.10.2013
comment
я имею в виду счетNa сэр. извините.. это еще не исправлено.. когда я перехожу к следующему кадру.. кажется, он находит, где находится scoreNa.text.. потому что scoreNa.text находится только в кадре 3.   -  person Earl Burdeos    schedule 12.10.2013


Ответы (2)


Попробуйте использовать (root as MovieClip) вместо MovieClip(root)

person Zoron19    schedule 15.10.2013

Я предполагаю, что «корень» не определен, потому что я предполагаю, что TryClass не унаследован от MovieClip или другого объекта DisplayObject, который находится в существующей иерархии.

Чтобы исправить это, я бы добавил параметр в конструктор класса. Затем я отправил бы ему муви-клип, к которому вы можете получить доступ. Например, если вы создаете экземпляр своего класса из мувиклипа, просто отправьте ему «это» для этого фильма.

public class TryClass {
   ...
   static var myroot:MovieClip = null;
   ...
   public function TryClass(someclip:MovieClip=null) {
      ...
      if (this.myroot == null && someclip != null && someclip.root != undefined) {
        this.myroot = someclip.root;
      }
      ...
   }
   ...
}

Затем изнутри видеоклипа:

var something = new TryClass(this);

Во всяком случае, это техника, которую я использую для класса, который я делаю. Что касается меня, я добавляю экземпляр внешнего клипа, если класс обнаруживает, что корень еще не загрузил его. В моем случае универсальная панель загрузки вызывается из моего класса-оболочки загрузки. Если конкретный фильм, в который я его вставил, уже имеет пользовательскую полосу загрузки, то он ничего не сделает, но для любого фильма, в котором у меня его еще нет, он добавит ее.

person Ghost8472    schedule 27.07.2015