2008/07/26 | 绘图函数练习 AS3 画线
类别(Flash学习笔记) | 评论(0) | 阅读(2803) | 发表于 23:59

  以前写过的一个效果,现在换成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写的代码中,加入了渐变色的代码,在这里没有采用,需要渐变色效果的朋友在我的博客里去找吧(呵呵,慢慢找,可以增加点击率的噢)。

1

评论Comments