微信小程序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 相关文章推荐
网页禁用右键实现代码(JavaScript代码)
Oct 29 Javascript
node.js中的fs.readFileSync方法使用说明
Dec 15 Javascript
简介JavaScript中fixed()方法的使用
Jun 08 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
js实现文字超出部分用省略号代替实例代码
Sep 01 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
Cpage.js给组件绑定事件的实现代码
Aug 31 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
vue.js自定义组件directives的实例代码
Nov 09 Javascript
vue ajax 拦截原理与实现方法示例
Nov 29 Javascript
vue项目创建步骤及路由router
Jan 14 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和ACCESS写聊天室(二)
2006/10/09 PHP
解决中英文字符串长度问题函数
2007/01/16 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
简单的js表单验证函数
2013/10/28 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python实现批量下载图片的方法
2015/07/08 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
python实现对输入的密文加密
2019/03/20 Python
最小二乘法及其python实现详解
2020/02/24 Python
python爬虫---requests库的用法详解
2020/09/28 Python
python时间time模块处理大全
2020/10/25 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
大学生两会学习心得体会
2014/03/10 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python