JavaScript 飞机大战

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>飞机大战</title>
<style>
	html,body{
		position: relative;
		width: 100%;
		height: 100%;
	}
	h1{
		font-size: 6rem;
		
		position: absolute;
		top: 20%;
		left: 50%;
		transform: translate(-50%,-50%);
		
		background: linear-gradient(to bottom,red,blue);
		-webkit-text-fill-color:transparent;
		-webkit-background-clip: text;
		
		z-index: 1;
		cursor: progress;
	}
	#tips{
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%,-50%);
		
		z-index: 1;
		
		font-size: 20px;
		
	}
	#tips svg{
		width: 30px;
		height: 30px;
	}
	#tips span{
		display: inline-block;
		height: 30px;
		line-height: 30px;
	}
	#start{
		font-size: 16px;
		font-weight: 800;
		text-align: center;
		line-height: 60px;
		
		width: 120px;
		height: 60px;
		
		border-radius: 80px 70px;
		margin: 0 auto;

		/*设置手型*/
		cursor: pointer;
		
		box-shadow: 1px 2px 0 1px #606060,
					-1px 0 0 1px #606060;
	}
	#start:hover{
		font-size: 20px;
		font-weight: 1.2em;
		background: url('img/start.gif');
		background-size: 100% 100%;
	}
	#canvas{
		
		background: url('img/background.png') repeat;
		
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%,-50%);
		
		z-index: 0;
	}	
</style>
</head>

<body>
<h1>飞机大战</h1>
<div id="tips">
	<div>
		<svg t="1586957990263" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4430" width="200" height="200"><path d="M489.90890884 1017.28884579l0-662.73273745L551.27305136 354.55610835 551.27305135 1017.28884579l-61.3641425-2e-8z" fill="" p-id="4431"></path><path d="M306.28092891 358.28692148L515.86227332 1.43220042l215.24570478 356.85472106-424.82704919 0z" fill="" p-id="4432"></path></svg>
		<svg t="1586958009679" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4551" width="200" height="200"><path d="M533.74591785 14.43962576l0 652.37753843L473.34059007 666.81716419 473.34059007 14.43962576l60.40532778 1e-8z" fill="" p-id="4552"></path><path d="M714.5047106 673.81131166L508.1980747 1025.0901777l-211.88249064-351.27886604 418.18912654 0z" fill="" p-id="4553"></path></svg>
		<svg t="1586958037827" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5320" width="200" height="200"><path d="M1017.28884579 534.09109115l-662.73273745 1e-8L354.55610835 472.72694864 1017.28884579 472.72694864l-2e-8 61.36414251z" fill="" p-id="5321"></path><path d="M358.28692148 717.71907109L1.43220042 508.13772668l356.85472106-215.24570478 0 424.82704919z" fill="" p-id="5322"></path></svg>
		<svg t="1586958054232" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6089" width="200" height="200"><path d="M6.71115421 489.90890885l662.73273745-1e-8L669.44389165 551.27305136 6.71115421 551.27305136l2e-8-61.36414251z" fill="" p-id="6090"></path><path d="M665.71307852 306.28092891L1022.56779958 515.86227332l-356.85472106 215.24570478 0-424.82704919z" fill="" p-id="6091"></path></svg>
	<span>移动方向</span></div>
	<div id="start">开始游戏</div>
