微信小程序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 相关文章推荐
asp 的 分词实现代码
May 24 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
JS网页在线获取鼠标坐标值的方法
Feb 28 Javascript
javascript 动态修改css样式方法汇总(四种方法)
Aug 27 Javascript
数据结构中的各种排序方法小结(JS实现)
Jul 23 Javascript
Javascript发送AJAX请求实例代码
Aug 21 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
Jun 17 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实现单例模式最安全的做法
2014/06/13 PHP
初识PHP
2014/09/28 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP错误机制知识汇总
2016/03/24 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
Convert Seconds To Hours
2007/06/16 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
js实现拖拽效果
2015/02/12 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python简单的函数定义和用法实例
2015/05/07 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
Python实现括号匹配方法详解
2020/02/10 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
机械工程师的岗位职责
2013/11/17 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
违纪开除通知书
2015/04/25 职场文书
防汛通知
2015/04/25 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python