以前写过的一个效果,现在换成AS3版的,按类的形式来写代码,感觉自己似乎也更有条理了。
第一个类:点状对象,继承自Sprite,使用目的,在屏幕中进行跑路,然后由上层的类跟踪它,以它们的位置进行连线,得到折线效果。
package
{
import flash.display.MovieClip;
public class LinePt extends MovieClip
{
public var vx:Number;
public var vy:Number;
function LinePt()
{
vx = 0;
vy = 0;
graphics.lineStyle(1, 0xff0000);
graphics.drawCircle(0, 0, 1); //画出一个点来
}
}
}
第二个类:画线类,将上一个类,当成是自己的部件,组合到自身中间,然后进行连线,就可以得到折线移动的效果。
package {
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.display.MovieClip;
public class ScrLine extends MovieClip {
private var pt:Array = new Array();
private var speed:Number = 20;
public function ScrLine() {
for (var i = 0; i < 4; i++) {
pt.push( new LinePt());
var mc = pt[i];
mc.x = stage.stageWidth / 2;
mc.y = stage.stageHeight / 2;
mc.vx = speed * Math.cos(Math.random() * 360);
mc.vy = speed * Math.sin(Math.random() * 360);
mc.alpha = 0;// 将原来的点藏起来
addChild( mc );
}
addEventListener(Event.ENTER_FRAME, onEF );
}
public function onEF( evt:Event) {
for (var i = 0; i < pt.length; i++) {
var mc = pt[i];
mc.x += mc.vx;
mc.y += mc.vy;
if (( mc.x < 0) || (mc.x > stage.stageWidth)) {
mc.vx *= -1;
}
if (( mc.y < 0) || (mc.y > stage.stageHeight)) {
mc.vy *= -1;
}
}
var p:Graphics = graphics;
p.clear();
p.lineStyle( 1, 0x00ff00);
var tx = (pt[0].x + pt[3].x) /2;
var ty = (pt[0].y + pt[3].y) /2;
p.moveTo( tx,ty );
for (var j = 1; j < pt.length; j++) {
tx = (pt[j-1].x + pt[j].x) /2;
ty = (pt[j-1].y + pt[j].y) /2;
p.curveTo(pt[j-1].x, pt[j-1].y,tx,ty );
}
tx = (pt[0].x + pt[3].x) /2;
ty = (pt[0].y + pt[3].y) /2;
p.curveTo(pt[3].x, pt[3].y,tx,ty );
}
}
}
为了效果好看,在开始时,让所有的点都聚在舞台中间,向四周随机扩散开,将这个类与库中的空元件进行链接,然后往舞台的(0,0)点拖放上几个,就会是下面的效果。
折线换成曲线,关键是找出控制点和正确的曲线起止点,在原来的基础上,让每两个点的中点位置当成是曲线的起止点,原先的顶点当成是控制点,这样就想当于在四个顶点构成的矩形内画了一个内切曲线,随着顶点的移动,曲线也会发生移动,代码如下:
package {
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.display.MovieClip;
public class ScrLine extends MovieClip {
private var pt:Array = new Array();
private var speed:Number = 20;
public function ScrLine() {
for (var i = 0; i < 4; i++) {
pt.push( new LinePt());
var mc = pt[i];
mc.x = stage.stageWidth / 2;
mc.y = stage.stageHeight / 2;
mc.vx = speed * Math.cos(Math.random() * 360);
mc.vy = speed * Math.sin(Math.random() * 360);
mc.alpha = 0;
addChild( mc );
}
addEventListener(Event.ENTER_FRAME, onEF );
}
public function onEF( evt:Event) {
for (var i = 0; i < pt.length; i++) {
var mc = pt[i];
mc.x += mc.vx;
mc.y += mc.vy;
if (( mc.x < 0) || (mc.x > stage.stageWidth)) {
mc.vx *= -1;
}
if (( mc.y < 0) || (mc.y > stage.stageHeight)) {
mc.vy *= -1;
}
}
var p:Graphics = graphics;
p.clear();
p.lineStyle( 1, 0x00ff00);
var tx = (pt[0].x + pt[3].x) /2;
var ty = (pt[0].y + pt[3].y) /2;
p.moveTo( tx,ty );
for (var j = 1; j < pt.length; j++) {
tx = (pt[j-1].x + pt[j].x) /2;
ty = (pt[j-1].y + pt[j].y) /2;
p.curveTo(pt[j-1].x, pt[j-1].y,tx,ty );
}
tx = (pt[0].x + pt[3].x) /2;
ty = (pt[0].y + pt[3].y) /2;
p.curveTo(pt[3].x, pt[3].y,tx,ty );
}
}
}
效果如下:
之前用AS2.0写的代码中,加入了渐变色的代码,在这里没有采用,需要渐变色效果的朋友在我的博客里去找吧(呵呵,慢慢找,可以增加点击率的噢)。