用原生JS仿Flappy bird游戏

首先明白,这个游戏的鸟是X轴固定不动的,变的只是Y轴。这个游戏最难的就是碰撞检测

预览图:

在这里插入图片描述

下面贴代码↓↓

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<meta name="viewport" content="user-scalable=no" />
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
				list-style: none;
			}
			#bird{
				width: 50px;
				height: 50px;
				background-color: pink;
				position: absolute;
				left: 45%;
			}
			body{
				overflow: hidden;
			}
			/*上面柱子*/
			.topG{
				position: absolute;
				top: 0;
				width: 50px;
				left: 100%;
				background:black;
			}
			/*下面柱子*/
			.bottomG{
				position: absolute;
				width: 50px;
				background:black;
				left: 100%;
			}
		</style>
	</head>
	<body>
		<div id="bird"></div>
	</body>
	<script type="text/javascript">
		//返回上面柱子的高
		function random(min,max){
			return parseInt(Math.random()*(max-min+1)+min);
		};
		//碰撞检测
		function setBoom(objA,objB){
			
	var objBl = objB.offsetLeft;
	var objBt = objB.offsetTop;
	var objBr = objBl+ objB.offsetWidth;
	var objBb = objBt+ objB.offsetHeight;


	var objAt = objA.offsetTop + objA.offsetHeight;
	var objAl = objA.offsetWidth + objA.offsetLeft;
	var objAr = objA.offsetLeft;
	var objAb = objA.offsetTop;

	if(objAt>objBt && objAl>objBl && objBr>objAr && objAb < objBb){

		return true
	}
	else{
		return false;
	}
};
//生成上下2个柱子
		function zhuzi(){
		var oDiv=document.createElement('div');
		oDiv.className="topG";
		oDiv.leftData=100;//对象的私有属性
		var oDiv2=document.createElement('div');
		oDiv2.className="bottomG";
		oDiv2.leftData=100;//对象的私有属性
		var h=random(10,200);
		oDiv.style.height=h+'px';
		oDiv2.style.height=innerHeight-h-200+'px';//下面柱子的高等于页面高度-上面柱子高度-中间空隙高度
		oDiv2.style.top=h+200+'px';
		console.log(h);
		document.body.appendChild(oDiv);
		document.body.appendChild(oDiv2);
		
		};
		var last=setInterval(zhuzi,1500);//每1.5秒执行一次生成柱子函数
		clearInterval(bigtimer);
		var bigtimer=setInterval(function(){
			var allTopG=document.querySelectorAll('.topG');
			var allBottomG=document.querySelectorAll('.bottomG');
			
			for(var i=0;i<allTopG.length;i++){
				if(allTopG[i].leftData==-10){
				document.body.removeChild(allTopG[i]);
				document.body.removeChild(allBottomG[i]);
				continue;
			}
			    if(setBoom(bird,allTopG[i]) || setBoom(bird,allBottomG[i])){
				die = true;
				clearInterval(bigtimer);
				clearInterval(last);
			}
				allBottomG[i].style.left=allTopG[i].style.left=allTopG[i].leftData-1+'%';
				allTopG[i].leftData-=1;
			}
		},30);
		
      
		var timer=null;
		var iSpeed=0;
		var bird=document.getElementById('bird');
		var die=false;
		clearInterval(timer);
		timer=setInterval(function(){
			iSpeed++;
			var t=bird.offsetTop+iSpeed;//鸟的自由落体算法
			if(t<0){
				die=true;
				t=0;
				iSpeed=0;
				clearInterval(bigtimer);
				clearInterval(last);
				
			}
			if(t>innerHeight-bird.offsetHeight){
				die=true;
				iSpeed=0;
				clearInterval(bigtimer);
				clearInterval(timer);
				clearInterval(last);
			}
			bird.style.top=t+'px';
		},30);

//点击屏幕时触发
window.function(){
	iSpeed-=15;
}

	</script>
</html>

谢谢您的观看

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下载后可以在webstrom中打开运行。 1. underscore中random产生随机数、without从数组中移除数据 2. 在游戏开发的时候,应该始终用面向对象的思想来做。有一个游戏管控大类(Game)。 3. 用一个json文件,保存我们需要的图片数据,方便在内存中创建每一张图片对象。 4. canvas的宽度和高度不能固定,根据电脑动态设置。 5. 使用ES6语法创建类。 6. FPS (每秒传输帧数(Frames Per Second)) 刷新率FNO 记录当前走过总帧数 7. 在每一次canvas绘制之前,都要进行清屏操作。ctx.clearRect(0, 0, canvas.width, canvas.height); 8. 资源加载。通过AJAX加载资源。静态资源类StaticResourceUtil.js用来加载本地图片。 9. 图片绘制,背景类BackGround.js,用来绘制背景。 通过图片的移动实现游戏的移动。 图片的移动即不断改变图片的X坐标,不断绘制。 图片的无缝移动:绘制图片的两倍,当全部图片宽度走完的时候,将图片X重新改为0. 背景图的速度设置,事物离得越近速度越快,越远速度越慢。 10. 取整、字符串转数字:parseInt(txt); 11. 管道绘制,管道类Pipe.js,用来绘制管道。 管道的高度、位置要随机生成。 但要有最小高度与最大高度。 需要一个管道数组来保存所有的管道。 当管道移出画布,需要将管道从管道数组中移除。 12. 用gameEnd来标志游戏是否结束。 13. 鸟的绘制,鸟类bird.js,用来绘制鸟。 根据帧率不断煽动翅膀。 14. 模拟重力加速度,利用dY,不断更新鸟的y值。导致鸟的下落越来越快。 15. 鸟的旋转。利用save和restore保存和恢复画布的状态。 利用translate旋转画布的x、y轴,旋转鸟恢复。 16. 鼠标点击事件,在鸟的上升过程中,固定值模拟阻力。 17. 边界检测。上边界ycanvas.height - 地板高度 - 鸟高度 18. 碰撞检测。利用管道进行检测。首先判断鸟有没有进到管道竖着的区域,再判断鸟是在空白天空区域还是管道区域,从而进行检测。 19. 小鸟死亡,在死亡的地方绘制鲜血。鲜血撒完游戏结束。 20. 分数类。根据几位判断分数显示基准线。判断小鸟是否飞到管道竖着的部分,如果飞过,则分数加一。 21. 求一个数字有几位。num.toString().length 22. 游戏初始化。设置背景及图片,点击开始后div隐藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值