微信小程序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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
jQuery针对各类元素操作基础教程
Aug 29 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
纯css下拉菜单 无需js
Aug 15 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
Bootstrap导航简单实现代码
Mar 06 Javascript
在Mac下彻底卸载node和npm的方法
May 16 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
Nov 14 Javascript
微信小程序制作表格的方法
Feb 14 Javascript
微信小程序 调用微信授权窗口相关问题解决
Jul 25 Javascript
解决layui弹框失效的问题
Sep 09 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
通过Email发送PHP错误的方法
2015/07/20 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
js数组操作常用方法
2014/05/08 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python决策树分类算法学习
2017/12/22 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
用Python实现读写锁的示例代码
2018/11/05 Python
python 如何区分return和yield
2020/09/22 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
个人简历的自荐信
2013/10/23 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
企业财务管理制度范本
2015/08/04 职场文书
聘用合同范本
2015/09/21 职场文书
python编写函数注意事项总结
2021/03/29 Python
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
一行Python命令实现批量加水印
2022/04/07 Python
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js