2009-04-14 13 views
1

これは、表示オブジェクトウォーカーのドキュメントクラスです。クラスをテストするときにから厳密モード(howto here)に設定してください。また、ステージ上にいくつかのものを置く。厳密なモードをオフにすると、オブジェクトウォーカーはうまく動作します。しかし、私は厳密なモードでも動作させたい。問題のある部分を変更しようとしましたが、addig(DisplayObjectとしてdispObj)は運がありません。Actionscript 3.0:オブジェクトウォーカーを厳密モードで表示

package { 

    import flash.display.MovieClip; 
    import flash.display.DisplayObject; 
    import flash.display.DisplayObjectContainer; 

    public class DisplayWalker extends MovieClip { 

     public function DisplayWalker() { 
      showChildren(stage, 0); 
     } 



     private function padIndent(indents:int):String { 
      var indent:String = ""; 
      for (var i:uint = 0; i < indents; i++) { 
       indent += "  "; 
      } 
      return indent; 
     } 

     private function showChildren(dispObj:DisplayObject, indentLevel:Number):void { 
      for (var i:uint = 0; i < dispObj.numChildren; i++) { 
       var obj:DisplayObject = dispObj.getChildAt(i); 
       if (obj is DisplayObjectContainer) { 
        trace(padIndent(indentLevel), obj, obj.name); 
        showChildren(obj, indentLevel + 1); 
       } else { 
        trace(padIndent(indentLevel), obj); 
       } 
      } 
     } 
    } 
} 

答えて

4

あなたのクラスは、DisplayObjectクラスには使用できませんするnumChildrenやgetChildAtメソッドにアクセスしようとしているので、strictモードで時間コンパイルエラーを生成しますが、最初の1にそれは、サブクラス、のDisplayObjectContainerです。

Strict以外のモードで動作している理由は、実行時に、DisplayObjectContainer(Stage、Spriteなど)のサブクラスを効果的に渡しているからです。

showChildrenメソッドのdispObjの型として、DisplayObjectをDisplayObjectContainerに置き換えてください。 DisplayObjectsは子を持つことはできず、表示オブジェクトツリー内で常にリーフします。これは、showChildrenメソッドが考慮する必要があるものです。

+0

「のDisplayObjectが子供を持って、常に表示オブジェクトツリーに葉していることができない、何かごshowChildren方法は、する必要があります)。私は、コードをテストしていないが、いずれにしても、あなたはそれを把握することができるはずです"のアカウント。そのためのifがあります。 if(objはDisplayObjectContainer){...} else {...} – George

+0

ありがとう!パラメータをdispObj:DisplayObjectContainerに変更し、ShowChildren(DisplayObjectContainerとしてobj)への再帰呼び出しを問題に解決しました。 – George

1

Stigglerは適切なトラックにありますが、既にDisplayObjectContainersを確認していないことがあります。

コードを少し修正するだけで済みます。

private function showChildren(dispObj:DisplayObject, indentLevel:Number):void 
{ 
    var dOC:DisplayObjectContainer = dispObj as DisplayObjectContainer; 

    if(dOC == null) 
    { 
     trace(padIndent(indentLevel),obj); 
    } 
    else 
    {  
     trace(padIndent(indentLevel), obj, obj.name); 

     var obj:DisplayObject = null; 

     for (var i:uint = 0; i < dispObj.numChildren; i++) 
     { 
      obj = dOC.getChildAt(i); 
      showChildren(obj, indentLevel + 1); 
     } 
    } 
} 
+0

実際、スティグラーが言うことはOKです。この関数は、開始時にステージで呼び出され、それ以降のすべての再帰でdisplayobjectcontainerが渡されます。これがgetChildAtが失敗しない理由です。 – George

関連する問題