从微信小程序到鸿蒙JS开发-canvas&stack&2048
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com
- 作者:Chris来源:鸿蒙社区|2021-02-23 12:23
春节在家回看了张荣超老师的“从零开发鸿蒙小游戏APP“直播课(https://harmonyos.51cto.com/activity/17),听完后在手机设备上完善了功能并实现了一个简单的2048小游戏。这其中涉及到canvas和stack组件,在此做一些笔记。效果图:
1、canvas组件
画布组件,微信小程序也有,可以在其中动态绘制图形和文字等。在2048游戏中,不同的数字对应的背景颜色都不同,如果使用动态样式,判断和渲染对性能的要求会很高。
- <canvas class="content" id="canvas" onswipe="swipeGrids"></canvas>
1.1 获取绘图上下文
组件给定id或者ref,即可在js中获取组件绘图上下文,通过获取的CanvasRenderingContext2D对象进行绘图。官方文档提及获取绘图上下文的操作不支持在onInit和onReady中进行调用,经实验如在onInit()中执行应用将白屏,在onReady()中执行画布中的内容将无法被绘制,故需写在onShow()中。
- // 绘图对象
- var canvas;
- export default {
- data: {
- ...
- },
- onShow() {
- canvas = this.$element("canvas").getContext("2d");
- // 绘图
- this.drawGrids();
- },
- ...
- }
对于会在多个方法之内使用的全局变量,可以写在data中,也可以写在export之外。对于无需在页面中绑定的数据,写在export外或许可以提高一点性能。
1.2 监听滑动事件
在画布中滑动的事件绑定是通过onswipe属性,这个在官方文档中没有说明,但是IDE是有提示的。对于方法的入参,打日志后看出结构如下:
event.direction有四种取值:up/down/left/right,可用于判断滑动方向。
1.3 绘制矩形
- canvas.fillStyle = "#ffffff";
获取绘图上下文对象后,将其fillStyle属性设置为十六进制颜色即可设置本次绘图的颜色。也可使用createLinearGradient()给定渐变色,createPattern()创建填充模版。
- canvas.fillRect(leftTopX, leftTopY, gridWidth, gridWidth);
fillRect()方法用于绘制矩形,四个参数分别为左上角X坐标,左上角Y坐标,宽度,高度。
1.4 绘制文字
- canvas.font = "70px HYQiHei-65S";
- canvas.fillStyle = gridTxColors[gridVal];
font属性指定文字的大小和字体,fillStyle指定文字的颜色。
- canvas.fillText(text, leftBottomX, leftBottomY);
fillText()方法用于绘制文字,三个参数分别为文字内容,左下角X坐标,左下角Y坐标。这里后两个参数是左下角,和微信小程序以及刚才提到的fillRect()不同。
绘制2048格子及文字的方法:
- // 绘制格子 grids:存储数字的二维数组; gridBgColors:存储格子背景色的对象; gridTxColors:存储文字颜色的对象
- drawGrids() {
- for (let r = 0; r < 4; r++) {
- for (let c = 0; c < 4; c++) {
- let gridVal = grids[r][c].toString();
- // 绘制背景
- canvas.fillStyle = gridBgColors[gridVal];
- let leftTopX = c * (gridWidth + gridMargin) + gridMargin;
- let leftTopY = r * (gridWidth + gridMargin) + gridMargin;
- // 左上角x 左上角y 宽度 高度
- canvas.fillRect(leftTopX, leftTopY, gridWidth, gridWidth);
- // 绘制文字
- canvas.font = "70px HYQiHei-65S";
- if (gridVal != "0") {
- if (gridVal == "2" || gridVal == "4") {
- canvas.fillStyle = gridTxColors[gridVal];
- } else {
- canvas.fillStyle = gridTxColors["others"];
- }
- let offsetX = (4 - gridVal.length) * (gridWidth / 8);
- let offsetY = (gridWidth - fontSize) / 2;
- // 文字 左下角x 左下角y
- canvas.fillText(gridVal, leftTopX + offsetX, leftTopY + offsetY + fontSize - 5);
- }
- }
- }
- },
每次数字改变后,调用以上方法即可将2048的效果绘制出。
2、stack组件
这个组件很有意思,在stack中的子元素会顺序入栈,实现堆叠效果。一般都是通过z-index的样式实现,而鸿蒙这里的实现将数据结构的栈与页面层级相结合,非常巧妙。
在游戏结束时,提示文字将覆盖格子区域:
- <stack class="content">
- <canvas class="content" id="canvas" onswipe="swipeGrids"></canvas>
- <div show="{{ isEnd }}">
- <text>
- 游戏结束
- </text>
- </div>
- </stack>
事实上,鸿蒙js组件是不支持z-index样式的。
【编辑推荐】
点赞 0
- 大家都在看
- 猜你喜欢
编辑推荐
- 24H热文
- 一周话题
- 本月获赞
- 坐在马桶上看算法:快速排序太厉害了,终于有人能把TCP/IP协议讲的明明白白了!花了一个星期,我终于把RPC框架整明白了!图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)TIOBE 2月榜单出炉,编程语言世界在过去几年中没有改变?为什么CTO、技术总监、架构师都不写代码,还这么牛?凉凉,老板叫我开发一个简单的工作流引擎...面向对象编程是计算机科学的最大错误
- 太厉害了,终于有人能把TCP/IP协议讲的明明白白了!花了一个星期,我终于把RPC框架整明白了!2月编程语言排行榜已出,你看出这点了吗?图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)TIOBE 2月榜单出炉,编程语言世界在过去几年中没有改变?6种微服务RPC框架,你知道几个?五大自动化测试的Python框架终于有人把Elasticsearch原理讲透了!
- 太厉害了,终于有人能把TCP/IP协议讲的明明白白了!花了一个星期,我终于把RPC框架整明白了!图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)6种微服务RPC框架,你知道几个?TIOBE 2月榜单出炉,编程语言世界在过去几年中没有改变?五大自动化测试的Python框架2月编程语言排行榜已出,你看出这点了吗?坐在马桶上看算法:快速排序
订阅专栏+更多
-
数据湖与数据仓库的分析实践攻略
助力现代化数据管理:数据湖与数据仓库的分析实践攻略共3章 | 创世达人6人订阅学习
-
云原生架构实践
新技术引领移动互联网进入急速赛道共3章 | KaliArch34人订阅学习
-
数据中心和VPDN网络建设案例
漫画+案例共20章 | 捷哥CCIE221人订阅学习
视频课程+更多
-
Asp.Net网站开发技术及音乐网站项目实战
讲师:张晨光3325人学习过
-
FFmpeg4.3开发系列之三:流媒体直播基础理论
讲师:梅老师1060人学习过
-
软件测试全栈系列课程
讲师:陈槐2408人学习过
专题推荐+更多
- 精选博文
- 论坛热帖
-
订阅51CTO邮刊
点击这里查看样刊

51CTO服务号

51CTO官微