2009-04-14 5 views
1

Il s'agit d'une classe de document pour un objet de visualisation. Assurez-vous d'activer off le mode strict (howto here) lors du test de la classe. Mettez aussi des trucs sur la scène. Lorsque le mode strict est désactivé, l'objet walker fonctionne correctement. Cependant, je veux le faire fonctionner en mode strict aussi. J'ai essayé de changer les parties problématiques, et addig (dispObj comme DisplayObject), sans chance.Actionscript 3.0: affichage de l'objet marcheur en mode strict

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

Répondre

4

Votre classe va générer des erreurs de compilation de temps en mode strict parce que vous essayez d'accéder aux méthodes numChildren et getChildAt, qui ne sont pas disponibles sur la classe DisplayObject, mais d'abord sur l'un de ses sous-classes, DisplayObjectContainer.

La raison pour laquelle il fonctionne en mode non strict est que, lors de l'exécution, vous passez effectivement des sous-classes de DisplayObjectContainer (Stage, Sprite, etc.). Remplacez simplement DisplayObject par DisplayObjectContainer comme type de dispObj dans votre méthode showChildren. Les objets DisplayObjects ne peuvent pas avoir d'enfants et sont toujours affichés dans l'arborescence de l'objet d'affichage, ce que votre méthode showChildren devra prendre en compte. Stiggler est sur la bonne voie, mais ne voyait pas correctement que vous vérifiez déjà pour DisplayObjectContainers

+0

« DisplayObjects ne peut pas avoir des enfants et sont leafs toujours dans l'arborescence d'objets d'affichage, la méthode de quelque chose Votre showChildren devra compte pour." Il y a un si pour ça. if (obj est DisplayObjectContainer) {...} else {...} – George

+0

Merci! Changer le paramètre à dispObj: DisplayObjectContainer et l'appel récursif à ShowChildren (obj en tant que DisplayObjectContainer) a résolu le problème. – George

1

Vous avez juste besoin de modifier légèrement votre code. Je n'ai pas testé le code, mais en tout cas vous devriez être en mesure de le comprendre;)

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

En fait, ce que Stiggler dit est OK. La fonction est appelée avec stage au début et à chaque récursion, un objet displayobject est transmis. C'est la raison pour laquelle getChildAt n'échoue jamais. – George

Questions connexes