本文實例為大家分享了微信小程序實現刮刮樂效果的具體代碼,供大家參考,具體內容如下
效果圖
設計流程
設計思路
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面積的占有率記錄,只要判斷該坐標不在清除的范圍,就可以記錄該坐標。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答