<template>

<!--游玩区域-->
<div class="panel">
<canvas
id="canvas" @touchstart.prevent="touchStart($event)" @touchmove.prevent="eventMove($event)"
:style='{"background-image":"url("+backgroundImage+")"}'
width="550" height="380"></canvas>
<div id="canvasMask" v-if="start">
<div class="start" @touchstart="StartTouch()">
<div class="startContain">
<span>刮开试试手气</span>
<span >开始刮开</span>
</div>
<img src="../assets/scratch/u611.png" alt="">
</div> </div>
<div class="reStart" v-if="restart">
<span @touchstart="ContinueScratch()">继续刮奖</span>
</div> </div> </template>
<script>
let canvas;
let ctx; export default {
// inject:["reload"],
data(){
return{
start:true,
restart:false,
clientWidth:null,
canvasWidth:null,
canvasHeight:null,
backgroundImage: require('../assets/scratch/prize2.png'),
num:2
}
},
mounted(){
this.initCanvas()
},
methods:{
initCanvas() {
console.log("初始化canvas")
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
this.clientWidth = document.documentElement.clientWidth,
this.canvasWidth = Math.floor(this.clientWidth * 550 / 750),//canvas宽 = 屏幕宽 * 设计稿里canvas宽 / 750
this.canvasHeight = Math.floor(this.clientWidth * 380 / 750),//canvas高 = 屏幕宽 * 设计稿里canvas高 / 750 canvas.style.width=this.canvasWidth+'px';
canvas.style.height=this.canvasHeight+'px';
console.log(canvas.style.backgroundImage);
this.drawPic()
},
drawPic() { ctx.beginPath();
ctx.fillStyle = '#999';//刮刮乐图层的填充色
ctx.lineCap = "round";//绘制的线结束时为圆形
ctx.lineJoin = "round";//当两条线交汇时创建圆形边角
ctx.lineWidth = 30;//单次刮开面积
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
ctx.save();//保存画布上面的状态
ctx.closePath();
// ctx.clip(); ctx.globalCompositeOperation = 'destination-out';//新图像和原图像重合部分变透明 //下面代码是为了修复部分手机浏览器不支持destination-out
canvas.style.display="inherit"; },
touchStart(e){ e = e || window.event;
if (typeof e.touches !== 'undefined') {
e = e.touches[0];//获取触点
}
var x = e.pageX-e.target.offsetLeft,
y = e.pageY-e.target.offsetTop;
ctx.moveTo(x, y);
//touchmove事件
this.eventMove(e);
},
eventMove(e){
e = e || window.event;
if (typeof e.touches !== 'undefined') {
e = e.touches[0];
}
var x = e.pageX-e.target.offsetLeft,
y = e.pageY-e.target.offsetTop;
ctx.lineTo(x, y);
ctx.stroke();
this.clear();
},
clear() {
let data = ctx.getImageData(0, 0, this.canvasWidth, this.canvasHeight).data,//得到canvas的全部数据
half = 0;
//length = canvasWidth * canvasHeight * 4,一个像素块是一个对象rgba四个值,a范围为0~255
for (var i = 3, length = data.length; i < length; i += 4) {//因为有rgba四个值,下标0开始,所以初始i=3
data[i] === 0 && half++;//存在imageData对象时half加1 PS:该像素区域透明即为不存在该对象
}
//当刮开的区域大于等于30%时,则可以开始处理结果
if (half >= this.canvasWidth * this.canvasHeight * 0.3) {
// alert(111)
ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);//清空画布
this.restart=true; }
},
StartTouch(){
this.start=false;
},
ContinueScratch(){
this.num--;
if(this.num<=0){
this.num=0;
console.log(this.num)
alert("没有剩余刮奖次数")
}else{
this.start=true;
this.restart=false;
ctx.restore();//恢复上面保存的画布内容
this.initCanvas();
}
}
}
}
</script>
<style scoped> .panel{
}
.panel{
}
.panel #canvas{
position: absolute;
top: 5.5rem;
left: 1rem;
border-radius: 10%;
/* background: url('../assets/scratch/prize2.png'); */
background-size:100% 100%;
}
.panel #canvasMask{
position: absolute;
top: 5.3rem;
left: 1rem;
width: 6rem;
height: 4rem;
overflow: hidden;
}
.panel #canvasMask .start{
width: 6rem;
height: 4rem;
display: flex;
/* background-color: sandybrown; */
padding-left: 1.2rem;
padding-top: 0.6rem;
}
.panel #canvasMask .start img{
display: inline-block;
width: 2rem;
height: 2rem;
}
.panel #canvasMask .start .startContain{
padding-top: 0.8rem;
}
.panel #canvasMask .start .startContain span{
display: block;
font-size: 0.3rem;
text-align: center;
}
.panel #canvasMask .start .startContain span:last-child{
margin-top: 0.2rem;
font-weight: bold;
}
.panel .reStart{
position: absolute;
top: 8.4rem;
left: 2.8rem;
color: red;
border: 0.01rem solid;
border-radius: 0.1rem;
padding: 0 0.1rem;
}
.panel .reStart span{
font-size: 0.4rem;
}
</style>

  

