CreateJs教程6章:easeljs中的精灵动画


EaselJS实现精灵动画

网页中经常会看到一些动画,如一个小人在奔跑,如下图:

EaselJS精灵动画demo

图中的小人就是精灵动画,它是由一张一张图片连续播放而形成的,不是直接在网页中放的一张gif哦。

本章将讲解如何实现这个效果,我们使用了EaselJS的SpriteSheet类

本课的代码如下,我们先列出代码,然后对主要的代码进行讲解。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>EaselJS: Simple SpriteSheet Example</title>

	<link href="../_easel-assets/css/shared.css" rel="stylesheet" type="text/css"/>
	<link href="../_easel-assets/css/examples.css" rel="stylesheet" type="text/css"/>
	<script src="../_easel-assets/js/examples.js"></script>
	<script src="../lib/easeljs-NEXT.js"></script>

<script id="editable">
	var stage;
	function init() {

		// create a new stage and point it at our canvas:
		stage = new createjs.Stage(document.getElementById("testCanvas"));

		// Define a spritesheet. Note that this data was exported by Zoë.
		var spriteSheet = new createjs.SpriteSheet({
				framerate: 30,
				"images": ["../_easel-assets/art/spritesheet_grant.png"],
				"frames": {"regX": 82, "height": 292, "count": 64, "regY": 0, "width": 165},
				// define two animations, run (loops, 1.5x speed) and jump (returns to run):
				"animations": {
					"run": [0, 25, "run", 1.5],
					"jump": [26, 63, "run"]
				}
			});

		// Events from SpriteSheet (not required for the demo)
		spriteSheet.on("complete", function(event) {
			console.log("Complete", event);
		});
		spriteSheet.on("error", function(event) {
			console.log("Error", event);
		});

		var grant = new createjs.Sprite(spriteSheet, "run");
		grant.x = stage.canvas.width / 2;
		grant.y = 22;

		// Add Grant to the stage, and add it as a listener to Ticker to get updates each frame.
		stage.addChild(grant);
		createjs.Ticker.timingMode = createjs.Ticker.RAF;
		createjs.Ticker.addEventListener("tick", stage);
	}

</script>
</head>

<body onload="init();">

<header class="EaselJS">
	<h1>EaselJS精灵动画 demos</h1>

	<p>使用<code>SpriteSheet</code>定义精灵动画的一个例子.</p>
</header>

<div>
	<canvas id="testCanvas" width="960" height="400"></canvas>
</div>
</body>
</html>

代码中的中的init初始化函数,创建stage舞台,我们都学过,这里主要讲 雪碧对象SpriteSheet部分


雪碧对象SpriteSheet

SpriteSheet是雪碧对象,createjs.SpriteSheet用于创建雪碧对象,其构造函数如下:

SpriteSheet ( data )
  • data : 一个雪碧数据的对象,这个对象比较复杂

这里有一个新概念,雪碧对象,或者精灵表对象


什么是雪碧对象(精灵表对象)

sprite是雪碧图,雪碧图就是将很多很多的小图片放在一张图片上。这样做的目的是,浏览器只需要下载一次图片,就能够得到多个图片内容,如下:

createjs雪碧图


SpriteSheet构造函数的参数对象data

传递给SpriteSheet构造函数的data参数需要包含如下内容,才能构造一个雪碧对象:

  • images:需要包含源图像或要使用的图像。
  • frames:需要包含各个图像帧的位置。
  • animations:形成命名动画的帧序列。可选参数的。
  • framerate:播放帧率。可选参数

这个对象示例为:

{ framerate: 30, "images": ["../_easel-assets/art/spritesheet_grant.png"], "frames": {"regX": 82, "height": 292, "count": 64, "regY": 0, "width": 165}, "animations": { "run": [0, 25, "run", 1.5], "jump": [26, 63, "run"] } }

接下来,我们对这几个值详细解释,知识需要慢慢品,像红酒一样,不要着急哦。


SpriteSheet中的images属性

images是一个数组,images中的元素可以是一个url地址,也可以是一个图像对象。这个参数是必须要有的:

images: [image1, "path/to/image2.png"],
  • image1是一个图像对象
  • path/to/image2.png是一个图像相对的路径

SpriteSheet中的frames

我们本例的小人动画是由一张一张的静态图片拼接成动态小人的。一个动画由若干帧组成。一个frames的定义如下:

frames: {
	width: 165,
	height: 292,
	count: 64,
	regX: 82,
	regY: 0,
	spacing: 0,
	margin: 0
}

frames的这几个属性的含义分别是:

  • width&height为必填项,表示每一帧的宽度和高度
  • regX&regY 表示每一帧的“原点”坐标
  • spacing 表示帧之间的间隔大小
  • margin 表示图像周围的边距
  • count允许您指定子画面中的帧总数;如果省略,将根据源图像和帧的尺寸进行计算。将根据帧在源图像中的位置(从左到右,从上到下)为帧分配索引。

每一个参数的含义用图来表示如下:

精灵表.jpg


SpriteSheet中的animations属性

定义一个或多个动画包含的帧及每帧之间的时间间隔。下面的代码定义了2个动画。

"animations": {
    "run": [0, 25, "run", 1.5],
    "jump": [26, 63, "run"]
}

animations中包含了2个动画,一个动画是跑(run),一个动画是跳(jump)。

  • run: 第0到25帧表示奔跑
  • jump:第26到63帧表示跳动

帧数或帧率framerate

每秒钟播放Spritesheet动画的帧数,如每秒20帧,那么设置为framerate: 20

帧就是视频或者动画中的每一张画面;帧数就帧的数量,即静止画面的数量;帧率是用于测量显示帧数的量度,单位是“每秒显示帧数”;

帧率(Frame rate) = 帧数(Frames)/时间(Time),单位为帧每秒(f/s, frames per second, fps)

帧率是用于测量显示帧数的量度,测量单位为“每秒显示帧数”( Frame per Second, FPS)或“赫兹”( Hz),一般来说 FPS 用于描述视频、电子绘图或游戏每秒播放多少幀。


spriteSheet对象的主要事件

spriteSheet对象会从远程服务器下载资源图片,所以他会有一些关于下载的事件,spriteSheet的on方法,表示监听事件,on方法的原型为:


complete事件

当精灵图片都加载完成后,会触发complete事件,示例代码如下:

spriteSheet.on("complete", function(event) {
    console.log("Complete", event);
});

error错误事件

当图像遇到错误时调度。SpriteSheet将为遇到错误的每个图像调度一个错误事件,并且 即使所有图像都已处理完毕,一旦所有图像完成处理后,SpriteSheet仍将调度一个完整事件。

spriteSheet.on("error", function(event) {
    console.log("Error", event);
});

createjs.Sprite函数创建精灵对象

createjs.Sprite函数通过精灵表(spriteSheet)来创建一个精灵对象,createjs.Sprite函数的原型是:

Sprite ( spriteSheet  [frameOrAnimation] )
  • spriteSheet: 表示精灵表,通过精灵表对象创建精灵动画Sprite
  • [frameOrAnimation] 是字串|编号类型,可选参数,表示最初播放的帧号或动画名字。

了解了这个函数,我们来创建一个精灵grant,代码如下:

var grant = new createjs.Sprite(spriteSheet, "run");
grant.x = stage.canvas.width / 2;
grant.y = 22;
stage.addChild(grant);
  • 首先创建了grant对象
  • 然后通过设置grant的x和y坐标,把这个精灵放在的舞台的中间位置
  • stage.addChild(grant)表示把grant对象加入到舞台,这样就能显示在舞台上了。