所有的段都添加好了之后,调用positionSegments()方法来围绕_shapesHolder容器的注册点也就是舞台的中心点旋转他们,用360除以段的数量就可以很容易的算出每个段之间相距的角度。
代码:
var segments:int = _shapeHolder.numChildren; var angle:Number = 360 / segments; for (var i:int = 1; i < segments; i++ ) { _shapes[i].rotation = angle * i; }
init方法最后的几行为舞台添加3个事件侦听器,然后给舞台应用发光滤镜用来添加一些视觉效果。(有关滤镜的更多内容在下一章)。
在onStageMouseDown()函数中,我在第一个shape中调用moveTo()方法,这样虚拟画笔会移动到鼠标当前的位置,然后我创建一个侦听器用来侦听EVENT_FRAME事件。
代码:
var shape:Shape = _shapes[0]; shape.graphics.moveTo(shape.mouseX, shape.mouseY); addEventListener(Event.ENTER_FRAME, onEnterFrame);
onStageMouseUp()函数中我只是简单的移除对ENTER_FRAME事件的侦听,onEnterFrame函数会在ENTER_FRAME 发生时调用。在onEnterFrame里面,我旋转_shapeHolder容器并调用draw()方法。
代码:
_shapeHolder.rotation += ROTATION_RATE; draw();
draw()方法,我在第一个shape中调用lineTo方法,这样会绘制一条到鼠标当前位置的直线。
代码:
var shape:Shape = _shapes[0]; shape.graphics.lineTo(shape.mouseX, shape.mouseY);
记住当鼠标按下之后这会发生在每一帧上,即便鼠标不移动,但是因为_shapeHolder容器自身的旋转,所以当前鼠标坐在的位置跟之前 shape.moveTo定义的位置还是不一样。接下来,我遍历所有的段,调用copyFrom方法把第一个shape中的内容复制到他们每一个里面,就这么简单!
代码:
var segments:int = _shapeHolder.numChildren; for (var i:int = 1; i < segments; i++ ) { _shapes[i].graphics.copyFrom(shape.graphics); }
init方法里面最后一个侦听器用来侦听键盘按下事件。当键盘按下时,onStageKeyDown方法被调用,在它里面我检查上下箭头是否被按下,如果按下Up键,我首先确保当前段的数量小于最大段数限制,如果还没达到限制,我调用addSegment()方法添加一个新段,然后调用 positionSegment()方法定位所有的段。
代码:
case Keyboard.UP: if (_shapeHolder.numChildren < MAX_SEGMENTS) { addSegment(); positionSegments(); }
如果DOWN键被按下,我检查当前段数是否小于最小段数限制,如果没有,我调用removeSegment()方法删除一个段并调用 positionSegment()方法从新定位所有的段。
removeSegment()方法简单的删除_shape数组里面的最后一个值,并把它从_shapeHolder容器中删除。
代码:
var shape:Shape = _shapes.pop(); _shapeHolder.removeChild(shape);
现在继续玩玩你的大作吧,看看你画出什么漂亮的东西出来,记得按上下键来调整段的数量,看看出来的效果有什么不同。图1-15中我展示了一些我的“艺术品”。

经典论坛交流:http://bbs.blueidea.com/thread-2992169-1-1.html
本文链接:http://www.blueidea.com/tech/multimedia/2010/7819.asp
出处:蓝色理想
责任编辑:bluehearts
上一页 ActionScript3.0 Image Effects 复制图形 [3] 下一页
◎进入论坛RIA设计与应用版块参加讨论
|