CreateJS 综合教程:从入门到精通
目录
-
(图片来源网络,侵删)- 简介
- 核心优势
- 适用场景
-
- 引入 CreateJS 库
- 创建 HTML 画布
- 初始化 Stage 和 Shape
- 完整示例:画一个矩形
-
Stage(舞台):一切表演的地方Container(容器):对象的组织者DisplayObject(显示对象):所有可见事物的基类Shape(形状):绘制矢量图形Bitmap(位图):显示图片Text(文本):显示文字Sprite(精灵):实现动画的利器Ticker(心跳/事件循环):让动起来的核心
-
on()方法:添加事件监听- 常用事件类型:
click,mousedown,pressmove,mouseover等 - 示例:可拖拽的方块
-
(图片来源网络,侵删)Tween类:实现补间动画Tween.get()和to()方法Ease类:让动画更自然- 示例:平滑移动的球
-
- 游戏设计思路
- 步骤分解:创建场景、添加地鼠、实现点击、计分
- 完整代码
-
- 命名空间与模块化
- 性能优化建议
- 官方资源与学习路径
第一部分:CreateJS 是什么?为什么选择它?
简介
CreateJS 是一个用于创建富交互的 HTML5 内容的 JavaScript 库套件,它不是单一的库,而是由几个独立但可协同工作的库组成,主要包括:
- EaselJS: 用于处理图形、显示列表和用户交互的 2D 图形引擎,这是 CreateJS 的核心,也是我们教程的重点。
- TweenJS: 用于创建平滑的动画和过渡效果。
- SoundJS: 用于处理音频的加载和播放。
- PreloadJS: 用于管理和协调资源(如图像、声音、数据)的加载。
核心优势
- 基于标准: 使用 HTML5 的
<canvas>元素,兼容现代浏览器。 - API 友好: 设计上借鉴了 Adobe Flash 的 DisplayList 模型,对于有 Flash 开发经验的开发者非常友好,易于上手。
- 功能强大: 提供了丰富的图形绘制、动画、事件处理等功能,足以应对大多数 2D 游戏和动画需求。
- 高性能: 经过高度优化,能够高效地渲染大量对象。
- 生态完善: 拥有官方的图形编辑器 CreateJS Toolkit,可以方便地导出精灵动画等资源。
适用场景
- HTML5 小游戏: 如打地鼠、贪吃蛇、卡牌游戏等。
- 交互式广告: 富有创意和吸引力的广告横幅。
- 数据可视化: 将枯燥的数据以生动、交互式的图表形式展示。
- 教育应用: 制作互动课件和模拟实验。
第二部分:环境搭建与第一个项目
引入 CreateJS 库
最简单的方式是通过 CDN(内容分发网络)引入,在你的 HTML 文件的 <head> 标签内添加以下链接:

