二维动画制作

丁弋洵

目录

  • 1 课前准备
    • 1.1 课程介绍及软件安装
    • 1.2 课程学习方法
  • 2 二维动画制作基础
    • 2.1 动画的起源与发展
    • 2.2 动画原理及制作方式
    • 2.3 本章测验
  • 3 认识Flash
    • 3.1 Flash简介及应用领域
    • 3.2 我的第一个Flash作品
    • 3.3 Flash的工作界面
    • 3.4 Flash的时间轴和场景
    • 3.5 本章测验
  • 4 图形的绘制与编辑
    • 4.1 绘图工具箱
    • 4.2 矩形工具
    • 4.3 椭圆工具
    • 4.4 基本矩形与基本椭圆工具
    • 4.5 多角星形工具
    • 4.6 线条工具
    • 4.7 铅笔工具
    • 4.8 刷子工具1
    • 4.9 刷子工具2
    • 4.10 喷涂刷工具
    • 4.11 钢笔工具
    • 4.12 文本工具
    • 4.13 DECO工具1
    • 4.14 DECO工具2
    • 4.15 DECO工具3
    • 4.16 选择工具
    • 4.17 部分选取工具
    • 4.18 任意变形和渐变变形工具
    • 4.19 套索工具
    • 4.20 颜料桶工具
    • 4.21 墨水瓶工具
    • 4.22 滴管工具
    • 4.23 颜色面板
    • 4.24 渐变填充
    • 4.25 调色板
    • 4.26 样本面板
    • 4.27 橡皮擦工具
    • 4.28 手形工具和缩放工具
    • 4.29 绘制模式
    • 4.30 对象的组合和分离
    • 4.31 案例:雨伞的绘制
    • 4.32 案例:红心的绘制
    • 4.33 案例:香烟的绘制
    • 4.34 案例:鼠标的绘制
    • 4.35 本章测验
    • 4.36 实战演练
  • 5 元件的使用
    • 5.1 Flash中的元件
    • 5.2 图形元件
    • 5.3 按钮元件
    • 5.4 影片剪辑元件
    • 5.5 本章测验
    • 5.6 实战演练
  • 6 Flash中的动画制作
    • 6.1 逐帧动画的制作
    • 6.2 形状补间动画的制作
    • 6.3 形状补间动画案例:小草的生长
    • 6.4 动作补间动画的制作
    • 6.5 引导层动画的制作
    • 6.6 遮罩动画的制作
    • 6.7 骨骼动画
    • 6.8 3D动画
    • 6.9 Deco动画
    • 6.10 有声动画的制作
    • 6.11 本章测验
      • 6.11.1 帧的基本操作---测验
      • 6.11.2 逐帧动画---测验
      • 6.11.3 形状补间动画---测验
      • 6.11.4 动作补间动画---测验
      • 6.11.5 引导层动画---测验
      • 6.11.6 遮罩动画---测验
    • 6.12 实战演练
  • 7 脚本应用基础
    • 7.1 Action脚本简介和基本语法
    • 7.2 Action数据类型与运算符
    • 7.3 程序流程的控制
    • 7.4 认识动作面板
    • 7.5 本章测验
      • 7.5.1 Action脚本简介和基本语法---测验
      • 7.5.2 Action数据类型与运算符---测验
      • 7.5.3 程序流程的控制---测验
      • 7.5.4 认识动作面板---测验
  • 8 交互式动画
    • 8.1 跳转语句的学习
    • 8.2 事件处理
    • 8.3 Flash自定义函数
    • 8.4 鼠标事件
    • 8.5 复制影片剪辑的制作
    • 8.6 随机加载影片剪辑
    • 8.7 键盘事件
    • 8.8 控制声音播放
    • 8.9 本章测验
      • 8.9.1 跳转语句的学习---测验
      • 8.9.2 flash自定义函数---测验
      • 8.9.3 事件处理---测验
      • 8.9.4 鼠标事件---测验
      • 8.9.5 随机加载影片剪辑---测验
      • 8.9.6 键盘事件之keyboardevent类---测验
      • 8.9.7 控制声音播放---测验
    • 8.10 实战演练
