内容简介:最近做了一个 H5 小游戏,游戏的玩法是小汽车抢停车位,需要手指拖拽小汽车躲避障碍快速进入停车位。在线预览:扫码跳过视频体验小游戏
最近做了一个 H5 小游戏,游戏的玩法是小汽车抢停车位,需要手指拖拽小汽车躲避障碍快速进入停车位。
最终效果
在线预览
在线预览: go.163.com/web/2019051…
扫码跳过视频体验小游戏
制作思路
游戏复杂的部分可能就是小红车和障碍物的碰撞检测,因为地图不是固定的,会有不同的游戏地图。刚开始想把障碍物切成一块一块的,然后给几种排列方式,但需要测量很多数据,觉得还是有些复杂。
之前小建老师 和我提到过很多次用 getImageData()
实现的神奇功能,之后我用 getImageData()
实现了点击涂色,觉得这个方法确实神奇且好用,所以这次碰撞检测也用 getImageData()
实现了一下。
getImageData()
getImageData()
是 canvas
的一个方法,可以读取到图片指定矩形的数据,数据指的是 rgba
数据。
思路重点
有了 getImageData()
这个方法的助攻,就可以在 PS 中新建一个透明图层,给小车行驶的路上涂上一个特定的颜色,然后小车每次移动,读取小车位置所在像素的颜色,就知道小车在不在道路上了。
开始实现
开始抠图
在 PS 中新建一个透明图层,把小车可以行驶的路上,涂上白色,给停车位涂上红色,然后保存为 png 图片。下图左侧为游戏地图,右测为对应的涂色图片,两张图片尺寸保存相同:
关键代码
碰撞检测关键:
function areaJudge(x,y){ // 传入小车的位置 return ((resolve)=>{ const canvas = document.createElement('canvas'); // 创建一个canvas,将我们涂好色的透明图片画到canvas const ctx = canvas.getContext('2d'); canvas.width = WIDTH; // WIDTH 为图片的宽度 canvas.height = HEIGHT; // HEIGHT 为图片的高度 const path = new Image(); path.onload = ()=>{ ctx.drawImage(path,0,0); // 参数说明:getImageData(小车x坐标,小车y坐标,获取1像素宽度的数据,获取1像素高度的数据) // data:[r,g,b,a] 图像数据为 rgba if(ctx.getImageData(x,y,1,1).data[3]===0){ // 获取当前像素的透明度,为 0 说明处于障碍区域 resolve(0); }else if(ctx.getImageData(x,y,1,1).data[0]===255){// 获取当前像素的透明度,为 255 说明处于可以行驶的区域 resolve(1); }else{ // 红色,停车位的位置 resolve(2); } }; path.src = psImgSrc; // psImgSrc 为我们在 ps 涂色的透明图片 }); } 复制代码
然后在小车移动的过程中,通过碰撞检测判断小车处于可行驶区域、故障区域还是停车位:
// 此处使用了 pixi.js 的 pointermove ,同理可以使用 touchmove car.on('pointermove',(e)=>{ // 此处 car.x 为小车中心的位置,省略了计算代码 this.areaJudge(car.x,car.y).then((resolve)=>{ if(resolve===1){ // 可行驶区域 }else if(resolve===0){ // 不可行驶区域 }else{ // 车位 } }); }); 复制代码
以上,就使用 getImageData()
实现了碰撞检测。
以上所述就是小编给大家介绍的《使用 getImageData 实现碰撞检测》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- OpenGL 碰撞检测之 AABB 包围盒
- Html5 Canvas动画基础(碰撞检测)
- JS写的不咋地的碰撞检测
- Chrome 小恐龙游戏源码探究九 -- 游戏碰撞检测
- LeetCode (735):行星碰撞
- 哈希碰撞与生日攻击
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Just My Type
Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99
What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!