二维动画制作

丁弋洵

目录

  • 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、掌握随机函数的使用方法;

2、掌握制作动态加载影片剪辑的方法。


学习任务单


素材下载


教学视频

教学课件



实战演练


以下为该案例的事件三要素及事件侦听过程分析:

详细代码及解释如下:

stage.addEventListener(Event.ENTER_FRAME,xx);//使用帧循环事件,不断加载雪花。

function xx(evt:Event) { 

var mc:MovieClip=new xh(); //动态加载一次,并随机设置属性

mc.x=Math.random()*680; //随机设置雪花的X坐标值

mc.y=Math.random()*460; //随机设置雪花的Y坐标值

mc.scaleX=mc.scaleY=Math.random()*0.6+0.4; //随机设置雪花的大小

mc.alpha = 0.3+0.6*Math.random(); //随机设置雪花的透明度

addChild(mc); //添加对象至舞台

}

拓展资源

(一)思考一下:如何制作一个如下图的拼图游戏呢?

(二)操作步骤

    1.设计思路

(1)首先导入背景图片,然后添加“开始”按钮;

(2)创建文档类,对图片进行切割和对切割后的小图片进行随机排序,然后为随机排序后的小图片进行注册时间侦听,并检测与其他小图片间的碰撞情况。

2.素材处理:

(1)新建580*430像素,24fps空白文档,在背景图层绘制如图3-9-2所示背景图片;

(2)创建“开始”按钮元件,将其拖入场景,设置实例名称为start_bnt;

(3)将素材images.jpg文件导入到库,然后为该图片添加元件扩展类,设置类名为Img。

3.程序编写:

(1)Main.as