vue 刮刮乐功能实现的更多相关文章

  1. WP8下实现刮刮乐(橡皮擦)功能

    说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素 ...

  2. 游戏的套路你知道吗? H5 Canvas刮刮乐

    玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个 ...

  3. H5 Canvas刮刮乐

    玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个 ...

  4. canvas刮刮乐

    这周有点迷茫,不知道干嘛了,一天天就过去了!我在博客右侧公告栏加了qq交流,各位有好的主题,或者有趣的技术,欢迎交流!今天突发奇想,就写了2个h5 canvas的demo玩玩! demo一:刮刮乐 舍 ...

  5. 20行js代码制作网页刮刮乐

    分享一段用canvas和JS制作刮刮乐的代码,JS部分去掉注释不到20行代码效果如下 盖伦.jpg 刮刮乐.gif HTML部分 <body> ![](img/gailun.jpg) &l ...

  6. Android 撕衣服(刮刮乐游戏)

    项目简单介绍: 该项目为撕衣服,相似刮刮乐游戏 具体介绍: 用户启动项目后.载入一张图片,当用户点击图片的时候,点击的一片区域就会消失.从而显示出在这张图片以下的图片 这个小游戏相似与刮奖一样,刮开涂 ...

  7. 用Canvas画一个刮刮乐

    Canvas 通过 JavaScript 来绘制 2D图形.Canvas 是逐像素进行渲染的.开发者可以通过javascript脚本实现任意绘图.Canvas元素是HTML5的一部分,允许脚本语言动态 ...

  8. 刮刮乐自定义view

    说明:该代码是参考鸿洋大神的刮刮乐自定义view来写的. 实现:刮刮乐-刮奖的效果,如下效果 下面直接放代码了:只有一个自定义view,要实现真正的功能还需要进一步封装 /** * 自定义view-刮 ...

  9. [cocos2d-js]cc.RenderTexture几种用法(数字图片、刮刮乐效果)

    [转]http://blog.csdn.net/realcrazysun1/article/details/42393629 本文基于cocos2d-js 3.0版本引擎开发 RenderTextur ...

随机推荐

  1. Anroid关于fragment控件设置长按事件无法弹出Popupwindows控件问题解决记录

    一.问题描述     记录一下最近在安卓的gragment控件中设置长按事件遇见的一个坑!!!     在正常的activity中整个活动中设置长按事件我通常实例化根部局,例如LinearLayout ...

  2. django 从零开始 6 数据库模型增删改查

    这些都是凭记忆写下的,有些会漏掉,在之后的笔记中会写 和flask query不同,django是使用objects进行一个查询 查询 单条记录 django 模型.bojects.get(查询的字段 ...

  3. .NET 5 Preview 1中的ASP.NET Core更新 (2020年3月16日)

    .NET 5 Preview1现在可用,可以进行评估了! .NET 5将是当前版本. 开始 要在.NET 5.0中开始使用 ASP.NET Core,请安装.NET 5.0 SDK. 如果您使用的是W ...

  4. Dubbo之服务暴露

    前言 本文 Dubbo 使用版本2.7.5 Dubbo 通过使用dubbo:service配置或@service在解析完配置后进行服务暴露,供服务消费者消费. Dubbo 的服务暴露有两种: 远程暴露 ...

  5. ASP.NET WebApi实现Token验证

    记录笔记,在博客园中有很多实现Token的方法,这是我看过他们学到的,然后找到适合自己的解决方案,自己无聊总结一下学习经验写下的 WebApi后端接口实现Token验证 Token是在客户端频繁向服务 ...

  6. CSS3-3D技术

    CSS3-3D技术 transform翻译成汉语具有"变换"或者"改变"的意思. 此属性具有非常强大的功能,比如可以实现元素的位移.拉伸或者旋转等效果, 最能体 ...

  7. 配置GitLab或Git环境之教程

    配置GitLab或Git环境之教程 1.安装好Git后,首先打开开始菜单的所有程序里面的git文件夹,打开Git Bash/ ​ 2.弹出的命令行里面输入ssh-keygen 输入y,一直Enter ...

  8. angular6 增加webpack配置 亲测可用

    核心 Angular Cli 6 禁用了webpack的自定义配置,官方似乎并未提供自定义配置webpack的方法. 在此之前,可以使用ng eject把默认的webpack提取到代码中,进行自定义. ...

  9. python中可变长度参数详解

    1. *args用法:python会将所有位置的参数收集到一个元组中 2. **args用法:python会将关键字参数传递给一个新的字典.**允许将关键字参数转换为字典 用法见如下代码: def f ...

  10. [ICRA 2019]Multi-Task Template Matching for Object Detection, Segmentation and Pose Estimation Using Depth Images

    简介         本文作者提出新的框架(MTTM),使用模板匹配来完成多个任务,从深度图的模板上找到目标物体,通过比较模板特征图与场景特征图来预测分割mask和模板与检测物体之间的位姿变换.作者提 ...