网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践
前言:
之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识.
对于刮刮卡, 想必大家都很熟悉, 也很喜欢这种方式. 你可能会很好奇, 它是如何实现的呢?
本文将阐述其原理, 并结合具体实例来演示如何借助H5的canvas来实现类刮刮卡的效果.
展示效果:
网页闯关游戏入口(请狠狠地点击我, ^_^) http://magic.mmxfgame.com.
H5刮刮卡的实例源自第六关--拜访东方不败的故居.
这一关的技术点是围绕刮刮卡而展开的, 下文将详细介绍.
刮刮卡原理:
刮刮卡的技术说开了无非就是遮盖, 擦拭的地方就是去遮盖, 并还原出遮盖底下的原始图片.
先来谈谈H5支持的绘图模式, 再来介绍下按键处理和绘图API.
• 绘图模式
Canvas的Context句柄有一个属性:globalCompositeOperation, 该属性表示的是图形的组合方式.
当我们把它设置为destination-out,它表示只绘制原图形与新图形不重叠的部分. 其实这句话有些晦涩, 很难让人看明白, 甚至误解. 不如直接上代码, 简洁明了, ^_^, 不上代码就是耍流氓.
结合简单的刮刮卡案列来强化下概念吧.
原图形 等价于 刮刮卡的银灰色部分.
新图形 等价于 用户/玩家刮的时候, 新绘制的区域/路径.
被遮挡图片 等价于 银灰色部分覆盖的抽奖信息.
当原图形和新图形重叠时, 就是刮到的部分是两者交集变成透明. 那么原图形遮挡的底层图片显示出来了, 也就是抽奖部分.
所以说, 原图形就是遮盖图片, 新图形是用户刮的区域/路径.
明白这些概念之后, 那么刮刮卡的实现就非常简单的, 几乎可以说是非常的navie. 游戏具体分析:
游戏其实用了两张完全一样的图片, 一张为原图片(xyz1.jpg), 另一张则添加了解关秘钥答案(xyz2.jpg).
• 底层图片的设定
div元素中, 添加canvas元素.
<div id="id_dongfangbubai_canvas">
<canvas id="game_canvas" width="480px" height="333px"></canvas>
</div>
再来看看css样式设置.
#id_dongfangbubai_canvas {
background-image: url('http://www.xxx.com/img/xyz2.jpg');
width: 480px;
height: 333px;
}
答案的背景图片和canvas等同大小, 并设置于底层.
• html5中的图片加载
js中图片加载时个异步过程, 需要时间, 因此切记在图片未加载完前操作.
var maskedImage = new Image();
// 设置图片链接
maskedImage.src = "http://www.xxx.com/img/xyz1.jpg";
// 设置图片加载完的回调函数
maskedImage.onload = function() {
gray.drawImage(maskedImage, 0, 0);
gray.globalCompositeOperation = "destination-out";
}
这样就实现了遮盖图片的绘制, 并成功设置了绘制模式.
• 事件监听
在移动端, 我们需要关注touchmove的事件操作. 再次之前, 我们先关注下坐标的定位上.
蓝色区域表示的是手机设备的显示区域,而绿色区域为canvas画布的父级,已经超出了屏幕。而浅紫色部分为canvas画布。假设我们手指轻触了蓝色点的位置,红色线即为“e.targetTouches[0].clientX”的值,黑色线为“document.body.scrollLeft”或“e.pageX”的值,而黄色的线表示myCanvas.offsetLeft。
因此最终的横坐标x转换公式:
var x = e.targetTouches[0].clientX + document.body.scrollLeft - myCanvas.offsetLeft.
纵坐标y转换公式类似:
var y = e.targetTouches[0].clientY + document.body.scrollTop - myCanvas.offsetTop;
具体的事件处理如下所示:
var myCanvas = document.getElementById('game_canvas');
var ctx = myCanvas.getContext('2d'); var offsetx = myCanvas.offsetLeft;
var offsety = myCanvas.offsetTop; myCanvas.addEventListener('touchmove', function (e) {
e.preventDefault(); ctx.beginPath();
ctx.fillStyle = "#f00"; if( e.changedTouches ){
e=e.changedTouches[e.changedTouches.length-1];
} var x = e.clientX + document.body.scrollLeft - myCanvas.offsetLeft;
var y = e.clientY + document.body.scrollTop - myCanvas.offsetTop; // 绘制小圆形来模拟手指的刮动效果
ctx.arc(x, y, 20, 0, Math.PI * 2); ctx.fill();
ctx.closePath();
});
注: 绘制的区域/路径, 和遮盖层覆盖而变成透明, 最底层的答案部分就自然而然显露出来了. 总结:
刮刮卡的实现原理和技术点, 其实很简单明了. 代码也就区区的几十行吧, 很清晰, 但涉及的知识点还不少. 对于我而言, 出题设计以及原理实现都是提高.
最后, 希望游戏, 大家能喜欢.
公众号&游戏站点:
个人微信公众号: 木目的H5游戏世界
个人游戏作品集站点(尚在建设中...): www.mmxfgame.com, 也可直接ip访问: http://120.26.221.54/.
网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践的更多相关文章
- 网页闯关游戏(riddle webgame)--游戏玩法和整体介绍
前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想 ...
- 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...
- 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...
- XSS闯关游戏准备阶段及XSS构造方法
请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...
- hack游戏攻略(黑吧安全吧的黑客闯关游戏)古墓探秘
2019.2.11 这个是找到的一个黑客游戏,就是一关一关,挺像ctf的,玩玩也挺有意思,还能涨知识. 地址:http://hkyx.myhack58.com/ 入口: 入口就是这样的.提示是 图内有 ...
- 51nod 1450 闯关游戏
首先肯定要先把所有的关卡打通后去找两星几率最大的关卡刷星(论打游戏经验的重要性). 所以从两星几率小的关打起,记录当前拿到x个星星的几率和当前走过的期望步数,如果发现剩下的关必须全两星,就直接计算答案 ...
- 51nod1450 闯关游戏
题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 一个游戏App由N个小游戏(关卡)构成,将其标记为0,1,2,..N-1.这些小游戏没有相互制约的性质 ...
- python3 黑板客爬虫闯关游戏(四)
这关较第三关难度增加许多,主要多了并发编程 密码一共有100位,分布在13页,每页打开的时间在15秒左右,所以理所当然的想到要用并发,但是后来发现同IP访问间隔时间不能小于8秒,不然会返回404,所以 ...
- python3 黑板客爬虫闯关游戏(三)
第三关,先登录,再猜密码,这关难度较第二关大幅增加,要先去注册一个登录账号,然后打开F12,多登录几次,观察headers数据的变化 给出代码,里面注释很详细 import urllib.reques ...
随机推荐
- iOS_线程和进程的区别与联系
首先是线程和进程的联系: 线程和进程都是由操作系统所负责的程序运行的基本单元,系统利用该基本单元实现对应用的并发性. 接下来就是线程和进程的区别: 线程和进程最大的区别就是它们是操作系统的两种资源管理 ...
- .NET程序的简单编译原理
1.不管是什么程序,最终的执行官是CPU,而CPU只认识1和0的机器码. 2.我们现在写的一般是高级语言写的程序.CPU是不认识我们用高级语言写的源代码的,那应该怎么办才能让CPU执行我们写好的程序尼 ...
- CSS3入门--线条动画特效实例
HTML: <div></div> CSS: div{ width: 200px; height: 200px; margin: 200px auto; background: ...
- 4、jvm内存回收——器
内存回收---->垃圾回收---->GC GC 三基础,一个综合G1 串行:单线程,回收暂停其他 并行:多线程,回收暂停其他 并发:多线程,回收不暂停?! 成功好说,失败Serial Ol ...
- C# 大小写转换,方便index of
ToUpper:小写转大写ToLower:大写转小写 例: string str=120cm*150g/m2;从中取出120和150,但是又要规避大小写问题,这时候就需要将str转换为大写,然后ind ...
- java多线程之 基本概念
一.线程的五种状态 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable) ...
- 关于css样式2
css文本 CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用 ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- 使用MJRefresh遇到的一个问题,上拉刷新后tableview瞬间滑到最底部
最近用MJRefresh上拉刷新时遇到一个问题,就是上拉刷新后,tableview会瞬间滑到最底部,用户还要往回翻才能看到新刷出来的数据,体验十分不好.查了很久没找到原因,最后发现在refreshvi ...
- 读IT小小鸟有感
第一次阅读<我是一只IT小小鸟>是在老师的推荐下的,我是一名软工大一新生,那天在课堂上听到了这本书,由于是10年前的老书,要找到它非常不易,终于在网上看到一些部分电子档. ...