</div>
<canvas id="canvas" width="600" height="700"></canvas>
<script>
	var canvas=document.getElementById("canvas");
	if(canvas.getContext){
		var cxt=canvas.getContext("2d");
	}else{
		console.log("你的浏览器不支持HTML5画板");
	}
	
	var scores=0;  //分数
	var bumps=[];  //数组,存放炮弹
	var armys=[];  //敌机
	var armyBumps=[];  //敌机炮弹
	
	
	//敌机类
	function Army(){
		this.x=parseInt(Math.random()*19)*30;
		this.y=20;
		this.w=30;
		this.h=30;
		armys.push(this);
		
		
	}
	//画敌机
	Army.prototype.paintArmy=function(){
		const img=new Image();
		img.src='img/plane-1.png';
		
		img.onload=()=>{
			cxt.drawImage(img,this.x,this.y,this.w,this.h);
		}
	}
	//敌机自动向前移动
	Army.prototype.move=function(){
		const img=new Image();
		img.src='img/plane-1.png';
		
		let armyY=armys.filter((item)=>{
			return item.y<=700;
		})
		armyY.forEach((item)=>{
			cxt.clearRect(item.x,item.y,item.w,item.h);
			item.y+=20;
		})

		armyY.forEach((item)=>{
			cxt.drawImage(img,item.x,item.y,item.w,item.h);
		})
			
	}
	
	
	//碰撞检测
	Army.prototype.boom=function(){
		armys.forEach((item,index)=>{
			bumps.forEach((em,dx)=>{
				if(em[0]>=item.x && em[0]<=item.x+item.w && Math.abs(item.y-em[1])<=item.h){
					setTimeout(()=>{
						//清除子弹
						cxt.clearRect(em[0],em[1],6,10);
						//清除敌机
						cxt.clearRect(item.x,item.y,item.w,item.h);
					},200)
					
					//重新弄画图
					let img1=new Image();
					img1.src="img/over-0.png";
					img1.onload=()=>{
						cxt.drawImage(img1,item.x,item.y,item.w,item.h);
					}
					
					setTimeout(()=>{
						cxt.clearRect(item.x,item.y,item.w,item.h);
					},150)
					
					let img2=new Image();
					img2.src="img/over-1.png";
					img2.onload=()=>{
						cxt.drawImage(img2,item.x,item.y,item.w,item.h);
					}
					
					setTimeout(()=>{
						cxt.clearRect(item.x,item.y,item.w,item.h);
					},150)
					
					let img3=new Image();
					img3.src="img/over-2.png";
					img3.onload=()=>{
						cxt.drawImage(img3,item.x,item.y,item.w,item.h);
					}
					
					setTimeout(()=>{
						cxt.clearRect(item.x,item.y,item.w,item.h);
					},150)
					
					let img4=new Image();
					img4.src="img/over.png";
					img4.onload=()=>{
						cxt.drawImage(img4,item.x,item.y,item.w,item.h);
					}
					
					setTimeout(()=>{
						cxt.clearRect(item.x,item.y,item.w,item.h);
					},150)
					
					//把两者从存储的数组中删除
					bumps.splice(dx,1);
					armys.splice(index,1);
					
					scores++;
					cxt.clearRect(0,0,100,20);
					score();
				}
			})
		})
	}
	
	
	//自己类
	function plane(){
		this.w=40;
		this.h=40;
		this.x=canvas.width/2-this.w/2;
		this.y=canvas.height-this.h;
	}
	
	//显示自己的飞机
	plane.prototype.paintPlane=function(){
		const img=new Image();
		img.src="img/plane-2.png";
		//等到图片加载完成才可以使用,否则width===0 && height===0
		//写一个回调函数
		img.onload=()=>{
			cxt.drawImage(img,this.x,this.y,this.w,this.h);
		}
	}
	//清除函数
	plane.prototype.clearPlane=function(){
		cxt.clearRect(this.x,this.y,40,40);
	}
	
	plane.prototype.moveLeft=function(){
		this.clearPlane();
		if(this.x>0){
			this.x-=10;
		}
		this.paintPlane();
	}
	
	plane.prototype.moveRight=function(){
		this.clearPlane();
		if(this.x+40<canvas.width){
			this.x+=10;
		}
		this.paintPlane();
	}
	
	
	//发射炮弹
	plane.prototype.fire=function(){
		const img=new Image();
		img.src="img/fire-0.png";
		img.onload=()=>{
			//定时器,0.3s一次
			setInterval(()=>{
				//过滤出界的
				let bump=bumps.filter((item)=>{
					return item[1]>=0;
				})
				//添加新的
				cxt.drawImage(img,this.x+17,this.y-10,6,10);
				//添加进存储的数组
				bumps.push([this.x+17,this.y-10]);
				//先清除
				bump.forEach((item)=>{
					cxt.clearRect(item[0],item[1],6,10);
					item[1]-=20;
				})
				//再绘画
				bump.forEach((item)=>{
					cxt.drawImage(img,item[0],item[1],6,10);
				})
				 
			},100)
		}
	}
	
	plane.prototype.gameOver=function(){
		armys.forEach((item)=>{
			if(item.x+30>=this.x && item.x<=this.x+this.w && this.y===item.y+30){
				return true;
			}
		})
	}
	
	//显示分数
	function score(){
		cxt.font="20px Arial";
		cxt.fillStyle="#000";
		cxt.fillText("分数:"+scores,3,20);
	}
	
	
	(function game(){
		var startgame=document.getElementById("start");
		startgame.addEventListener('click',startGame);
	
	
	
	function startGame(){
		document.getElementById("tips").style.opacity="0";
		document.getElementsByTagName("h1")[0].style.opacity="0";
		startgame.removeEventListener('click',startgame);
		score();
		
		var planes=new plane();
		planes.paintPlane();
		planes.fire();
		
		let time=setInterval(()=>{
			let army=new Army();
			army.paintArmy();
			army.move();
			//army.Fire();
			(function over(){
				army.boom();
				//canvas动画,自动补帧 window.requestAnimationFrame()函数
				window.requestAnimationFrame(over);
			})()
			
		},300)
		
		
		
		//键盘监听移动
		document.addEventListener('keydown',(event)=>{
			//left  37
				//right  39
				//up 38
				//down  40
			switch(event.keyCode){
				case 37:
					planes.moveLeft();
					break;
				
				case 39:
					planes.moveRight();
					break;
				/*
				case 38:
					planes.moveUp();
					break;
				case 40:
					planes.moveDown();
					break;
				*/
			}
		})
	}
		
	})()

</script>
</body>
</html>

下面是这个游戏的数据集
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
欢迎大家来找bug,或是提出修改的意见,大家一起进步。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值