微信小程序canvas实现刮刮乐效果


Posted in Javascript onJuly 09, 2018

本文实例为大家分享了微信小程序实现刮刮乐效果的具体代码,供大家参考,具体内容如下

效果图

微信小程序canvas实现刮刮乐效果

设计流程

微信小程序canvas实现刮刮乐效果

设计思路

  1. canvas设置背景图,作为中奖图片;
  2. 在canvas上绘制刮的灰色涂层;
  3. 通过绑定的事件,清除对应区域的涂层;
  4. 最后判断涂层清除区域是否超过设置的可见百分比,如果超过则全部涂层清除,否则不清楚。

1、全局常量

获取用户传入的canvas的ID,设置的canvas的宽高,canvas涂层的颜色,清除当前坐标的半径和直径,计算当前清除的面积,全部清除百分比,canvas的面积。

constructor(page,opts){
 opts = opts || {};
 this.page = page;
 this.canvasId = opts.canvasId || 'luck';
 this.width = opts.width || 300;
 this.height = opts.height || 150;
 this.maskColor = opts.maskColor || '#dddddd';
 this.size = opts.size || 8;
 this.r = this.size * 2;
 this.area = this.r * this.r; 
 this.scale = opts.scale || 0.75;
 this.totalArea = this.width * this.height;

 this.init();
}

2、初始化全局变量

1、变量:判断清除全部涂层的布尔值,记录清除坐标的数组。
2、API:调用创建canvas绘图上下文API。
3、方法:调用涂层绘制函数,调用事件绑定函数。

init(){
 this.show = false;
 this.clearPoints = [];
 this.ctx = wx.createCanvasContext(this.canvasId, this);
 this.drawMask();
 this.bindTouch();
}

3、涂层绘制函数的实现

drawMask(){
 this.ctx.setFillStyle(this.maskColor);
 this.ctx.fillRect(0, 0, this.width, this.height);
 this.ctx.draw();
}

4、事件绑定函数的实现

1 、touchstart事件只是清除当前位置的坐标点半径的涂层。
2 、touchmove事件清除移动过程个坐标点半径内的涂层。
3 、touchend事件判断当前次清除是否超过总面积的75%,超过则全部清除,否则不做处理。

bindTouch(){
 const _this = this;
 _this.page.onTouchStart = function(e){
  _this.eraser(e,true);
 }
 _this.page.onTouchMove = function (e) {
  _this.eraser(e);
 }
 _this.page.onTouchEnd = function (e) {
  if(_this.show){
   _this.ctx.clearRect(0, 0, _this.width, _this.height);
   _this.ctx.draw();
  }
 }
}

5、eraser橡皮擦函数的实现

1、获取记录清除坐标点数组的长度,当前位置的x,y坐标,计算清除块的起点,声明计数变量。
2、判断是否是第一次进入,是则直接记录该坐标。
3、判断当前点在记录数组中是否存在,如果存在,直接返回,如果不存在,在记录入数组。
4、是否满足清除全部涂层,满足show赋值为true,不满足,直接清除当前坐标涂层。

eraser(e,bool){
  let len = this.clearPoints.length;
  let count = 0
  let x = e.touches[0].x, y = e.touches[0].y;
  let x1 = x - this.size;
  let y1 = y - this.size;
  if(bool){
   this.clearPoints.push({
    x1: x1,
    y1: y1,
    x2: x1 + this.r,
    y2: y1 + this.r
   })
  }
  for (let val of this.clearPoints){
   if(val.x1 > x || val.y1 > y || val.x2 < x || val.y2 < y){
    count++;
   }else{
    break;
   }
  }
  if(len === count){
   this.clearPoints.push({
    x1: x1,
    y1: y1,
    x2: x1 + this.r,
    y2: y1 + this.r
   })
  }
  if (this.clearPoints.length && this.r * this.r * this.clearPoints.length > this.scale * this.totalArea){
   this.show = true;
  }
  this.ctx.clearRect(x1, y1, this.r, this.r);
  this.ctx.draw(true);
 }

提供的其他实现思路

方法一:本文提供的方法是将中奖图片作为背景设置给canvas,然后清除canvas涂层来实现刮刮乐效果。
方法二:canvas绘制涂层,然后取图片在canvas相同坐标的像素,最后将该处图片像素绘制到canvas。
方法三:类似方法一,只是将背景直接用图片img.定位在canvas的下边。

总结

最重要的是判断清除涂层在总canvas面积的占有率记录,只要判断该坐标不在清除的范围,就可以记录该坐标。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
你需要知道的JavsScript可以做什么?
Jun 29 Javascript
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
Mar 29 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
js实现特定位取反原理及示例
Jun 30 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
详解vue 中使用 AJAX获取数据的方法
Jan 18 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 Javascript
基于rollup的组件库打包体积优化小结
Jun 18 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
Jul 09 #Javascript
js中Object.defineProperty()方法的不详解
Jul 09 #Javascript
微信小程序实现团购或秒杀批量倒计时
Nov 01 #Javascript
微信小程序实现倒计时补零功能
Jul 09 #Javascript
Angular6中使用Swiper的方法示例
Jul 09 #Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 #Javascript
微信小程序实现漂亮的弹窗效果
May 26 #Javascript
You might like
PHP新手上路(十四)
2006/10/09 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
php数组添加元素方法小结
2014/12/20 PHP
PHP5.3新特性小结
2016/02/14 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
JQuery球队选择实例
2015/05/18 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
Node对CommonJS的模块规范
2019/11/06 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
python 自定义对象的打印方法
2019/01/12 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
基于python实现坦克大战游戏
2020/10/27 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python中四舍五入的正确打开方式
2021/01/18 Python
电子商务个人职业生涯规划范文
2014/02/12 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2015年城市管理工作总结
2015/05/23 职场文书