Flash AS3.0 实际的例子教程 喷水动画特效

更新时间:15-09-16 17:33 热度:394
 

在这个实际的例子教程中,我们将绍介利用速度矢量和重置对象的技法来成功实现喷水效果。所说的矢量就是得法向的量。譬如一辆车从东向西以80千米每钟头的速度行走,那末我们就可以获得交通工具的速度矢量,它涵盖两个元素:速度,每钟头80千米,方向,由东向西。
  下边我们来剖析一下子喷水是怎样形成的。
  喷水是多少个水珠上进喷吐,而后又受重力影响掉回地面。这个过程的速度矢量有哪一些,具体又是怎么的呢?很容易发觉至少的两个力,一个是使水珠上进喷吐的外力,一个是使水珠掉回地面的重力。
  外力的速度矢量:速度我设为10-20间的随机数,方向是上进的那就一定是y轴上的负数了。将这个速度矢量加到水珠上就使水珠上进喷吐了。
  具体作法是:在ENTER_FRAME事情中这水珠的y 值加上-10到-20间的一个随机数。
  重力的速度矢量:速度就比较小了我设为0.5,方向则是y轴上的正值。一样加到ENTER_FRAME事情中,这么水珠在喷吐后便会掉回地上。
  还有个问题,由于速度矢量是加在ENTER_FRAME事情中的,水珠就有可能一直按这些个速度矢量运动,面远离戏台,那喷水就不知会喷到啥子地方去了。
  要解决这个问题,就要将越过戏台边界的水珠从新定位到喷吐口,这么就形成了不间断的喷吐了。
  好了,上头剖析了效果萌生办法,下边就来制造。
  第1步是要画一个水珠,新建一个影片儿剪接元件,用放射补充画一个鸭子蛋圆,左色标为白的颜色,公开度100百分之百,右色标略带点灰色,公开度50百分之百。在属性面板中设置鸭子蛋圆在宽为2像素,高为5像素。在库中右击该元件,敞开连署窗户,(cs4敞开属性窗户),设置一个类名,我设的是 pall。
  接下往返到主场景,敞开帧动作面板,我们来写代码。
  喷水是由多少水珠形成的,若干呢?我整了500个:
  var count:int = 500;
  重力速度矢量:
  var zl:Number = 0.5;
  将这500个水珠放到一个数组中:
  var balls:Array;
  balls = new Array();
  用一个for循环来将500个水珠放到数组中:
  for (var i:int = 0; i < count; i++) {
  var ball:pall = new pall();
  将水珠定位到水珠的喷吐口:
  ball.x = 260;
  ball.y = 200;
  在x轴方向也设一个速度矢量,使水珠在x轴的一定范围内,并将这个速度矢量存到每个水珠的自定义属性vx中:
  ball["vx"]= Math.random() * 2 – 1;
  下边是y轴方向的速度矢量,将它存在自定义属性vy中:
  ball["vy"] = Math.random() * -10 – 10;
  将水珠放到戏台上,共存到数组中:
  addChild(ball);
  balls.push(ball);
  接下来侦听ENTER_FRAME事情,成功实现喷水效果:
  addEventListener(Event.ENTER_FRAME, onEnterFrame);
  onEnterFrame函数内部实质意义:
  经过一个for循环为数组中的水珠加上各个速度矢量:
  for (var i:Number = 0; i < balls.length; i++) {
  var ball:pall = pall(balls);
  首选在喷吐速度矢量上加上重力速度矢量,这么每一帧的时间便会加一次重力,而喷吐力却没变,这么重力便会渐渐超过喷吐力面使水珠下落:
  ball["vy"] += zl;
  将x,y轴速度矢量加到水珠上:
  ball.x +=ball["vx"];
  ball.y +=ball["vy"];
  接下来的是看水珠是否越过了戏台,假如越过了戏台,则将水珠从新定位到喷吐口,并将速度矢量设为起初状况。
  if (ball.x – ball.width/2> stage.stageWidth
  ball.x + ball.width/2 < 0
  ball.y – ball.width/2 > stage.stageHeight
  ball.y + ball.width/2 < 0) {
  ball.x = 260;
  ball.y = 200;
  ball["vx"]= Math.random() * 2 – 1;
  ball["vy"] = Math.random() * -10 – 10;
  完整代码: var count:int = 500; var zl:Number = 0.5;
var balls:Array;
balls = new Array();
for (var i:int = 0; i < count; i++) {
var ball:pall = new pall();
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 – 1;
ball["vy"] = Math.random() * -10 – 10;
addChild(ball);
balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void {
for (var i:Number = 0; i < balls.length; i++) {
var ball:pall = pall(balls[i]);
ball["vy"] += zl;
ball.x +=ball["vx"];
ball.y +=ball["vy"];
if (ball.x – ball.width/2> stage.stageWidth
ball.x + ball.width/2 < 0
ball.y – ball.width/2 > stage.stageHeight
ball.y + ball.width/2 < 0) {
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 – 1;
ball["vy"] = Math.random() * -10 – 10;
}
}
}