摘要:以后所有的文章都会第一时间更新到这里,然后同步到其他平台。获取画布的宽和高,后面计算使用定义静态资源人物动作雪碧图天空地面远山近山创建资源加载队列用还是用标签来加载如果是的时候,就用标签来加载,如果不能用标签的话,就用来加载。
写在前面
首先,还是谢谢大家的支持,谢谢!记得在之前的文章中我说过自己算是一个半文艺程序员,也一直想着写一写技术性和其他偏文学性的文章。虽然自己的底子没有多么优秀,但总是觉得这个过程中可以督促自己去思考,督促自己去学习和交流。毕竟每天忙忙碌碌之余,还是要活出自己不一样的生活。
其次,我开通了个人的 GitHub主页 ,里面有自己的技术文章,还会有个人的随想、思考和日志。以后所有的文章都会第一时间更新到这里,然后同步到其他平台。有喜欢的朋友可以没事去逛逛,再次感谢大家的支持!
什么是CreateJS官网介绍 (中文):CreateJS 是一组模块化代码库和工具套件,可以独立工作也可以组合工作,用于通过HTML5技术来在网页上开发丰富的交互式内容。
四个核心库
CreateJS主要包含如下四个类库:
EaselJS – 简化处理HTML5画布(核心)
TweenJS – 用来帮助设计H5动画,调整HTML5属性
SoundJS – 用来简化处理HTML5 audio 音频
PreloadJS – 帮助管理和协调加载中的一些资源
今天,主要来了解一下 EaselJS 库
EaselJS EaselJS 简介EaselJS 是一个JavaScript库,用来简单快捷的操作 HTML5 Canvas 标签。在创建H5游戏,生成艺术作品、处理其他高级图形化等工作中有着很友好的体验。
EaselJS中的一些核心类
Stage Class -- 创建舞台
Text Class -- 绘制文字
Graphics Class -- 绘制图形
Shape Class -- 绘制图形
Bitmap Class -- 绘制图片
Ticker Class -- 定时广播
......等
一些"栗子" 绘制文本(Text Class)定义一个 画布。
// HTML:
调用EaselJS提供的API - new createjs.Text(),绘制文字
// JS
绘制图形(Graphics Class)
定义一个 画布。
// HTML:
调用EaselJS提供的API - new createjs.Graphics(),绘制图形
// JS
绘制图像imgaes(Bitmap Class)
定义一个 画布。
// HTML:
调用EaselJS提供的API - new createjs.Bitmap(),绘制图像
// JS
一个小游戏(来自官网Demo) Running man
定义一个画布
<span class="http"><span class="undefined">running-man game</span></span>
JS代码
这里就不写具体思路分析了,代码不长,注释也很详细,方便理解,直接上代码。
// JS
- window.onload = () => {
- let stage, w, h, loader;
- let sky, grant, ground, hill, hill2;
- function init() {
- stage = new createjs.StageGL("demoCanvas");
- // 获取画布的宽和高,后面计算使用
- w = stage.canvas.width; // 960
- h = stage.canvas.height; // 400
- // 定义静态资源
- let manifest = [{
- src: "spritesheet_grant.png", id: "grant"}, { // 人物动作雪碧图
- src: "sky.png", id: "sky"}, { // 天空
- src: "ground.png", id: "ground"}, { // 地面
- src: "hill1.png", id: "hill"}, { // 远山
- src: "hill2.png", id: "hill2" // 近山
- }]; // Array, String, Object
-
- // 创建资源加载队列
- // (Boolean) 用XHR还是用HTML标签来加载
- // 如果是false的时候,就用标签来加载,如果不能用标签的话,就用XHR来加载。默认是true,用XHR来加载。
- loader = new createjs.LoadQueue(false);
- // 添加"资源加载完成"事件
- loader.addEventListener("complete", handleComplete);
- // 加载资源
- loader.loadManifest(manifest, true, "./assets/img/"); // (manifest, loadNow, basePath)
- }
- /**
- * 静态资源加载完成,处理函数
- */
- function handleComplete() {
- // 渲染天空
- sky = new createjs.Shape();
- sky.graphics.beginBitmapFill(loader.getResult("sky")).drawRect(0, 0, w, h);
- // 定义缓存区域(整个天空的区域))
- sky.cache(0, 0, w, h);
- // 渲染地面
- let groundImg = loader.getResult("ground");
- ground = new createjs.Shape();
- // 注意:drawRect()宽度要躲绘制一个单位
- ground.graphics.beginBitmapFill(groundImg).drawRect(0, 0, w + groundImg.width, groundImg.height);
- ground.tileW = groundImg.width;
- ground.y = h - groundImg.height;
- // 缓存区域(地面的区域)
- ground.cache(0, 0, w + groundImg.width, groundImg.height);
- // 随机渲染远处山脉
- hill = new createjs.Bitmap(loader.getResult("hill"));
- // 设置图像转换
- // setTransform([x=0], [y=0], [scaleX=1], [scaleY=1], [rotation=0], [skewX=0], [skewY=0], [regX=0], [regY=0])
- hill.setTransform(Math.random() * w, h - hill.image.height * 4 - groundImg.height, 4, 4);
- hill.alpha = 0.5; // 设置透明度
- // 随机渲染近处山脉
- hill2 = new createjs.Bitmap(loader.getResult("hill2"));
- hill2.setTransform(Math.random() * w, h - hill2.image.height * 3 - groundImg.height, 3, 3);
- // 创建雪碧图动画
- let spriteSheet = new createjs.SpriteSheet({
- framerate: 30, // 帧率 FPS
- "images": [loader.getResult("grant")], // 雪碧图原图
- "frames": {"width": 165, "height": 292, "count": 64, "regX": 82, "regY": 0}, // 初始化
- // 定义动画
- "animations": {
- "run": [0, 25, "run"], // name: [开始索引, 结束索引, "下一个动画名称", 倍率]
- "jump": [26, 63, "run"]
- }
- });
- // 绘制动画
- grant = new createjs.Sprite(spriteSheet, "run");
- // 处理雪碧图人物下方空白
- grant.y = 35;
- // 将生成的所有内容渲染至舞台
- stage.addChild(sky, ground, hill, hill2, grant);
- // 监听舞台上的鼠标点击事件
- stage.addEventListener("stagemousedown", () => {
- // 跳转播放 jump 动画
- grant.gotoAndPlay("jump");
- });
- createjs.Ticker.timingMode = createjs.Ticker.RAF; // RAF / RAF_SYNCHED / TIMEOUT
- createjs.Ticker.addEventListener("tick", tick);
- }
- /**
- * 定时器-重绘舞台
- */
- function tick(event) {
- // event.delta -- 上一次tick到当前tick的ms
- let deltaS = event.delta / 1000;
- // 雪碧图人物移动距离
- let position = grant.x + 150 * deltaS;
- // getBounds() -- 返回当前帧相对于雪碧图原点的边界
- let grantW = grant.getBounds().width * grant.scaleX;
- grant.x = (position >= w + grantW) ? -grantW : position;
- ground.x = (ground.x - deltaS * 150) % ground.tileW;
- // 从右至左移动山脉
- hill.x = (hill.x - deltaS * 30);
- // 如果山脉从左侧离开屏幕
- if (hill.x + hill.image.width * hill.scaleX <= 0) {
- hill.x = w; // 重置回屏幕最右侧
- }
- // 处理如上
- hill2.x = (hill2.x - deltaS * 45);
- if (hill2.x + hill2.image.width * hill2.scaleX <= 0) {
- hill2.x = w;
- }
- stage.update();
- }
- // 程序主入口-初始化
- init()
- }
完整代码
</>code
示例demo的GitHub地址:完整代码
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/96241.html
摘要:以后所有的文章都会第一时间更新到这里,然后同步到其他平台。获取画布的宽和高,后面计算使用定义静态资源人物动作雪碧图天空地面远山近山创建资源加载队列用还是用标签来加载如果是的时候,就用标签来加载,如果不能用标签的话,就用来加载。 写在前面 首先,还是谢谢大家的支持,谢谢!记得在之前的文章中我说过自己算是一个半文艺程序员,也一直想着写一写技术性和其他偏文学性的文章。虽然自己的底子没有多么优...
摘要:源码以及资源地址下载链接密码首先,打开文件,可以看到库里面有几个待使用的元件我们先用软件自带的发布功能发布一下快捷键也可以在文件里选择发布发布后在文件旁边会有一个和一个我们打开可以看到这样的代码片段我们新建一个,把生成的部分的代 源码以及资源地址下载:链接: http://pan.baidu.com/s/1kU8LBTH 密码: j7hu 首先,打开flash文件,可以看到库里面有几个...
摘要:源码以及资源地址下载链接密码首先,打开文件,可以看到库里面有几个待使用的元件我们先用软件自带的发布功能发布一下快捷键也可以在文件里选择发布发布后在文件旁边会有一个和一个我们打开可以看到这样的代码片段我们新建一个,把生成的部分的代 源码以及资源地址下载:链接: http://pan.baidu.com/s/1kU8LBTH 密码: j7hu 首先,打开flash文件,可以看到库里面有几个...
阅读 1187·2021-11-23 09:51
阅读 1158·2021-10-18 13:31
阅读 3159·2021-09-22 16:06
阅读 4458·2021-09-10 11:19
阅读 2269·2019-08-29 17:04
阅读 525·2019-08-29 10:55
阅读 2629·2019-08-26 16:37
阅读 3467·2019-08-26 13:29