微信小程序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 相关文章推荐
JS中处理与当前时间间隔的函数代码
May 23 Javascript
Javascript在IE和FireFox中的不同表现简析
Dec 03 Javascript
让元素在网页中可拖动示例代码
Aug 13 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
javascript实现捕捉键盘上按下的键
May 05 Javascript
JavaScript encodeURI 和encodeURIComponent
Dec 04 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
Oct 24 Javascript
JavaScript仿微博输入框效果(案例分析)
Dec 06 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
如何利用javascript接收json信息并进行处理
Aug 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扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP5.3新特性小结
2016/02/14 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python random模块常用方法
2014/11/03 Python
tornado 多进程模式解析
2018/01/15 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
详解Python装饰器
2019/03/25 Python
Python之指数与E记法的区别详解
2019/11/21 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
买房协议书
2014/04/11 职场文书
学校三节实施方案
2014/06/09 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
Python中基础数据类型 set集合知识点总结
2021/08/02 Python