HTML5小游戏研究(四):完结:增加多个关卡,手机支持, 记分牌
来源:互联网 发布:linux中 wait 编辑:程序博客网 时间:2024/06/01 22:57
关卡
本来按照只有一关的思路设计,整个逻辑都是循环,突然我说要加上多个关卡,猛的不适应,考虑了一下,无耻的去看原著的代码,发现原著是使用了一个数组,来定义地图上障碍物的位置与高度,于是完全拷贝过来为己用。
var levelMap=[ [0, 0, 0, 0, 0, 50, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
这个数组就很明确了,把地图分为若干个小块,如果数组为0,表示什么也没有,如果有值,代表障碍物的高度。
然后增加一个变量level代表关数,当方块到右侧胜利时,改为关数增加一,然后调用开局函数,在开局函数增加level的判断,如果当前level不为最大值,则绘制当前关数的地图,然后就可以循环进行游戏了。
function start(){if(jumpProcess!=null) clearInterval(jumpProcess)if(moveProcess!=null) clearInterval(moveProcess)console.log("当前关数",level)if(level<levelMap.length){createObstacles(level)console.log(level)console.log(levelMap[0])fallDown()ctx.clearRect(0,0,650,350);}else{win();}}
写绘制地图的动画代码
//画出障碍物function createObstacles(level){ ctxBg.clearRect(0,0,canvas.width,canvas.height); for(i=0;i<levelMap[level].length;i++){ if(levelMap[level][i]!=0){ drawObstacle(i,levelMap[level][i]) } }}function drawObstacle(position,height){ var objHeight=0 var thisProcess=setInterval(function(){ if(objHeight<height){ ctxBg.fillRect(objWidth*position,canvas.height-objHeight,objWidth,objHeight); objHeight+=1 } else{ clearInterval(thisProcess) } },5)}
以上完成以后,游戏就有了多个关卡。
然后我在碰撞这里犯了糊涂,竟然用了一个switch来把每一关的碰撞条件手动计算出来。工程越搞越多,越想越不对劲,突然才想明白应该怎么做。每一次移动时,都去数组遍历看是否当前坐标有障碍物,但不确定这样做是否有效率,测试时至少不卡顿。
function collision(level){for(i=0;i<levelMap[level].length;i++){ if(levelMap[level][i]!=0){ if(playerX+playerRadius>=i*objWidth && playerX-playerRadius<=i*objWidth+objWidth && playerY<=levelMap[level][i]+playerRadius){ return true; } } }}
至此,关卡逻辑均已完成,只剩下设置关卡的具体参数。
手机支持
没有什么特殊操作,只有点击屏幕一种方式,不停的点就可以完成所有操作。
addEventListener('touchstart',touch,false);addEventListener('touchmove',touch,false);addEventListener('touchend',touch,false);function touch (event){ var event = event || window.event; switch(event.type){ case "touchstart": keyDown() //这是控制跳跃、开局、重新开始的函数 break; case "touchmove": event.preventDefault(); keyDown() break; } }
计分板等文字信息
在主CANVAS上半部画出死亡数、关数。方块跳到最高处时也仅处于CANVAS的下半部,所以充分利用空间。
在碰撞与过关时绘制信息即可。
总结
简单的加了几关,整体看上去像一个完整的小游戏,可玩性还可以。盯着小bug修复了一下午。
后续游戏可以添加微信朋友圈分享、自定义地图等功能。
完整代码可以在我的github下载,或试玩这个demo。
0 0
- HTML5小游戏研究(四):完结:增加多个关卡,手机支持, 记分牌
- HTML5小游戏研究(三):增加开始界面、声音、碰撞动画
- HTML5小游戏研究(二):完善上一节的问题
- HTML5 创建手机滚珠子小游戏 (一)
- GCD (四) 完结
- HTML5刮刮卡 (支持手机...)
- Cocos2d-x格斗小游戏(九) 完结
- html5小游戏(-)待续
- 记分牌
- Python 猜数字小游戏 (带闯关关卡)
- Python-猜数字小游戏-(带闯关关卡)
- GCD介绍(四): 完结
- GCD介绍(四): 完结
- GCD介绍(四): 完结
- GCD介绍(四): 完结
- GCD教程(四):完结
- GCD介绍(四): 完结
- GCD介绍(四): 完结
- jQuery中each的break和continue
- SpringMVC框架介绍
- 零碎的学习笔记一
- IE弹出Visual Studio 实时调试器的解决办法
- 订餐系统:MUI开发手机端前台,页面加载后number-box增减按钮不可用
- HTML5小游戏研究(四):完结:增加多个关卡,手机支持, 记分牌
- Spring Bean
- ORACLE SPA
- VS 2012 类视图和对象浏览器图标
- 集合
- MySQL中NULL和空值对比
- hdu 1242 Rescue(BFS)(犯晕)
- IDEA Tomcat部署
- 基本数据类型