iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Html5中Canvas实现一个“刮刮乐”游戏的方法
  • 750
分享到

Html5中Canvas实现一个“刮刮乐”游戏的方法

2023-06-09 21:06:08 750人浏览 独家记忆
摘要

小编给大家分享一下HTML5中canvas实现一个“刮刮乐”游戏的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!之前公司项目有一个刮奖小游戏的需求,因此有了本

小编给大家分享一下HTML5canvas实现一个“刮刮乐”游戏的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

之前公司项目有一个刮奖小游戏的需求,因此有了本文记录该“刮刮乐”游戏的实现过程。

话不多说,先上Demo 和 项目源码 .

Html5中Canvas实现一个“刮刮乐”游戏的方法 

2. 实现

我们创建一个 ScrapAward 类,通过传入 option 和调用其 restart() 方法实现重新开始。

(1)定义 option 参数及 ScrapAward 结构

class ScrapAward {    constructor(userOption) {        this.option = {            canvasId: 'canvas', // canvas的id            backgroundImageUrl: '', // 背景图url            width: 320, // canvas宽度            height: 160, // canvas高度            backgroundSize: '100% 100%',            coverImage: { // 覆盖图层背景图url                url: '',                width: 320,                height: 160,            },            callback: () => {}, // 刮奖完成的回调函数        };        this.ctx = null;        this.init(userOption); // 初始化    }    // 初始化方法    init(userOption) {    }    // 重新开始也是一次初始化    restart(userOption) {        if (userOption) {            this.init(userOption);        } else {            this.init({});        }    }}

(2) init 初始化

首先合并用户的配置 userOption 和默认 option , 等背景图片加载完成后调用 fillCanvas() 方法绘制覆盖层的图片后设置 canvas 的背景图。

当上述行为完成后,我们便监听鼠标或者touch事件。刮奖这一行为其实是canvas对鼠标或者touch的移动路径进行绘画,只不过是将绘画的路径变成了透明,这种效果我们通过设置 ctx.globalCompositeOperation = 'destination-out'; 即可实现。

init(userOption) {        // 合并用户配置        if (Object.assign) {            Object.assign(this.option, userOption);        } else {            extend(this.option, userOption, true);        }        // 定义一系列变量        let that = this,            img = (this.img = new Image()), //背景图片            imgLoaded = false, //背景图是否加载完成            canvas = (this.canvas = document.querySelector(`#${this.option.canvasId}`)),            hastouch = 'ontouchstart' in window ? true : false,            tapstart = hastouch ? 'touchstart' : 'mousedown',            tapmove = hastouch ? 'touchmove' : 'mousemove',            tapend = hastouch ? 'touchend' : 'mouseup',            coverImg = (this.coverImg = new Image()),            hasDone = false, // 是否刮奖完毕            coverImgLoad = false;        that.mousedown = false; //鼠标的mousedown事件或者touchmove事件是否开启        // 移除事件监听,用于重新开始        if (this.canvas) {            this.canvas.removeEventListener(tapstart, eventDown);            this.canvas.removeEventListener(tapend, eventUp);            this.canvas.removeEventListener(tapmove, eventMove);        }        coverImg.src = this.option.coverImage.url;        coverImg.crossOrigin = 'Anonymous'; // 解决一些跨域问题        img.src = this.option.backgroundImageUrl;        var w = (img.width = this.option.width),            h = (img.height = this.option.height);        this.canvasOffsetX = canvas.offsetLeft;        this.canvasOffsetY = canvas.offsetTop;        canvas.width = w;        canvas.height = h;        this.ctx = canvas.getContext('2d');        let ctx = this.ctx;        this.img.addEventListener('load', backgroundImageLoaded);        this.option.coverImage.url && this.coverImg.addEventListener('load', coverImageLoaded);        // 背景图片加载完成后        function backgroundImageLoaded(e) {            imgLoaded = true;            fillCanvas();            canvas.style.background = 'url(' + img.src + ') no-repeat';            canvas.style.backgroundSize = that.option.backgroundSize || 'contain';        }        // 覆蓋图片加载完成后        function coverImageLoaded(e) {            coverImgLoad = true;            fillCanvas();            canvas.style.background = 'url(' + img.src + ') no-repeat';            canvas.style.backgroundSize = that.option.backgroundSize || 'contain';        }        // 绘制canvas        function fillCanvas() {            if (that.option.coverImage.url && (!imgLoaded || !coverImgLoad)) return;            if (!that.option.coverImage.url) {                ctx.fillStyle = that.option.coverImage.color || 'gray';                ctx.fillRect(0, 0, w, h);            } else {                ctx.drawImage(coverImg, 0, 0, that.option.coverImage.width, that.option.coverImage.height);            }            ctx.globalCompositeOperation = 'destination-out';            canvas.addEventListener(tapstart, eventDown);            canvas.addEventListener(tapend, eventUp);            canvas.addEventListener(tapmove, eventMove);        }        // 点击开始事件        function eventDown(e) {            e.preventDefault();            that.mousedown = true;        }        // 点击结束事件        function eventUp(e) {            e.preventDefault();            that.mousedown = false;        }        // 刮奖事件        function eventMove(e) {            if (hasDone) return; // 刮奖结束则return            let ctx = that.ctx;            e.preventDefault();            if (that.mousedown) {                if (e.changedTouches) {                    e = e.changedTouches[0];                }                var x = (e.clientX + document.body.scrollLeft || e.pageX) - that.canvasOffsetX || 0,                    y = (e.clientY + document.body.scrollTop || e.pageY) - that.canvasOffsetY || 0;                ctx.beginPath();                ctx.arc(x, y, 20, 0, Math.PI * 2);                ctx.fill();            }        }    }

(3)刮奖完毕的实现

上述代码实现刮奖的效果,但是一般的场景是用户刮奖的面积超过一半时,覆盖图层全部散开,此时为刮奖完成的状态。

如何知道刮奖的面积超过一半了呢? canvas 中的 ctx 对象提供了一个方法 getImageData() , 该方法可返回某个区域内每个像素点的数值的组成的数组,数组中4个元素表示一个像素点的rgba值。

因此我们可以判断 rgba 中的 a 值透明度,透明度小于 256 的一半( 128 )即可视为透明状态,计算透明 a 值的百分比.

判断 a 值百分比大于 50 , 则调用 ctx.clearRect(0, 0, w, h); 清除画布, 并执行成功回调 callback .

function eventMove(e) {    if (hasDone) return; // 刮奖结束则return    let ctx = that.ctx;    e.preventDefault();    if (that.mousedown) {        if (e.changedTouches) {            e = e.changedTouches[0];        }        var x = (e.clientX + document.body.scrollLeft || e.pageX) - that.canvasOffsetX || 0,            y = (e.clientY + document.body.scrollTop || e.pageY) - that.canvasOffsetY || 0;        ctx.beginPath();        ctx.arc(x, y, 20, 0, Math.PI * 2);        ctx.fill();    }    handleFilledPercentage(getFilledPercentage());}// 计算已经刮过的区域占整个区域的百分比function getFilledPercentage() {    let imgData = that.ctx.getImageData(0, 0, w, h);    // imgData.data是个数组,存储着指定区域每个像素点的信息,数组中4个元素表示一个像素点的rgba值    let pixels = imgData.data;    let transPixels = [];    for (let i = 0; i < pixels.length; i += 4) {        // 严格上来说,判断像素点是否透明需要判断该像素点的a值是否等于0,        // 为了提高计算效率,这儿设置当a值小于128,也就是半透明状态时就可以了        if (pixels[i + 3] < 128) {            transPixels.push(pixels[i + 3]);        }    }    return ((transPixels.length / (pixels.length / 4)) * 100).toFixed(2) + '%';}// 设置阈值,去除灰色涂层function handleFilledPercentage(percentage) {    percentage = percentage || 0;    if (parseInt(percentage) > 50) {        // 当像素点的个数超过  50% 时,清空画布,显示底图        ctx.clearRect(0, 0, w, h);        hasDone = true;        that.option.callback();    }}

3. 使用

将代码引入 html 后,新建 new scraAward(option) 即可实现。页面结构如下:

<!DOCTYPE html><html lang="en">    <head>        <meta charset="UTF-8" />        <meta name="viewport" content="width=device-width, initial-scale=1.0" />        <meta Http-equiv="X-UA-Compatible" content="ie=edge" />        <title>实现一个“刮刮乐”游戏</title>        <style type="text/CSS">            .demo {                width: 320px;                margin: 10px auto 20px auto;                min-height: 300px;            }            .msg {                text-align: center;                height: 32px;                line-height: 32px;                font-weight: bold;                margin-top: 50px;            }        </style>    </head>    <body>        <div id="main">            <div class="msg">                刮刮下面图片看看什么效果哈哈哈,<a href="javascript:void(0)" id="try_again">再来一次</a>            </div>            <div class="demo">                <canvas id="canvas"></canvas>            </div>        </div>        <script src="./scrapAward-dev.js"></script>        <script>            window.onload = function() {                let scraAward = new ScrapAward({                    height: 570,                    backgroundImageUrl: './suporka_home.jpg',                    coverImage: {                        url: './super.jpg',                        // color: 'red',                        width: 428,                        height: 570,                    },                    callback: () => {                        alert('刮奖结束');                    },                });                document.getElementById('try_again').addEventListener('click', function(e) {                    scraAward.restart();                });            };        </script>    </body></html>

以上是“Html5中Canvas实现一个“刮刮乐”游戏的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Html5中Canvas实现一个“刮刮乐”游戏的方法

本文链接: https://www.lsjlt.com/news/257857.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Html5中Canvas实现一个“刮刮乐”游戏的方法
    小编给大家分享一下Html5中Canvas实现一个“刮刮乐”游戏的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!之前公司项目有一个刮奖小游戏的需求,因此有了本...
    99+
    2023-06-09
  • html5中怎么利用canvas实现一个刮刮卡效果
    这篇文章给大家介绍html5中怎么利用canvas实现一个刮刮卡效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码如下:<!DOCTYPE html><...
    99+
    2024-04-02
  • Android studio实现刮刮乐的方法
    本文实例为大家分享了Android studio实现刮刮乐的具体代码,供大家参考,具体内容如下MainActivitypublic class MainActivity extends AppCompatActivity { @Overr...
    99+
    2023-05-30
    android studio 刮刮乐
  • HTML5 中怎么利用canvas标签实现刮刮卡效果
    本篇文章为大家展示了HTML5 中怎么利用canvas标签实现刮刮卡效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML我们只需要在页面中加入canvas标签...
    99+
    2024-04-02
  • Android中怎么实现一个刮刮卡效果
    本篇文章为大家展示了Android中怎么实现一个刮刮卡效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Xfermode 通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素...
    99+
    2023-05-30
    android
  • 如何实现一个canvas迷宫游戏
    小编给大家分享一下如何实现一个canvas迷宫游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!正文实现这个小游戏也不难,让我们想想,一个迷宫游戏有哪些基本要素。...
    99+
    2023-06-09
  • 怎么在html5中使用canvas创建一个太空游戏
    这篇文章将为大家详细讲解有关怎么在html5中使用canvas创建一个太空游戏,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.向网页添加 Canvas 元素2.创建黑色背景3.在背景上绘制...
    99+
    2023-06-09
  • 怎么用HTML5的Canvas API制作一个简单猜字游戏
    本文小编为大家详细介绍“怎么用HTML5的Canvas API制作一个简单猜字游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用HTML5的Canvas API制作一个简单猜字游戏”文章能帮助大家解...
    99+
    2024-04-02
  • 怎么在VUE中使用Canvas实现一个五子棋游戏
    怎么在VUE中使用Canvas实现一个五子棋游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与...
    99+
    2023-06-15
  • 怎么在HTML5中使用WebGL实现一个俄罗斯方块游戏
    怎么在HTML5中使用WebGL实现一个俄罗斯方块游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码实现首先,先完成 2D 小游戏在查看官方文档的过程中,了解到 HT 的组...
    99+
    2023-06-09
  • 如何利用HTML5 Canvas制作一个简单的打飞机游戏
    这篇文章主要介绍“如何利用HTML5 Canvas制作一个简单的打飞机游戏”,在日常操作中,相信很多人在如何利用HTML5 Canvas制作一个简单的打飞机游戏问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • html5 中怎么利用canvas实现一个圆形时钟
    这篇文章给大家介绍html5 中怎么利用canvas实现一个圆形时钟,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<!DOCTYPE html><html>&l...
    99+
    2024-04-02
  • HTML5+lufylegend如何实现游戏中的卷轴
    这篇文章将为大家详细讲解有关HTML5+lufylegend如何实现游戏中的卷轴 ,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 lufyl...
    99+
    2024-04-02
  • 使用canvas怎么实现一个飞机打怪兽射击小游戏
    使用canvas怎么实现一个飞机打怪兽射击小游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。游戏规则要求玩家控制飞机发射子弹,消灭会移动的怪兽,如果全部消灭了则游戏成功,如果...
    99+
    2023-06-09
  • 怎么在HTML5页面中实现一个音乐播放器
    这篇文章给大家介绍怎么在HTML5页面中实现一个音乐播放器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<audio id="music1">浏览器不支持audio标签<...
    99+
    2023-06-09
  • 利用Random类常用方法实现一个猜数字游戏
    本篇内容介绍了“利用Random类常用方法实现一个猜数字游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • 怎么在Html5中使用canvas实现一个粒子时钟
    这篇文章将为大家详细讲解有关怎么在Html5中使用canvas实现一个粒子时钟,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先要创建一个html文件并添加一个canvas画布,如下:<...
    99+
    2023-06-09
  • 怎么在html5中利用canvas实现一个弹幕功能
    本篇文章为大家展示了怎么在html5中利用canvas实现一个弹幕功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(function () {   ...
    99+
    2023-06-09
  • Python中怎么实现一个猜数小游戏
    Python中怎么实现一个猜数小游戏,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现效果: 程序截图:点击(此处)折叠或打开from random i...
    99+
    2023-06-04
  • JavaScript实现一个简单的圣诞游戏
    目录前言实现效果代码CSS代码JS代码html代码演示流程前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作