1

フレーム 3 の im..ステージ名 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..

フレーム「メイン」に到達しますが、これへのポインティングエラー -->

MovieClip(root).scoreTxt.text

その「メイン」フレームはフレーム 4 にあります。まだ TryClass を追加していません。すべてのフレームに TryClass を追加する必要がありますか? それはどうですか?

質問で申し訳ありません..クラスで完全にコーディングする方法はまだわかりません..タイムラインやその他の外部クラスにアクセスします..アクションスクリプトのより深い言語を使用しないでください..初心者の方のみ..

フレーム「メイン」に移動したときの完全なエラーメッセージは次のとおりです

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()

これは Tumba.as の 686 行目です -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.* をインポートしたところ正常に動作したため、クラスを追加したフレーム 3 では正常に動作しましたが、「メイン」フレームでは正常に動作しました。それは..

4

2 に答える 2

0

(root as MovieClip)の代わりに使用してみてくださいMovieClip(root)

于 2013-10-15T05:28:16.513 に答える
0

TryClass は既存の階層に存在する MovieClip またはその他の DisplayObject から継承されていないと推測しているため、「ルート」は未定義であると推測されます。

それを修正するには、クラスのコンストラクターにパラメーターを追加します。それから、あなたがアクセスできるムービークリップを送ります。たとえば、ムービークリップ内からクラスをインスタンス化する場合は、そのムービーの「this」を送信するだけです。

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);

とにかく、これは私が作成しているクラスに使用しているテクニックです。私の場合、ルートがまだロードされていないことをクラスが検出した場合、外部ムービー クリップのインスタンスを追加します。私の場合、ロード ラッパー クラスから呼び出されるユニバーサル ローディング バーです。挿入した特定の映画に既にカスタム ローディング バーがある場合は何もしませんが、まだローディング バーがない場合は追加されます。

于 2015-07-27T02:59:37.260 に答える