vue 刮刮乐功能实现

<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" >
        </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>

  

原文地址:https://www.cnblogs.com/xzybk/p/12618437.html

时间: 2024-10-09 14:33:53

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

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

说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素进行处理了. 首先,图片的像素是一个int型数组:int[], 此数组长度为图片高(像素)*宽(像素) 比如:一张图片的高宽为200pixel.400pixel,那么这个数组为int[80000] 对于每一个元素,官方文档说都是ARGB32[预乘RGB24]  (A指的是Alpha通道  控制透明度

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

分享一段用canvas和JS制作刮刮乐的代码,JS部分去掉注释不到20行代码效果如下 盖伦.jpg 刮刮乐.gif HTML部分 <body> ![](img/gailun.jpg) <canvas id="canvas" width="400" height="300"></canvas> </body> 没什么要特别注意的为了效果加了些CSS样式 CSS部分 <style type=&qu

Android 撕衣服(刮刮乐游戏)

项目简介: 该项目为撕衣服,类似刮刮乐游戏 详细介绍: 用户启动项目后,加载一张图片,当用户点击图片的时候,点击的一片区域就会消失,从而显示出在这张图片下面的图片 这个小游戏类似与刮奖一样,刮开涂层就会显示文字. 这里则是撕掉美女身上的衣服,漏出里面的图片. 该应用涉及到的知识有: 1.如何实现画图功能 2.如何把像素点变为透明色 3.如何监听手机对屏幕的操作 主要有触击,滑动,离开三种情况 注意: 1.一定要注意在设置像素点的时候,范围不能超过当前控件的范围 2.设置ImageView最好设置

Android实现刮刮乐效果

前几个月刚接触Android的时候做了一个小项目,其中也用到了类似刮刮乐的效果,现在把代码贴出来 首先要做一个类似橡皮擦的东西吧,然后才能把纸上的笔迹擦除 /** * FileName: SplashActivity.java * * @desc 橡皮擦功能,类似刮刮乐效果 * @author HTP * @Date 20140311 * @version 1.00 */ public class Text_Rubbler extends TextView { private float TOU

H5 Canvas刮刮乐

玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个页面的时候你的翻牌结果已经随着你点开而请求到了. 接下来 就是一些动画效果 然后告诉你的中奖结果是什么. 其实就很像你看的那种街头,赌碗 一个样子. 为什么 你的大号 总是什么奖都抽不到  小号总是能够抽到一些东西. 其实就是游戏策划对用户的一些粘度数据的分析   还有就是对你用户的衰减做的一些统计

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

玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个页面的时候你的翻牌结果已经随着你点开而请求到了. 接下来 就是一些动画效果 然后告诉你的中奖结果是什么. 其实就很像你看的那种街头,赌碗 一个样子. 为什么 你的大号 总是什么奖都抽不到  小号总是能够抽到一些东西. 其实就是游戏策划对用户的一些粘度数据的分析   还有就是对你用户的衰减做的一些统计

刮刮乐实现效果

当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色.尺寸等.下面来分析Android中Canvas有哪些功能,Canvas提供了如下一些方法: Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布. Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内

实现刮刮乐的效果

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> * { margin: 0; padding: 0; } </style> </head> <body> <div id="box">

使用Canvas对象实现“刮刮乐”效果

在淘宝.京东等电商举办活动的时候,经常可以看到在移动客户端推出的各种刮奖活动,而这种活动也受到了很多人的喜爱.从客户端的体验来说,这种效果应该是通过网页来实现的,那么,我们使用Android的自带控件能不能实现这种刮刮乐的效果呢?当然可以,本篇文章将介绍使用Canvas这个对象,如何实现"刮刮乐"的效果. 先看效果图 下面我们看一下如何使用代码实现 布局文件 <FrameLayout xmlns:android="http://schemas.android.com/a