package {

import flash.display.*;

import flash.events.*;


import flash.geom.Point;

import flash.geom.Rectangle;


import lby.events.SimpleMouseEvent;

import lby.events.SimpleMouseEventHandler;


import caurina.transitions.*;

import ws.tink.display.HitTest;

//主程序类第一部分

public class Main extends Sprite {

private var container_mc:Sprite = new Sprite();//创建存储小图片的容器

private var loaderW:Number = 400; //设置导入的大图片的宽度和高度

private var loaderH:Number = 300;


private var drag_mc:Sprite;//创建小图片容器以及对应的坐标位置

private var clickX:Number;

private var clickY:Number;

private var change_mc:Sprite;//将要进行切换的小图片容器

private var changeX:Number;

private var changeY:Number;


private var isChange:Boolean;//是否切换两张图片标记

private var isStart:Boolean;//是否开始游戏标记

        

private var point_array:Array;//创建数组,存放小图片的开始坐标

private var sort_array:Array;//创建数组,存放小图片游戏开始时的随机坐标

//主程序类第二部分

public function Main() {//构造函数中创建右上角的演示小图片

var bitmap:BitmapData = new Img(0, 0);

var thumb_mc:Sprite = new Sprite();


thumb_mc.graphics.beginBitmapFill(bitmap);

thumb_mc.graphics.drawRect(0, 0,loaderW,loaderH);

thumb_mc.graphics.endFill();

addChild(thumb_mc);


thumb_mc.scaleX = thumb_mc.scaleY =.3;//设置缩放值

//thumb_mc.height = loaderH / loaderW * 100;

thumb_mc.x = 430;//设置位置

thumb_mc.y = 84;


container_mc.x = 20;//设置存储小图片的容器坐标

container_mc.y = 48;

this.addChild(container_mc);

init();

addListener();

}

//主程序类第三部分

private function init() {

this.point_array = new Array();

this.sort_array = new Array();

var newX = 0;

var newY = 0;

// 列和行数

var num_columnas:uint=5;//以列为主,也就是限制列数

var num_rows:uint=5;//自动排行

var count:uint=0;//用于累加计数

var _length:uint = num_columnas * num_rows;//创建图片总个数


//图像的宽为imageW、高为imageH.间隔为dis

var imageW:Number = this.loaderW/5;

var imageH:Number = this.loaderH/5;


var pages:uint = Math.ceil(_length / (num_columnas * 2));


var bitmap:BitmapData;

var shape_mc:Shape;

var _mc:Sprite;

for (var i = 0; i < _length; i++) {//切割图片

bitmap = new Img(0, 0);

shape_mc = new Shape();

shape_mc.graphics.beginBitmapFill(bitmap);//填充位图

shape_mc.graphics.drawRect(newX, newY, imageW, imageH);

shape_mc.graphics.endFill();

shape_mc.x = - newX;//偏移

shape_mc.y = - newY;


_mc = new Sprite();

_mc.name = "mc" + i;

_mc.x = newX;//再偏移回来

_mc.y = newY;


this.point_array.push( new Point(newX,newY) );

                //存储所有小图片的 x/y坐标

this.sort_array.push( new Point(newX, newY) );


_mc.addChild(shape_mc);

_mc.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);

_mc.addEventListener(MouseEvent.MOUSE_UP, upHandler);


//使用了自己定义的事件类,下面两行是自己定义的事件类的应用

SimpleMouseEventHandler.register(_mc);//传入要作为侦听的对象

_mc.addEventListener(SimpleMouseEvent.RELEASE_OUTSIDE, releaseHandler);

_mc.buttonMode = false;

_mc.mouseEnabled = false;//先设置为不接收鼠标事件


//x方向排列

newX += imageW;

//定义临时列数

count += 1;

//控制列数,如果临时列数与初定义的相同,每排完num_columnas个后,

//就向左移(imageW*num_columnas),而y方向直接向下递增

if (count == num_columnas) {

count = 0;

newX -= (imageW * num_columnas);

newY += imageH;

}


//trace("_mc.x = " + _mc.x + "_mc.y = " + _mc.y );

container_mc.addChild(_mc);

if (i == _length - 1) {

newY = 0;//重新初始化

}

}

//trace(this.point_array);

}

//主程序类第四部分

private function addListener() {

start_btn.addEventListener(MouseEvent.CLICK, startGame);

}


private function startGame(event:MouseEvent):void {

randomItems();

this.isStart = true;

this.itemsListener();

start_btn.visible = false;//开始按钮不可见

}


private function itemsListener(istrue:Boolean = true):void {//所有小图片容器允许接收鼠标事件

var _length:uint = container_mc.numChildren;

var _mc:Sprite;

for (var i = 0; i < _length; i++) {

_mc = this.container_mc.getChildAt(i) as Sprite;

_mc.mouseEnabled = istrue;

}

}


private function randomItems() {//为小图片容器随机排序

this.sort_array = this.randomArray(this.sort_array);

             //为sort_array数组进行随机排序

trace(this.sort_array);

trace(this.point_array);

            //重新为所有小图标的x/y坐标赋值

var _length:uint = container_mc.numChildren;

var _mc:Sprite;

for (var i = 0; i < _length; i++) {

_mc = this.container_mc.getChildAt(i) as Sprite;

_mc.x = this.sort_array[i].x;

_mc.y = this.sort_array[i].y;

}

}


private function downHandler(event:MouseEvent):void {

this.drag_mc = event.target as Sprite;

this.clickX = drag_mc.x;

this.clickY = drag_mc.y;


var _length:uint = container_mc.numChildren-1;

var last_mc:Sprite = container_mc.getChildAt(_length) as Sprite

container_mc.swapChildren(container_mc.getChildAt(_length), drag_mc);

drag_mc.startDrag();

}


//这里的事件类型为自定义的SimpleMouseEvent事件

private function releaseHandler( event: SimpleMouseEvent ):void {

this.upHandler();

}


private function upHandler(event:MouseEvent = null):void {

//单击小图片容器执行upHandler(),停止拖动

//drag_mc = event.target as Sprite;

drag_mc.stopDrag();


this.change_mc = initialize(this.drag_mc,this.container_mc);

         //判断被单击小图片容器是否与container_mc容器中的小图片发生碰撞接触。

//如果接触面积达到图片对应宽度/高度一半以上,执行if 语句切换两张碰撞接触图片的位置。

if (this.change_mc != null) {

this.changeX = this.change_mc.x;

this.changeY = this.change_mc.y;


Tweener.addTween(this.drag_mc, { x: changeX, y: changeY, time:.2 } );

Tweener.addTween(this.change_mc, { x: clickX, y: clickY, time:.2 ,onComplete:this.motionFinish} );

}else {//如果未接触则返回到原位置。

Tweener.addTween(this.drag_mc, { x: clickX, y: clickY, time:.2 } );

}

//drag_mc = null;

}


private function motionFinish():void {//判断是否获胜

var iswin:Boolean = isWin();

trace(iswin);

if (iswin) {

this.isStart = false;

this.itemsListener(false);


start_btn.visible = true;//开始按钮可见

}

}


private function isWin():Boolean {

//判断所有小图片的位置是否与未进行随机排序时的位置保持一致。

var _length:uint = container_mc.numChildren;

var _mc:Sprite;

for (var i = 0; i < _length; i++) {

_mc = this.container_mc.getChildByName("mc" + i) as Sprite;


//trace("i = " + i + "  _mc.x = " + Math.floor(_mc.x) + "  this.point_array[i].x = " + this.point_array[i].x);


if (Math.floor(_mc.x) != this.point_array[i].x) return false;

if (Math.floor(_mc.y) != this.point_array[i].y) return false;

}

return true;

}


public function initialize(click_mc:Sprite,container_mc:Sprite):*{

var change_mc:Sprite;

var all_mc:Sprite;

var _length:uint = container_mc.numChildren;

var hit:Boolean;

var intersection:Rectangle;

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

all_mc = container_mc.getChildAt(i) as Sprite;

if (all_mc.name != click_mc.name) {

intersection = HitTest.intersectionRectangle( all_mc, click_mc );

hit = intersection.width > click_mc.width/2 && intersection.height > click_mc.height/2  ;

if (hit) return all_mc;

}

}

return null;

}


 // 数组的随机排序

public function randomArray(_array:Array):Array {

_array.sort(function () {return ( Math.floor(Math.random()*2) ? (1) : (-1) ) } );

return (_array);

}

}

}


学习讨论


课后检测

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