为什么这个自定义库会绘制形状?动作脚本3

时间:2016-10-28 17:23:36

标签: actionscript-3 flash-cs5

所以我写了这个小实用程序,我将扩展它,只是为了节省一些时间,但它似乎画出了形状,即使没有编译器问题?

自定义类:

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

" main"窗口绘制形状:

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

  

我做错了什么?

  1. _root
  2. 使用显示列表及其工作原理
  3. 一般设计
  4. _root变量完全没用。您可能已从某些在线教程中复制了该变量。这是一种不好的做法,导致更糟糕的做法。它重现了已经存在的功能。不要使用它。

    接下来,EasyDraw类本身。该类基本上是一个空容器,其中包含向其添加形状的方法。鉴于将DisplayObject添加到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都为这些构造函数定义了setter。如果您坚持将所有相关值推送到一个巨大的函数调用中,我建议创建一个返回创建对象的static方法。

    • 颜色的默认值相当奇怪。我改变了它。

    • 原点位于每个形状的中心

    无论如何,您使用就像任何DisplayObject 一样:创建一个实例并将其添加到DisplayObjectContainer。这是重点。他们融入了已经存在的api。您的时间线代码现在看起来像这样:

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