微信小程序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 相关文章推荐
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
Jan 16 Javascript
js内置对象 学习笔记
Aug 01 Javascript
jQuery事件 delegate()使用方法介绍
Oct 30 Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
任意Json转成无序列表的方法示例
Dec 09 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
浅谈react.js中实现tab吸顶效果的问题
Sep 06 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
Aug 31 Javascript
Node批量爬取头条视频并保存方法
Sep 20 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错误、异常处理机制(补充)
2012/05/07 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
Python查询IP地址归属完整代码
2017/06/21 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
Python的UTC时间转换讲解
2019/02/26 Python
python导入坐标点的具体操作
2019/05/10 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
跳槽求职信范文
2014/05/26 职场文书
党代会心得体会
2014/09/04 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
Redis高可用集群redis-cluster详解
2022/03/20 Redis