2016-10-28 4 views
0

Итак, я написал эту небольшую утилиту, которую я буду расширять, просто чтобы сэкономить некоторое время, но доцент, похоже, нарисовал форму, хотя проблем с компилятором нет.Зачем добавлять эту пользовательскую библиотеку для рисования фигур? Actionscript 3

Пользовательский класс:

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

И "главного" окна для рисования фигур:

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

Что я делаю неправильно?

ответ

1

Что я делаю неправильно?

  1. _root
  2. использование списка отображения и как он работает
  3. дизайн в общем

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

Вперед, EasyDraw класс сам. Этот класс в основном пустой контейнер с методами для добавления в него фигур. Учитывая общую структуру списка отображения с добавлением DisplayObject s к DisplayObjectContainer s, это, кажется, излишне связано. Почему контейнер довел методы до , создав детей? Вместо этого создайте отдельные классы для кругов и прямоугольников объектно-ориентированным способом. Затем просто добавьте их в объект Sprite, если вам нужен контейнер. Нет необходимости в EasyDraw.

Очерченная концепция может привести к двум классам, подобным приведенным ниже. Они основаны на вашем коде. Довольно наивное объектно-ориентированное мышление здесь: вам нужен круг? Создайте для этого класс! Вы хотите прямоугольник? Создайте для этого класс! Но он выполняет свою работу.

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

Я сделал некоторые изменения, которые в основном личные предпочтения, не стесняйтесь делать это ваш путь:

  • Я удалил параметры, которые определяют позицию из конструктора, как они просто раздуйте конструктор, и каждый DisplayObject определяет сеттеры для них в любом случае. Если вы настаиваете на переносе всех связанных значений в один огромный вызов функции, я бы предложил создать метод static, который возвращает созданный объект.

  • Это значение по умолчанию для цвета было довольно нечетным. Я изменил это.

  • начало координат находится в центре каждой формы

Во всяком случае, вы используете их так же, как любой DisplayObject: создать экземпляр и добавить его в DisplayObjectContainer. Это важный момент. Они сливаются с апи, которая уже на месте. Ваше время строка кода может выглядеть примерно так:

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

Теперь, если вы хотите, чтобы добавить круг в контейнер, Sprite будет делать только штрафом:

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); 
Смежные вопросы