飞扬的小鸟JavaScript实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
/*游戏界面*/
#wrap{
width: 343px;
height: 480px;
background: url('bg.jpg');
margin: 0 auto;
position: relative;
overflow: hidden;
}
/*得分*/
#score_box{
width: 56px;
height: 39px;
position: absolute;
left: calc(50% - 28px);
top: 30px;
font-size: 0;
z-index: 100;
}
/*开场动画*/
#flash{
width: 236px;
height: 77px;
background: url('head.jpg');
position: absolute;
left: calc(50% - 118px);
top: 90px;
animation: flash 1s infinite alternate;
}
@keyframes flash{
from{
top: 90px;
}to{
top: 120px;
}
}
#flash div{
width: 40px;
height: 26px;
background: url('bird0.png');
position: absolute;
right: 0;
top: 18px;
animation: birdFly 0.5s infinite;
}
@keyframes birdFly{
from{
background: url('bird0.png');
}to{
background: url('bird1.png');
}
}
/*开始按钮*/
#start_btn{
width: 85px;
height: 29px;
background: url('start.jpg');
position: absolute;
left: calc(50% - 43px);
top: 300px;
}
/*马路*/
#banner{
width: 686px;
height: 14px;
position: absolute;
background: url(banner.jpg);
left: 0;
bottom: 43px;
animation: run 1s infinite linear;
}
@keyframes run{
from{
left: 0;
}to{
left: -343px;
}
}
/*小鸟*/
#bird{
width: 40px;
height: 30px;
position: absolute;
left: 30px;
top: 30px;
display: none;
}
/*小鸟死亡样式*/
.die{
top: 393px !important;
transition: all .5s linear;
}
.pipe{
width: 62px;
}
.pipe_t_box{
/*height: 100px;*/
position: absolute;
left: 418px;
top: 0;
background: url(up_mod.png);
}
.pipe_t_box img{
position: absolute;
bottom: 0;
}
.pipe_b_box{
/*height: 100px;*/
position: absolute;
left: 418px;
bottom: 57px;
background: url(down_mod.png);
}
.pipe_b_box img{
position: absolute;
top:0;
}
</style>
</head>
<body>
<!-- 游戏界面 -->
<div id="wrap">
<!-- 得分 -->
<div id="score_box">
<img src="0.jpg" id="ten">
<img src="0.jpg" id="one">
</div>
<!-- 开场动画 -->
<div id="flash">
<!-- <img src="bird0.png" alt=""> -->
<div></div>
</div>
<!-- 开始按钮 -->
<div id="start_btn"></div>
<!-- 马路 -->
<div id="banner"></div>
<!-- 游戏开始后的小鸟 -->
<img src="down_bird0.png" id="bird">
<!-- 柱子的模板 -->
<!-- <div class="pipe_t_box pipe">
<img src="up_pipe.png" alt="">
</div>
<div class="pipe_b_box pipe">
<img src="down_pipe.png" alt="">
</div> -->
</div>
</body>
<script>
//小鸟运动最大范围值
var maxH = 393;
// 小鸟运动的计时器
var birdTimer;
// 小鸟运动的速度
var speed = 0;
// 管到高度范围: min 69 max 393-60
var blank = 100;
var maxPipe = 393-60-blank;
var minPipe = 60;
// 获取页面中所有的管道(会动态改变)
var pipes = document.getElementsByClassName("pipe");
// Defen
num= 0;
//开始按钮
start_btn.onclick = function(e){
var e = e || window.event;
if (e.stopPropagation) {
e.stopPropagation();
}else{
e.cancleBubble = true;
}
// 隐藏开始按钮
this.style.display = "none";
// 隐藏开始动画
flash.style.display = "none";
// 显示小鸟
bird.style.display = "block";
birdFly();
var pipeTimer = setInterval(createPipe,2500);
}
// 小鸟运动的函数
function birdFly(){
birdTimer = setInterval(function(){
// 获取小鸟当前位置
var t = bird.offsetTop;
// 速度发生改变(小鸟并非匀速下落)
speed+=0.5;
// 对速度进行限制
if (speed >= 10) {
speed = 10;
}
// 切换小鸟飞行状态
if (speed > 0) {
// 说明小鸟在向下运动
bird.src = "down_bird0.png";
}else{
// 小鸟在向上运动
bird.src = "up_bird0.png";
}
// 改变位置
t+= speed;
// 对小鸟运动范围判断
if (t <= 0) {
t = 0;
}
if (t >= maxH) {
t = maxH;
clearInterval(birdTimer);
}
bird.style.top = t + "px";
// 判断碰撞
for(var i = 0 ; i < pipes.length ; i++){
if (isCrash(bird,pipes[i])) {
// 如果碰撞游戏结束
// 小鸟死亡样式
bird.className = "die";
// 关闭马路动画
banner.style.animationPlayState = "paused";
// 关闭页面中所有正在运行的计时器
clearTimer();
}
}
},30)
}
// 小鸟起飞 当点击开始按钮发现小鸟向上飞一下原因是事件事件冒泡 需要阻止
document.onclick = function(){
speed = -7;
}
// 创建管道的函数
function createPipe(){
var flag = true;
// 上管道
var pipeUp = document.createElement("div");
// 记录管道是否加过分数
pipeUp.className = "pipe_t_box pipe";
// 为管到设置高度
var upHeight = randomNum(minPipe,maxPipe);
pipeUp.style.height = upHeight + "px";
var imgUp = new Image();
imgUp.src = "up_pipe.png";
pipeUp.appendChild(imgUp);
// 下管道
var pipeDown = document.createElement("div");
pipeDown.className = "pipe_b_box pipe";
// 为下管道设置高度
pipeDown.style.height = maxH - upHeight - blank +"px";
var imgDown = new Image();
imgDown.src = "down_pipe.png";
pipeDown.appendChild(imgDown);
wrap.appendChild(pipeUp);
wrap.appendChild(pipeDown);
// 管道运动
var timer = setInterval(function(){
// 获取管道位置
var l = pipeDown.offsetLeft;
if (flag) {
if (bird.offsetLeft > pipes[0].offsetLeft+ pipes[0].offsetWidth) {
getNum();
// 标记为不可再加分
flag = false;
}
}
// 改变管道位置
l-=3;
pipeUp.style.left = l + "px";
pipeDown.style.left = l + "px";
// 运动范围进行判断
if (l <= -70) {
clearInterval(timer);
// 清除管道
pipeUp.remove();
pipeDown.remove()
}
},30)
}
// 碰撞检测的函数
function isCrash(b,p){
// 获得元素位置
var bl = b.offsetLeft;
var bt = b.offsetTop;
var br = bl + b.offsetWidth;
var bb = bt + b.offsetHeight;
var pl = p.offsetLeft;
var pt = p.offsetTop;
var pr = pl + p.offsetWidth;
var pb = pt + p.offsetHeight;
// 对位置关系进行判断
if (bl>pr || bt > pb || br < pl || bb < pt) {
return false;
}else{
// 一定碰撞了
return true;
}
}
// 关闭页面中所有计时器
function clearTimer(){
// 为了确定当前页面中已经开启多少个计时器
// var x ;
// setInterval(function(){
// var x = setInterval(function(){},1)
// },1)
for(var i = 0 ; i <= 10000;i++){
clearInterval(i);
}
}
// 得分函数
function getNum(){
// 得分加1
num++;
if (num < 10) {
one.src = num+".jpg";
}else{
// 十位数图片
ten.src = parseInt(num/10)+".jpg";
// 个位数图片
one.src = num%10 +".jpg";
}
}
// 随机数函数
function randomNum(min,max){
return Math.floor(Math.random()*(max-min)+min);
}
</script>
</html>