博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Canvas在超级玛丽游戏中的应用详解
阅读量:2352 次
发布时间:2019-05-10

本文共 2451 字,大约阅读时间需要 8 分钟。

在上一篇文章中, 我们基于DOM体系构建了超级玛丽, 那么在本篇文章中我们使用canvas对整个架构进行升级, 从而提升游戏的视觉体验。 有需要的同学可以查看 源码 学习.

线上体验地址

考虑到有些同学对canvas不是很熟悉。本文将会对canvas的一些基础做一些大致的讲解。

canvas基础知识

画布元素
canvas标签可以让我们能够使用JavaScript在网页上绘制各种样式的图形。要访问实际的绘图接口, 首先我们需要创建一个上下文(context), 它是一个对象, 提供了绘图的接口。目前有两种广受绘图的样式: 用于二维图形的”2d“以及通过 OpenGL 接口的三维图形的 webgl 。

比如, 我们可以使用 <canvas /> DOM元素上的 getContext 方法创建上下文。

1

2
3
4
5
6
7
8
9
<body>
  <canvas width="500" height="500" />
</body>
<script>
  let canvas = document.querySelector('canvas');
  let context = canvas.getContext('2d');
  context.fillStyle = "yellow";
  context.fillRect(10, 10, 400, 400);
</script>

我们绘制了一个宽度和高度都为400像素的黄色正方形, 并且其左上角顶点处的坐标为(10, 10)。canvas的坐标系(0, 0)在其左上角.

边框的绘制

在画布的接口中, fillRect 方法用于填充矩形。 fillStyle 用于控制填充形状的方法。比如

单色

1

context.fillStyle = "yellow";
渐变色

1

2
3
4
5
6
7
let canvas = document.querySelector('canvas');
let context = canvas.getContext('2d');
let grd = context.createLinearGradient(0,0,170,0);
grd.addColorStop(0,"black");
grd.addColorStop(1,"red");
context.fillStyle = grd;
context.fillRect(10, 10, 400, 400);
pattern图案对象

1

2
3
4
5
6
7
8
9
let canvas = document.querySelector('canvas');
let context = canvas.getContext('2d');
let img = document.createElement('img');
img.src = "https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3112798566,2640650199&fm=26&gp=0.jpg";
img.onload = () => {
  let pattern = context.createPattern(img, 'no-repeat');
  context.fillStyle = pattern;
  context.fillRect(10,10,400,400)
}
strokeStyle属性与fillStyle属性类似, 但是 strokeStyle 作用与描边线的颜色。线条的宽度由 lineWidth 属性决定。

比如我想绘制一个边框宽度为6的黄色正方形。

1

2
3
4
5
let canvas = document.querySelector('canvas');
let context = canvas.getContext('2d');
context.strokeStyle = "yellow";
context.lineWidth = 6;
context.strokeRect(10,10, 400, 400);
路径
路径是很多线条的组合。如果想要绘制各种各样的形状,我们会频繁用到 moveTo 和 lineTo 两个函数。

1

2
3
4
5
6
7
8
9
let canvas = document.querySelector('canvas');
let context = canvas.getContext('2d');
context.beginPath();
for (let index = 0; index < 400; index+=10) {
  context.moveTo(10, index);
  context.moveTo(index, 0);
  context.lineTo(390, index);
}
context.stroke();
moveTo 表示我们当前画笔起点的位置, lineTo 表示我们画笔从起点到终点的连线。以上代码执行后就是如下所示:

当然我们可以为线条绘制的图形进行填充。

1

2
3
4
5
6
7
8
let canvas = document.querySelector('canvas');
let context = canvas.getContext('2d');
context.beginPath();
context.moveTo(50, 10);
context.lineTo(10, 70);
context.lineTo(90, 70);
context.fill();
context.closePath();
绘制图片
在计算机图形学中, 通常需要对矢量图形和位图图形进行区分。 矢量图形是指: 通过给出形状的逻辑来描述指定的图片。而位图图形是指使用像素数据, 而不指定实际形状。

转载地址:http://jxevb.baihongyu.com/

你可能感兴趣的文章
《剑指offer》思路与实现总结--Java
查看>>
字符串数组转成矩阵
查看>>
VC++ UDP转TCP互发数据 UDP为服务端 TCP为客户端 可修改IP和端口最小化 2TCP/UDP中转
查看>>
仿养生网 帝国CMS 更新后域名栏目链接一直没变 解决方法:在后台地图--模板标签替换里直接全部替换
查看>>
微信扫码自动群发消息给所有人技术分析 之通过https请求获取微信网页版登录二维码图
查看>>
C#源码刷新网页 最小化托盘http get和post请求配置保存版权时间限制定时调用 单实例运行,如果已经运行则激活窗口到最前显示
查看>>
域名解密 商家联盟会员消费管理系统_连锁店会员积分系统 带微信(域名加密的) aqinxiaodian
查看>>
android蓝牙4.0BLE及2.0 2.1 apk 串口助手带16个自定义按键和自定义指令 字符接收 十六进制或字符发送
查看>>
爬虫采集 通用正则表达式
查看>>
织梦学习 变量的运用 添加新变量 删除新变量 添加上传视频mp4
查看>>
CocosCreator+VS2017提示“要求的 VS 版本:[2013, 2015, 2017]”解决办法 无法找到 v140_xp 的生成工具
查看>>
助学贷款系统导入预申请时问题解决办法汇总
查看>>
FTP连接阿里云不能获得列表目录等功能,能连接,21端口也打开了。原因FTP是双向的,阿里云入出方向安全组规则必须添加本地随机端口
查看>>
读书程序标准化建模--高效阅读学习,越学越有劲/趣
查看>>
不翻qiang搞定Android Studio Google库加载不下来的问题 打包生成apk android studio 3.2打灰机程序源码带详细注释
查看>>
仿照利用android系统源码资源文件,修改SeekBar颜色 前景与背景
查看>>
printf及String.format格式化测试
查看>>
android java 经典字符模式通信接收处理,标准modbus通讯协议接收处理提取数据
查看>>
10055自动进刀水钻机android蓝牙2.0SSP项目源码结构使用说明【版本更新、自动连接、控件批量处理、接收解析】
查看>>
Android Studio导入项目时常见问题的解决汇总,Eclipse项目转为Android Studio项目步骤报错万能解决方法汇总
查看>>