• canvas 之刮刮卡


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script src="./scratch.js"></script>
    </head>
    <body>
        <canvas id="down" width=300 height=100 style="position:absolute;left:10px; top:10px; border:1px solid #333;" ></canvas>
        <canvas id="up" width=300 height=100 style="position:absolute;left:10px; top:10px; border:1px solid #333"></canvas>
    
        <script>
             var options = {
                 awards:['一等奖','二等奖','三等奖','特等奖','没中奖'],
                 maskColor:"gray",
                 textStyle:{
                     'size':'30',
                     'family':'Arial',
                     'align':'center',
                     'color':"orange"
                 },
                 radius:30
             }
             var scratch = new Scratch(options);
             scratch.init();
        </script>
    </body>
    </html>
    (function (doc,win){
        var Scratch = function(options){
            this.options = options;
            this.up = doc.querySelector("#up");
            this.upCtx = this.up.getContext("2d");
            this.down = doc.querySelector("#down")
            this.downCtx = this.down.getContext("2d");

            this.width = this.up.width;
            this.height = this.up.height;
        }

        Scratch.prototype = {
                constructor: Scratch,
                init:function(){
                    this.drawText();
                    this.drawMask();
                    this.addEvent();
                },
                drawText:function(){
                    var ctx = this.downCtx;
                    ctx.font = this.options.textStyle.size + "px " + this.options.textStyle.family;
                    ctx.textAlign = this.options.textStyle.align;
                    ctx.fillStyle = this.options.textStyle.color;
                    ctx.textBaseline = "top";
                    var random = parseInt(Math.random() * this.options.awards.length) || 0;
                    this.award = this.options.awards[random];
                    ctx.fillText(this.award,this.width/2,this.height/2 - this.options.textStyle.size/2);

                },
                drawMask:function(){
                    var ctx = this.upCtx;
                    ctx.fillStyle = this.options.maskColor;
                    ctx.fillRect(0,0,this.width,this.height);
                    ctx.globalCompositeOperation = 'destination-out';
                },
                addEvent:function(){
                    var _this = this;
                    _this.up.addEventListener('mousedown',function(ev){
                        _this.up.addEventListener('mousemove',callback1 = function(ev){
                            var ctx = _this.upCtx;
                            var x = ev.clientX - _this.up.offsetLeft;
                            var y = ev.clientY - _this.up.offsetTop;
                            var radius = _this.options.radius;
                            ctx.beginPath();
                            var gradient = ctx.createRadialGradient(x, y, 0, x, y, options.radius);
                            gradient.addColorStop(0,"rgba(255, 255, 255, 0.3)");
                            gradient.addColorStop(1,"rgba(255, 255, 255, 0)");
                            ctx.fillStyle = gradient;
                            ctx.arc(x, y, radius, 0, Math.PI * 2, true);
                            ctx.fill();
                            ctx.closePath();

                            if(_this.result() > 0.8){
                                alert(_this.award);
                            }

                        },false)

                        doc.addEventListener('mouseup',callback2 = function(ev){
                            _this.up.removeEventListener('mousemove',callback1);
                            doc.removeEventListener('mouseup',callback2);
                        },false)
                    },false)


                },
                result:function(){
                    //文字宽度
                    var textWidth = this.options.textStyle.size * this.award.length;
                    //文字高度
                    var textHeight = this.options.textStyle.size;
                    var transPixel = [];
                    var imgData = this.upCtx.getImageData(this.width/2-textWidth/2,this.height/2-textHeight/2,textWidth,textHeight);
                    var pixels = imgData.data;
                    for(var i = 0; i < pixels.length; i += 4){
                        var a = pixels[i+3];
                        if(a < 128){
                            transPixel.push(a);
                        }
                    }
                    return transPixel.length / (pixels.length/4);
                }

        };
        win.Scratch = Scratch;

            

    })(document,window)
  • 相关阅读:
    【题解】Luogu p2016 战略游戏 (最小点覆盖)
    【模板】Linux下输出文件的对比
    【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper
    【题解】滑雪 luogu1434 记忆化搜索
    【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back
    【题解】Luogu P3123 [USACO15OPEN]贝茜说哞Bessie Goes Moo
    【题解】Luogu P2214 [USACO14MAR]哞哞哞Mooo Moo
    【题解】Luogu P2327 [SCOI2005]扫雷
    【题解】Luogu P1011 车站
    【题解】Luogu P2889 [USACO07NOV]挤奶的时间Milking Time
  • 原文地址:https://www.cnblogs.com/kongxs/p/4244643.html
Copyright © 2020-2023  润新知