<!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>

飞扬的小鸟JavaScript实现相关推荐

  1. Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

    文章目录 T1:Star Way To Heaven 题目 题解 代码实现 T2:飞扬的小鸟 题目 题解 代码实现 T1:Star Way To Heaven 题目 小 w 伤心的走上了 Star w ...

  2. c++飞扬的小鸟游戏_通过建立一个飞扬的鸟游戏来学习从头开始

    c++飞扬的小鸟游戏 Learn how to use Scratch 3.0 by building a flappy bird game in this course developed by W ...

  3. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  4. Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)

    Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...

  5. 洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 链接:https://www.luogu.org/problemnew/show/P1941 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击 ...

  6. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一款风 ...

  7. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  8. python之flappy bird(飞扬的小鸟)小游戏分享,内附源码哦~

    导语: 哈喽,哈喽~今天小编又来分享小游戏了--flappy bird(飞扬的小鸟),这个游戏非常的经典,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍.这个游戏能对于小编来说还是有点 ...

  9. JAVA项目:Java实现飞扬的小鸟(Flappy Bird)

    飞扬的小鸟(Flappy Bird) 需求描述 游戏加载完毕点击界面即可开始游戏. 鼠标点击控制小鸟飞行,或者通过键盘控制小鸟的前后上下也可以,不要撞到管道哦! 控制好小鸟越过障碍飞得更远,获得更高的 ...

最新文章

  1. 三周第五次课) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间
  2. 关于gradle加快构建速度采用阿里云中央仓库的配置
  3. yum 安装报Header V3 DSA signature: NOKEY 的错
  4. Linux入门笔记——系统目录结构
  5. Android增量代码测试覆盖率工具
  6. 面向智能电网的电力大数据存储与分析应用
  7. Android ListView下拉与上拉刷新加载更多(一)
  8. vue(组件、路由)懒加载
  9. 数据结构——第十章 排序
  10. ArcGIS多面体(multipatch)解析——引
  11. android 打开微信代码,微信跳转浏览器或提示手机端打开HTML代码
  12. 汇编_stack的使用
  13. fromLocal8Bit()函数
  14. 如何下载网页上的视频
  15. 搭建供需对接平台 助力汽车产业发展 2021大连金普新区汽车产业链供需对接大会开幕
  16. 数据库常用的操作命令
  17. HBuilderX 安装教程
  18. 小码哥-斗鱼直播APP之弹出房间界面
  19. element ui加入甘特图
  20. LXC、LXD、Docker的区别与联系

热门文章

  1. STM32F767--->时钟
  2. mysql索引长度超过767bytes问题解决。Specified key was too long; max key length is 767 bytes
  3. token放在cookie中和放在请求头中的区别
  4. Clipper库中文帮助文档
  5. 基于STM32的常用数码管芯片TM1650驱动
  6. D55_BMS_IntefaceBoard_RevA接口板电路设计图
  7. 牛客多校第八场 Enigmatic Partition(DP)
  8. 用计算机测出人家的信息,NCAE 信息化办公模拟题 含答案
  9. C#学习笔记 01.01
  10. 一个很好用的maven settings.xml 配置文件镜像