控制声音播放

课堂导入

   在我们的交互式动画里,对声音的控制非常重要,应用广泛,如何控制声音的播放、暂停、后退、前进呢?让我们一起来学习吧!



学习目

1、掌握在flash中加载声音的方法;

2、掌握声音播放控制的基本方法。


学习任务单


素材下载


教学视频

教学课件


拓展资源

(一)思考一下:如何制作一个完整的音乐播放器呢?

(二)操作步骤

  步骤1:播放声音。创建mp3播放器背景影片剪辑sound,圆角绘制矩形框,填充颜色、添阴影效果。从外部打开mps音乐文件并播放。将sound影片剪辑链接属性设置为:playas.mp3play。创建playas.mp3play.as脚本文件,输入代码:

package playas{

import flash.display.*;

import flash.events.*;

import flash.system.*;

import flash.utils.*;

import flash.media.*;

import playas.thedraw;

//import playas.control;

import flash.net.URLRequest;

public class mp3play extends Sprite {

public static  var Url:String = "mp3/music.mp3";//设置mp3路径

public static  var _instance:mp3play;

public static  var mymp3=new Sound();

public static  var music=new SoundChannel();

 

public function mp3play() {//构造函数

System.useCodePage=true;

stage.scaleMode=StageScaleMode.NO_SCALE;

stage.align=StageAlign.TOP_LEFT;

//setplay();  //添加波形显示元件

mymp3.load(new URLRequest(Url));  //加载声音文件

music=mymp3.play();  //设置声音状态为播放

}

//private function setplay() {//波形控件添加

//var playEffect=new thedraw();

//playEffect.x=25;

//playEffect.y=120;

//addChild(playEffect);//添加波形图

//}

}

}

其中部分代码注释是因为暂时不显示声音的波形,待程序全部编写完成,需将注释部分取消注释。此时程序可以播放mp3音乐。

步骤2:下面要实现音乐的播放音量、进程等控制,需要创建控件。

(1)播放控制:创建影片剪辑play_b,第1帧放置播放按钮,输入代码:stop();第2帧放置暂停按钮。如下图示。

(2)停止控制:以按钮元件方式准备一个停止按钮,命名为:stop_b

(3)音量控制:创建影片剪辑vol_bg和vol_mask,vol_bg中放音量进度条背景,相对于舞台左对齐,上对齐,音量进度条宽度、高度略小于背景,左对齐,上对齐。

(4)播放进度控制:创建2个影片剪辑元件,分别放置进度条背景线条、前景条,分别命名为line、sco,和创建游标按钮元件,命名为mybar。注意:所创建的元件相对于舞台左对齐,上对齐。创建control_bar影片剪辑,组合进度条的mybar、sco、line三个内容,实例名称与相应的影片剪辑及按钮同名。

(5)播放时间显示:创建时间显示文本框,动态文本,命名为:showtxt。

(6)创建影片剪辑control,将以上控件逐一拖入,实例名用相应的影片剪辑或按钮名称命名,如下图:

(7)将control影片剪辑拖入,实例名为:control。

步骤3:创建control.as脚本文件,输入下列代码:

