飞机大战案例
- 需求:
- 页面中存在 飞机、子弹、敌机,敌机不断往下落下,飞机只在限定范围内移动,并且按下键盘中某个键值时开始发射子弹
- 当子弹射中敌机时,开始得分
- 当敌机射中飞机时,游戏结束,页面重新加载
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>plane</title>
<style>
* {
margin: 0;
padding: 0;
}
.container {
width: 500px;
height: 80vh;
background-color: #000;
margin: 10vh auto;
position: relative;
overflow: hidden;
}
.container .plane {
width: 120px;
height: 80px;
background: url(./img/1.png) no-repeat;
background-size: 100% 100%;
position: absolute;
bottom: 20px;
left: calc(50% - 60px);
}
.bullet {
width: 8px;
height: 22px;
background-color: gold;
border-radius: 10px 10px 0 0;
position: absolute;
}
.enemy {
width: 80px;
height: 50px;
background: url(./img/1.png) no-repeat;
background-size: 100% 100%;
position: absolute;
top: 0;
}
.score {
position: absolute;
color: red;
top: 0;
left: 50%;
transform: translate(-50%);
}
</style>
</head>
<body>
<h1 class="score">0</h1>
<div class="container">
<div class="plane">
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(function () {
let score = 0
let maxLeft = $('.container').innerWidth() - $('.plane').innerWidth()
let maxTop = $('.container').innerHeight() - $('.plane').innerHeight()
$(window).keydown(function ({ keyCode })
let { left: l, top: t } = $('.plane').position()
switch (keyCode) {
case 38:
t -= 10
break;
case 40:
t += 10
break;
case 37:
l -= 10
break;
case 39:
l += 10
break;
case 74:
shoot()
break;
default:
break;
}
if (t < 0) t = 0
if (l < 0) l = 0
if (t > maxTop) t = maxTop
if (l > maxLeft) l = maxLeft
$('.plane').css('top', t).css('left', l)
})
let endTime = new Date()
function shoot() {
if (new Date() - endTime < 500) return;
let bullet = $('<div/>').addClass('bullet')
$('.container').append(bullet)
bullet.css('top', $('.plane').position().top - 20)
bullet.css('left', $('.plane').position().left + $('.plane').innerWidth() / 2 - bullet.innerWidth() / 2)
endTime = new Date()
}
setInterval(() => {
$('.bullet').each(function () {
let bullet = $(this)
let { top } = bullet.position()
if (top < 0) bullet.remove()
else bullet.css('top', bullet.position().top - 10)
})
}, 100)
setInterval(() => {
let enemy = $('<div/>').addClass('enemy')
$('.container').append(enemy)
enemy.css('left', Math.round(Math.random() * ($('.container').innerWidth() - enemy.innerWidth())))
}, 2000)
setInterval(() => {
$('.enemy').each(function () {
let enemy = $(this)
let { top } = enemy.position()
if (top > $('.container').innerHeight()) enemy.remove()
else enemy.css('top', enemy.position().top + 20)
})
}, 200)
setInterval(() => {
$('.enemy').each(function(){
let enemy = this
if(calc(enemy,$('.plane').get(0)) || calc($('.plane').get(0),enemy)){
console.log('GG')
location.reload()
}
$('.bullet').each(function(){
let bullet = this
if(calc(enemy,bullet) || calc(bullet,enemy)){
bullet.remove()
enemy.remove()
score += 10
$('.score').text(score)
}
})
})
})
function getLTRB(node){
return {
l:node.offsetLeft,
t:node.offsetTop,
r:node.offsetLeft + node.offsetWidth,
b:node.offsetTop + node.offsetHeight
}
}
function calc(a,b){
a = getLTRB(a)
b = getLTRB(b)
if(b.l > a.l && b.l < a.r && b.t > a.t && b.t < a.b) return true
else if(b.l > a.l && b.l < a.r && b.b > a.t && b.b < a.b) return true
else if(b.r > a.l && b.r < a.r && b.b > a.t && b.b < a.b) return true
else if(b.r > a.l && b.r < a.r && b.t > a.t && b.t < a.t) return true
else return false
}
})
</script>
</body>
</html>