<!-- 引入 EaselJS 库 --> <script src="https://code.createjs.com/1.0.0/easeljs.min.js"></script>
创建 HTML 画布
在 <body> 中创建一个 <canvas> 元素,并给它一个 id,方便我们通过 JavaScript 获取它。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">CreateJS Hello World</title>
<script src="https://code.createjs.com/1.0.0/easeljs.min.js"></script>
</head>
<body>
<canvas id="gameCanvas" width="800" height="600" style="border: 1px solid black;"></canvas>
<script>
// 我们的所有 JavaScript 代码将写在这里
</script>
</body>
</html>
初始化 Stage 和 Shape
- 获取 Canvas 元素:使用
document.getElementById。 - 创建 Stage:将 Canvas 元素传递给
new createjs.Stage(),创建舞台实例。 - 创建 Shape:
new createjs.Shape()是一个用于绘制矢量图形的对象。 - :使用 Shape 的
graphics属性来调用绘图方法(如beginFill,drawRect)。 - 添加到舞台:使用
stage.addChild()将 Shape 对象添加到舞台上。 - 更新舞台:调用
stage.update(),将所有绘制操作渲染到 Canvas 上。
完整示例:画一个矩形
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">My First CreateJS App</title>
<script src="https://code.createjs.com/1.0.0/easeljs.min.js"></script>
</head>
<body>
<canvas id="gameCanvas" width="800" height="600" style="border: 1px solid black;"></canvas>
<script>
// 1. 获取 Canvas 元素
const canvas = document.getElementById("gameCanvas");
// 2. 创建舞台
const stage = new createjs.Stage(canvas);
// 3. 创建一个 Shape 对象
const rect = new createjs.Shape();
// 4. 使用 graphics 属性绘制一个红色矩形
rect.graphics.beginFill("Red");
rect.graphics.drawRect(0, 0, 100, 100); // (x, y, width, height)
// 5. 将矩形添加到舞台中央
rect.x = canvas.width / 2 - 50; // 矩形宽度的一半,使其居中
rect.y = canvas.height / 2 - 50; // 矩形高度的一半,使其居中
stage.addChild(rect);
// 6. 更新舞台,显示所有内容
stage.update();
</script>
</body>
</html>
将以上代码保存为 .html 文件,用浏览器打开,你就能看到一个红色的方块居中显示在画布上。
第三部分:核心概念详解
Stage (舞台)
Stage 是所有显示对象的最终容器,也是所有渲染发生的地方,它对应着 HTML5 的 <canvas> 元素,你所有的对象都必须先添加到 Stage(或其子容器)上才能被看到。
Container (容器)
Container 是一种特殊的 DisplayObject,它可以像文件夹一样组织其他的 DisplayObject,当你移动或旋转一个 Container 时,它内部的所有子对象也会跟着移动和旋转,这对于管理游戏中的角色、UI 界面等非常有用。
const container = new createjs.Container(); stage.addChild(container); // 现在可以把对象添加到 container,而不是直接添加到 stage container.addChild(shape1, shape2);
DisplayObject (显示对象)
DisplayObject 是所有可见元素的基类,它定义了所有对象共有的属性和方法,如:
x,y: 位置scaleX,scaleY: 缩放rotation: 旋转alpha: 透明度 (0-1)visible: 是否可见
Shape, Bitmap, Text, Container 等都是 DisplayObject 的子类。
Shape (形状)
用于绘制矢量图形,如矩形、圆形、多边形等,通过其 graphics 属性进行绘制。
const circle = new createjs.Shape();
circle.graphics.beginFill("DeepSkyBlue");
circle.graphics.drawCircle(0, 0, 50); // (centerX, centerY, radius)
circle.x = 200;
stage.addChild(circle);
Bitmap (位图)
用于显示图片,你需要先加载一张图片,然后将其传递给 Bitmap 构造函数。
const img = new Image();
img.src = "path/to/your/image.png";
img.onload = function() {
const bitmap = new createjs.Bitmap(img);
bitmap.x = 400;
stage.addChild(bitmap);
stage.update();
};
Text (文本)
用于在画布上渲染文字。
const text = new createjs.Text("Hello CreateJS!", "36px Arial", "#000000");
text.x = 100;
text.y = 100;
stage.addChild(text);
Sprite (精灵)
Sprite 用于实现基于帧的动画,它需要一个 精灵表(Sprite Sheet,即一张包含所有动画帧的大图)和相关的数据来定义每帧的位置和大小。
// 假设我们有一个精灵表和对应的JSON数据
const spriteSheet = new createjs.SpriteSheet({
images: ["character_walk.png"],
frames: {width: 64, height: 96, count: 8}, // 每帧64x96,共8帧
animations: {
walk: [0, 7] // 从第0帧到第7帧构成 "walk" 动画
}
});
const character = new createjs.Sprite(spriteSheet, "walk");
character.x = 300;
character.y = 200;
stage.addChild(character);
Ticker (心跳/事件循环)
Ticker 是 CreateJS 的核心定时器,它以固定的帧率(默认60fps)触发 tick 事件,所有的动画、游戏逻辑更新都应该在 tick 事件处理函数中进行。
// 添加 tick 事件监听
createjs.Ticker.addEventListener("tick", tickHandler);
function tickHandler(event) {
// 在这里更新对象的状态,例如移动、旋转等
// rect.x += 1;
// 更新舞台以显示变化
stage.update();
}
第四部分:交互与事件处理
CreateJS 使用事件模型来处理用户交互,与 DOM 事件类似。
on() 方法
使用 on() 方法为显示对象添加事件监听器。
rect.on("click", function(event) {
console.log("矩形被点击了!");
// 点击后改变颜色
this.graphics.clear().beginFill("Green").drawRect(0, 0, 100, 100);
stage.update(); // 更新舞台以显示颜色变化
});
"click": 事件类型。function(event): 事件触发时执行的回调函数。this: 在回调函数中,this指向触发事件的显示对象(即rect)。
常用事件类型
click: 鼠标单击。mousedown: 鼠标按下。mouseup: 鼠标松开。pressmove: 当鼠标在对象上按下并拖动时持续触发,非常适合实现拖拽功能。pressup: 当鼠标在对象上按下后松开时触发。mouseover: 鼠标移入对象区域。mouseout: 鼠标移出对象区域。
示例:可拖拽的方块
// ... (初始化 stage 和 rect 的代码)
// 设置鼠标启用,否则无法接收事件
rect.mouseEnabled = true;
rect.on("pressmove", function(event) {
// event.currentTarget 是当前事件的目标对象,等同于 this
// event.stageX 和 event.stageY 是鼠标在舞台上的坐标
this.x = event.stageX - this.getBounds().width / 2;
this.y = event.stageY - this.getBounds().height / 2;
// 由于位置改变,需要更新舞台
stage.update();
});
第五部分:动画与缓动
TweenJS 库让创建平滑的动画变得异常简单。
Tween 类
通过 createjs.Tween.get() 开始一个补间动画,然后使用 .to() 定义目标属性和持续时间。
Tween.get() 和 to() 方法
createjs.Tween.get(target): 指定要动画的对象。.to(properties, duration, ease): 定义动画的终点。properties: 一个对象,包含要改变的属性(如{x: 500, y: 300, alpha: 0})。duration: 动画持续时间,单位是毫秒。ease: 缓动函数,让动画更自然(如createjs.Ease.quadIn)。
Ease 类
Ease 类提供了多种预设的缓动效果,如:
createjs.Ease.linear: 线性(匀速)。createjs.Ease.quadIn: 二次缓入(先慢后快)。createjs.Ease.quadOut: 二次缓出(先快后慢)。createjs.Ease.elasticOut: 弹性缓出。
示例:平滑移动的球
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">CreateJS Tween Animation</title>
<script src="https://code.createjs.com/1.0.0/easeljs.min.js"></script>
<script src="https://code.createjs.com/1.0.0/tweenjs.min.js"></script>
</head>
<body>
<canvas id="gameCanvas" width="800" height="600" style="border: 1px solid black;"></canvas>
<script>
const canvas = document.getElementById("gameCanvas");
const stage = new createjs.Stage(canvas);
const ball = new createjs.Shape();
ball.graphics.beginFill("Orange").drawCircle(0, 0, 30);
ball.x = 50;
ball.y = 300;
stage.addChild(ball);
// 创建一个循环动画
createjs.Tween.get(ball, {loop: true})
.to({x: 750, y: 100}, 2000, createjs.Ease.quadOut) // 2秒内移动到 (750, 100),使用缓出效果
.to({x: 50, y: 500}, 2000, createjs.Ease.quadIn) // 再用2秒移动到 (50, 500),使用缓入效果
.to({x: 400, y: 300}, 2000, createjs.Ease.bounceOut); // 最后2秒弹跳回中心
// 我们不需要在 Ticker 中更新,因为 Tween 会自动处理
// 但如果需要其他逻辑,可以加上 Ticker
createjs.Ticker.addEventListener("tick", stage);
</script>
</body>
</html>
第六部分:实战案例:一个简单的打地鼠游戏
游戏设计思路
- 一个网格布局的“洞”。
- 地鼠会随机从某个洞里冒出。
- 玩家点击地鼠,得分增加。
- 地鼠在一段时间后自动消失。
步骤分解
准备资源 你需要一张地鼠的图片(PNG,带透明背景)。
创建 HTML 和基本舞台
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">Whack-a-Mole</title>
<script src="https://code.createjs.com/1.0.0/easeljs.min.js"></script>
<script src="https://code.createjs.com/1.0.0/tweenjs.min.js"></script>
<style> body { margin: 0; } </style>
</head>
<body>
<h1>Score: <span id="score">0</span></h1>
<canvas id="gameCanvas" width="800" height="600"></canvas>
<script src="game.js"></script>
</body>
</html>
编写 game.js 逻辑
// game.js
const canvas = document.getElementById("gameCanvas");
const stage = new createjs.Stage(canvas);
const scoreText = document.getElementById("score");
// 游戏配置
const GRID_COLS = 3;
const GRID_ROWS = 3;
const MOLE_IMAGE_URL = "mole.png"; // 替换为你的图片路径
const GAME_SPEED = 1500; // 地鼠出现的间隔
let score = 0;
let moles = [];
let gameInterval;
// 预加载图片
const preloadQueue = new createjs.LoadQueue();
preloadQueue.on("fileload", handleFileLoad, this);
preloadQueue.on("complete", handleComplete, this);
preloadQueue.loadFile({id: "mole", src: MOLE_IMAGE_URL});
function handleFileLoad(event) {
// 图片加载完成,可以在这里做一些初始化
}
function handleComplete() {
// 创建游戏网格
createGrid();
// 开始游戏循环
startGame();
// 设置舞台更新
createjs.Ticker.addEventListener("tick", stage);
}
function createGrid() {
const cellWidth = canvas.width / GRID_COLS;
const cellHeight = canvas.height / GRID_ROWS;
for (let row = 0; row < GRID_ROWS; row++) {
for (let col = 0; col < GRID_COLS; col++) {
const hole = new createjs.Shape();
hole.graphics.beginFill("SaddleBrown").drawRoundRect(10, 10, cellWidth - 20, cellHeight - 20, 20);
hole.x = col * cellWidth;
hole.y = row * cellHeight;
stage.addChild(hole);
// 创建地鼠,初始时不可见
const mole = new createjs.Bitmap(preloadQueue.getResult("mole"));
mole.regX = mole.image.width / 2; // 设置注册点为中心
mole.regY = mole.image.height / 2;
mole.x = hole.x + cellWidth / 2;
mole.y = hole.y + cellHeight / 2;
mole.visible = false;
mole.scaleX = mole.scaleY = 0; // 初始缩放为0,即看不见
// 添加点击事件
mole.on("click", whackMole);
stage.addChild(mole);
moles.push(mole);
}
}
}
function showRandomMole() {
const availableMoles = moles.filter(m => !m.visible);
if (availableMoles.length > 0) {
const randomMole = availableMoles[Math.floor(Math.random() * availableMoles.length)];
// 让地鼠出现
randomMole.visible = true;
createjs.Tween.get(randomMole)
.to({scaleX: 1, scaleY: 1}, 300, createjs.Ease.backOut) // 弹出效果
.wait(1000) // 停留1秒
.to({scaleX: 0, scaleY: 0}, 300, createjs.Ease.backIn) // 缩回去
.call(() => { randomMole.visible = false; }); // 动画结束后隐藏
}
}
function whackMole(event) {
// 如果地鼠正在缩放回去,则不能再点击
if (event.target.scaleX < 0.9) return;
score++;
scoreText.textContent = score;
// 立即让地鼠消失
createjs.Tween.get(event.target).to({scaleX: 0, scaleY: 0}, 100, createjs.Ease.backIn)
.call(() => { event.target.visible = false; });
}
function startGame() {
// 每隔 GAME_SPEED 毫秒显示一只地鼠
gameInterval = setInterval(showRandomMole, GAME_SPEED);
}
function stopGame() {
clearInterval(gameInterval);
}
// 可以添加一个停止游戏的逻辑,
// window.addEventListener("keydown", (e) => {
// if (e.key === "Escape") {
// stopGame();
// }
// });
第七部分:进阶与资源
命名空间与模块化
CreateJS 默认使用全局的 createjs 命名空间,对于大型项目,可能会造成全局污染,现代前端开发推荐使用模块化(如 ES6 Modules),你可以使用构建工具(如 Webpack)来打包 CreateJS,并将其作为模块引入。
性能优化建议
- 对象池: 对于频繁创建和销毁的对象(如子弹、粒子),使用对象池来复用它们,避免频繁的内存分配和垃圾回收。
- 减少不必要的
stage.update(): 不要在每一帧都无条件地调用stage.update(),只在确实有内容发生变化时调用,在Ticker事件中,通常只在最后调用一次stage.update()即可。 - 使用位图: 对于复杂的静态图形,绘制成一张位图比用
Shape多次绘制性能更好。 cache()方法: 对于不常变化的复杂显示对象,可以使用object.cache(x, y, width, height)将其缓存为一个位图,这会大大提升渲染性能。
官方资源与学习路径
- 官方文档: https://createjs.com/docs/ (最权威的参考资料)
- 官方示例: https://createjs.com/easeljs (包含大量可交互的示例代码)
- 官方工具: CreateJS Toolkit (一个基于 Adobe Animate (Flash) 的工具,用于导出精灵动画等)
- 社区: 搜索 "CreateJS tutorial" 可以找到很多优秀的第三方教程和视频。
希望这份详细的教程能帮助你顺利入门 CreateJS!祝你开发愉快!