package playas{

import flash.display.*;

import flash.events.*;

import flash.utils.*;//使用MC时引入

import flash.text.TextField;

import flash.net.NetStream;

import flash.media.SoundTransform;

import flash.geom.Rectangle;//位置类

import flash.net.URLRequest;

import playas.mp3play;

public class control extends Sprite {

private var pos:Number=0;

public static  var runTime;

private var len:Number;

private var playtag:Boolean=true;//播放时为T

private var drag:Boolean=false;

private var soundv:SoundTransform;

public function control() {

runTime=new Timer(100);

// 创建一个时间对象来累加管理播放器的时间点。

runTime.start();

control_bar.sco.width=1;

control_bar.mybar.x=-20;

soundv=new SoundTransform();

vol_bg.addEventListener(MouseEvent.CLICK,volumeOnClick);

vol_mask.addEventListener(MouseEvent.CLICK,volumeOnClick);

//声音控制器

play_b.gotoAndStop(2);

runTime.addEventListener(TimerEvent.TIMER,timeEvent);

play_b.addEventListener(MouseEvent.CLICK,onPlay);

control_bar.line.addEventListener(MouseEvent.CLICK,seekOnClick);

control_bar.sco.addEventListener(MouseEvent.CLICK,seekOnClick);

stop_b.addEventListener(MouseEvent.CLICK,onStop);

control_bar.mybar.addEventListener(MouseEvent.MOUSE_DOWN,mousedown_bar);

}

private function volumeOnClick(event:MouseEvent):void {

var time:Number=vol_bg.mouseX/vol_bg.width;

soundv.volume=time;

vol_mask.scaleX=time;

mp3play.music.soundTransform=soundv;

}

 

// seedOnClick函数的作用是当鼠标载播放条上的相应点单击时进行跳转操作。

private function seekOnClick(event:MouseEvent):void {

if ( playtag) {

var time:Number=((control_bar.line.mouseX-2)/control_bar.line.width)*len;

mp3play.music.stop();

mp3play.music=mp3play.mymp3.play(time);

mp3play.music.soundTransform=soundv;

}

}

// mousedown_bar鼠标拖动播放点时的事件函数

private function mousedown_bar(event:MouseEvent):void {

if ( playtag) {

drag=true;

var theRec:Rectangle = new Rectangle(0, 0, control_bar.line.width-5, 0);//x=0 y=0 w=200 h=0

control_bar.mybar.startDrag(false,theRec);//是否锁定中点:false 限制拖动矩形:theRec

this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseup);

}

}


//结束拖动操作,计算拖动进度条对应的播放时间time,并开始播放音乐

private function mouseup(event:MouseEvent):void {

if (drag) {

drag=false;

control_bar.mybar.stopDrag();

var time:Number=(control_bar.mybar.x/control_bar.line.width)*len;

mp3play.music.stop();

mp3play.music=mp3play.mymp3.play(time);

}

}

//停止播放操作,重置进度条,播放按钮跳转到第1帧,然后将显示时间重新设置为0。

private function onStop(event:MouseEvent):void {

if ( playtag) {

playtag=false;

mp3play.music.stop();

runTime.stop();

pos=0;

play_b.gotoAndStop(1);

control_bar.mybar.x=-2;

control_bar.sco.width=0;

showtxt.text ="00:00";

}

}

//如果视频处于播放状态,当单击播放按钮后暂停播放

private function onPlay(event:MouseEvent):void {

if (! playtag) {

playtag=true;

play_b.gotoAndStop(2);

mp3play.music=mp3play.mymp3.play(pos);

runTime.start();

mp3play.music.soundTransform=soundv;

} else {

playtag=false;

pos=mp3play.music.position;

play_b.gotoAndStop(1);

mp3play.music.stop();

runTime.stop();

}

}

 

//每一秒钟执行一次侦听函数,设置进度条和播放时间

private function timeEvent(event:TimerEvent) {

var loaded:int = mp3play.mymp3.bytesLoaded;

var total:int = mp3play.mymp3.bytesTotal;

pos =mp3play.music.position;

len = mp3play.mymp3.length;

if (total > 0) {

var loadnum:Number = loaded / total;

if (loadnum!=1) {//如果音乐还没加载完,那么显示播放时间的文本框用来显示当前加载进度。

len /=loadnum;

showtxt.text=int(loadnum*100)+"%";

control_bar.line.scaleX=loadnum;

} else {

control_bar.line.scaleX=1;

showtxt.text =revise(int((pos/1000)/60))+":"+revise(int(pos/1000)%60);

}

//var percentPlayed:Number =pos/len;

//下面控制已播放标记sco和播放点mybar,当前所播放完成的标记长度等于播放条要滚动的所有长度乘以音乐总长度len与当前音乐点pos的比值。

if (! drag) {

control_bar.sco.width=(control_bar.line.width)*(pos/len);

control_bar.mybar.x=control_bar.sco.width-2;

} else {//当播放点被子拖动时停止对x轴的控制,bar自动适应

control_bar.sco.width=control_bar.mybar.x+10;

}

}

}

private function revise(num) {

if (num<10) {

num = "0"+num;

}

return num;

}

}

}

 

