所以我写了这个小实用程序,我将扩展它,只是为了节省一些时间,但它似乎画出了形状,即使没有编译器问题?
自定义类:
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);
我做错了什么?
答案 0 :(得分:1)
我做错了什么?
_root
_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);