当前第2页 返回上一页
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | function processKey(e) {
dx = 0
dy = 0
if (e.keyCode === 38) {
dy = -1
}
if (e.keyCode === 40) {
dy = 1
}
if (e.keyCode === 37) {
dx = -1
}
if (e.keyCode === 39) {
dx = 1
}
}
function drawFrame() {
if (dx != 0 || dy != 0) {
context.beginPath();
context.fillStyle = "rgb(254,244,207)"
context.rect(x, y, 15, 15)
context.fill()
x += dx
y += dy
if (checkForCollision()) {
x -= dx
y -= dy
dx = 0
dy = 0
}
var imgFace = document.getElementById( 'face' )
context.drawImage(imgFace, x, y)
if (canvas.height - y < 17) {
alert( '恭喜你通关 游戏结束' )
return false
}
}
setTimeout(drawFrame, 20)
}
|
上述代码中,移动函数比较简单,绘制帧的函数里面比较重要的就是碰撞检测函数,在下面详细解释。
碰撞检测
要检测物体与墙体是否碰撞,通常情况是要先把地图信息保存到内存里,然后在移动物体时检测是否与当前的某个墙体碰撞,但是由于我们的地图背景是黑白迷宫,所以可以使用颜色来检测碰撞。具体的做法是:
获取当前物体的坐标位置,利用canvas
检测当前地图上这个位置的颜色是否为黑色,如果是,说是是墙体,不应该执行移动,下面就是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function checkForCollision() {
var imageData = context.getImageData(x - 1, y - 1, 15 + 2, 15 + 2)
var pixels = imageData.data
for ( var i = 0, len = pixels.length; i < len; i++) {
var red = pixels[i],
green = pixels[i + 1]
blue = pixels[i + 2]
alpha = pixels[i + 3]
if (red === 0 && green === 0 && blue === 0) {
return true
}
}
return false
}
|
在这里,15
是小人的宽度,我们检测小人两侧各1px范围(对应代码中的getImageData(x - 1, y - 1, 15 + 2, 15 + 2)
可以稍微思考下这里为什么是+2),如果是黑色,说明检测到碰撞。
其余
在代码里,我加了一些其他的功能,比如提示答案等。至于更换地图也比较简单:把地图对应的文件地址,起点坐标,答案图片路径等存在一个对象里,然后设置一个地图数组,点击的时候切换地图并重新渲染就可以了。还有一些值得优化的地方,比如:
碰撞检测在拐弯的地方体验不佳;
当前情况运行时有轨迹,在答案模式下应该如何去掉轨迹?
有兴趣的同学可以试着自己实现下。
小结
这个例子相对比较简单,对js的要求不高,拿来玩一下还是挺不错的。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
HTML5 Canvas实现烟花绽放的特效
以上就是使用canvas实现迷宫游戏的详细内容,更多文章请关注木庄网络博客!
返回前面的内容
相关阅读 >>
javascript如何复制对象
javascript加载:defer与async
javascript中如何刷新页面
javascript中求最大值语句是什么
javascript实现鼠标滚轮控制页面图片切换
HTML5中关于history模式的详解
深入浅析javascript中的快速排序
HTML5语义化标记section和article实例详解
HTML5 canvas绘制五角星的方法
音乐播放器的制作实例(HTML5)
更多相关阅读请进入《HTML5》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » 使用canvas实现迷宫游戏