步骤4:创建波形显示文件thedraw.as,首先使用SoundMixer类来控制swf中嵌入的声音流,然后使用SoundMixer类的computerSpectrum方法来获取当前声音波形的快照,接着将其放在指定的ByteArray对象中,并且这些值已设定为标准的浮点值(-1~1)格式。输入下列代码:

package playas{

import flash.display.Sprite;

import flash.events.*;

import flash.media.SoundMixer;

import flash.utils.ByteArray;

public class thedraw extends Sprite {

private var shapeNum=50;//波形数

private var dx=3;//波形间距

private var set_y:Number=0;//设置波形图打印的Y轴,需要和thedraw类里的值一至

private var set_x:Number=0;//设置波形图打印的X轴

private var bytes: ByteArray;

public function thedraw() {

for (var i:uint=0; i<shapeNum; i++) {

var circle=new shape();

circle.name = "rect"+i;

circle.x=set_x+i*dx;//x,y位置

circle.y=set_y;

circle.height=3;

addChild(circle);//添加它到场景中

var pix=new shape();  //从这里开始创建矩形上方跳动的高度为2个像素的小矩形。

pix.name = "pix"+i;

pix.x=set_x+i*dx;//x,y位置

pix.y=set_y;

pix.height=2;

addChild(pix);//添加它到场景中

}

bytes = new ByteArray();

this.addEventListener( Event.ENTER_FRAME, onEnterFrame );

}

private function onEnterFrame( event: Event ):void {

SoundMixer.computeSpectrum( bytes, true, 0 );

var value: Number;

var shape;

var set_h;

var usepix;

//control.volbut.x=50

var i=0;

for (var j = 0; i<shapeNum*2; j++) {

value = bytes.readFloat();

set_h=(int(value*100000)/1000)/3;

if (j%2==0) {//总共有255个音波,这里用不着那么多把他们折叠起来

                    //每隔两个浮点取值一次

if (i<shapeNum) {

shape=getChildByName("rect"+i);

if (shape.height<set_h) {

shape.y=set_y-set_h;

shape.height=set_h;

}

} else {

usepix=getChildByName("pix"+(i-shapeNum));

shape=getChildByName("rect"+(i-shapeNum));

var use_y=set_y-shape.height-set_h-1;

if (usepix.y>use_y) {

usepix.y=use_y;

}

}

i++;

}

}

}

}

}

import flash.display.*;

import flash.events.*;

class shape extends Sprite {

//注:一个绘图类,就当作一个mc了,所有的设置与属性等,都是针对这个mc了

public var max_h:Number=0;//设置Y轴,需要和sound类里的一致

public function shape() {

graphics.beginFill(0xFB62009);

graphics.drawRect(0,0,1,30);//画矩形

graphics.endFill();

this.addEventListener( Event.ENTER_FRAME, onEnterFrame );

}


//下面添加onEnterFrame事件,当矩形高度大于3像素时会自动缩小,形成不断变化的波形图

private function onEnterFrame( event: Event ):void {

if (this.height>3) {//控制长条的情况

this.height--;

this.y=max_h-this.height;

} else {

if (this.height!=2) {//短条方块的高是2,如果是短条不设置高

this.y=max_h-this.height;

}

}

if (this.height==2 && this.y<max_h) {

this.y++;//控制短条Y轴

}

if (this.y>max_h-this.height) {//保持底部对齐

this.y=max_h-this.height;

}

}

}


课后检测

同学们,请扫描以下二维码进行课后检测,我们将全程记录你的答题情况。