为什么不发送这个自定义库绘制形状?动作脚本 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?
_root
- 显示列表的使用及其工作原理
- 总体设计
_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);
所以我写了这个我将对其进行扩展的小实用程序,只是为了节省一些时间,但它似乎无法绘制形状,即使没有编译器问题?
自定义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?
_root
- 显示列表的使用及其工作原理
- 总体设计
_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);