2016-10-28 6 views
0

J'ai donc écrit ce petit utilitaire, que je vais développer, juste pour gagner du temps, mais il semble que je dessine la forme, même s'il n'y a pas de problèmes avec le compilateur.Pourquoi cette bibliothèque personnalisée dessine-t-elle des formes? Actionscript 3

classe personnalisée:

package ezd.easydraw 
{ 
    import flash.display.MovieClip; 
    import flash.display.Shape; 

    public class EasyDraw extends MovieClip 
    { 
     public var _root:MovieClip = new MovieClip(); 
     public function DrawCircle(xpos:Number=200.0, ypos:Number=200.0, r:int=50, color:uint=0x00FF00, alph:Number=1.0) 
     { 
      _root = MovieClip(_root); 
      var circle:Shape = new Shape; 
      circle.graphics.beginFill(color, alph); 
      circle.graphics.drawCircle(xpos, ypos, r); 
      circle.graphics.endFill(); 
      _root.addChild(circle); 
     } 
     public function DrawRect(xpos:Number=200.0, ypos:Number=200.0, w:int=50, h:int=50, color:uint=0x00FF00, alph:Number=1.0) 
     { 
      _root = MovieClip(_root); 
      var rect:Shape = new Shape; 
      rect.graphics.beginFill(color, alph); 
      rect.graphics.drawRect(xpos, ypos, w, h); 
      rect.graphics.endFill(); 
      _root.addChild(rect); 
     } 
    } 
} 

Et la fenêtre "principale" pour dessiner les formes:

import ezd.easydraw.EasyDraw; 
stop(); 
var ezd:EasyDraw = new EasyDraw(); 
stage.focus = ezd._root; 
ezd.DrawCircle(300, 300, 500); 

Qu'est-ce que je fais mal?

Répondre

1

Qu'est-ce que je fais mal?

  1. _root
  2. l'utilisation de la liste d'affichage et comment il fonctionne
  3. la conception en général

Cette _root variable est totalement inutile. Vous avez probablement copié cela à partir d'un tutoriel en ligne. C'est une mauvaise pratique qui mène à des pratiques pires. Il recrée la fonctionnalité qui est déjà là. Ne l'utilise pas.

Ensuite, EasyDraw classe elle-même. Cette classe est essentiellement un conteneur vide avec des méthodes pour y ajouter des formes. Compte tenu de la structure générale de la liste d'affichage de l'ajout DisplayObject s à DisplayObjectContainer s, cela semble être couplé inutilement. Pourquoi le conteneur apporterait-il les méthodes pour créer les enfants? Créez plutôt des classes séparées pour les cercles et les rectangles de manière orientée objet. Ensuite, il suffit de les ajouter à un objet Sprite si vous avez besoin d'un conteneur. Il n'y a pas besoin de EasyDraw.

Le concept décrit pourrait conduire à deux classes comme celles ci-dessous. Ils sont basés sur votre code. Pensée orientée objet naïf ici: Vous voulez un cercle? Créez un cours pour ça! Tu veux un rectangle? Créez un cours pour ça! Mais ça fait le travail.

package ezd.easydraw 
{ 
    import flash.display.Shape; 

    public class CircleShape extends Shape 
    { 
     public function DrawCircle(r:Number=50, color:uint = 0) 
     { 
      graphics.beginFill(color, 1); 
      graphics.drawCircle(0, 0, r); 
      graphics.endFill(); 
     } 
    } 
} 
package ezd.easydraw 
{ 
    import flash.display.Shape; 

    public class RectangleShape extends Shape 
    { 
     public function RectangleShape(w:Number = 50, h:Number = 50, color:uint = 0) 
     { 
      graphics.beginFill(color, 1); 
      graphics.drawRect(-w/2, -h/2, w, h); 
      graphics.endFill(); 
     } 
    } 
} 

J'ai fait quelques ajustements qui sont pour la plupart des préférences personnelles, vous pouvez faire votre chemin:

  • J'ai supprimé les paramètres qui définissent la position du constructeur comme ils juste gonfler le constructeur et chaque DisplayObject définit des setters pour ceux de toute façon. Si vous insistez pour placer toutes les valeurs associées dans un énorme appel de fonction, je suggère de créer une méthode static qui renvoie l'objet créé. Cette valeur par défaut pour la couleur était plutôt étrange. Je l'ai changé.

  • l'origine est au centre de chaque forme

Quoi qu'il en soit, vous les utilisez comme tout DisplayObject: créer une instance et de l'ajouter à un DisplayObjectContainer. C'est le point important. Ils se fondent dans l'API qui est déjà en place. Votre code de ligne de temps pourrait maintenant regarder quelque chose comme ça:

import ezd.easydraw.EasyDraw; 
stop(); 
var circle:Circle = new Circle(300, 0xff00); 
circle.x = circle.y = 300; 
addChild(circle); 

Maintenant, si vous voulez ajouter le cercle à un conteneur, un Sprite fera très bien:

import ezd.easydraw.EasyDraw; 
stop(); 
var container:Sprite = new Sprite(); 
addChild(container); 

var circle:Circle = new Circle(300, 0xff00); 
circle.x = circle.y = 300; 
container.addChild(circle);