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

Why dosent this custom library draw shapes? Actionscript 3

所以我写了这个我将对其进行扩展的小实用程序,只是为了节省一些时间,但它似乎无法绘制形状,即使没有编译器问题?

自定义class:

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" window 绘制形状:

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

我做错了什么?

What am I doing wrong?

  1. _root
  2. 显示列表的使用及其工作原理
  3. 总体设计

_root 变量完全没用。 您可能是从某些在线教程中复制的。这是一种不好的做法,会导致更糟糕的做法。它重新创建了已经存在的功能。不要使用它。

接下来,EasyDraw class 本身。 class 基本上是一个空容器,其中包含向其添加形状的方法。考虑到将 DisplayObject 添加到 DisplayObjectContainer 的显示列表的一般结构,这似乎是不必要的耦合。为什么容器会将方法带到 create 和 children?而是以面向 object 的方式为圆形和矩形创建单独的 classes。如果需要容器,只需将它们添加到 Sprite object 即可。不需要 EasyDraw.

概述的概念可能会导致如下两个 classes。它们基于您的代码。很天真 object 面向这里的想法:你想要一个圆圈?为此创建一个 class!你想要一个长方形?为此创建一个 class!但它完成了工作。

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 方法,该方法 returns 创建 object.

  • 颜色的默认值很奇怪。我改了。

  • 原点在每个形状的中心

无论如何,您可以像使用任何 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);