• 用原生js写小游戏--Flappy Bird


    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title></title>
        <style type="text/css">
             body {
                margin: 0;
                padding: 0;
            }
    
            #game {
                width: 800px;
                height: 600px;
                border: 1px solid #000;
                background: url(images/sky.png);
                overflow: hidden;
                position: relative;
            }
    
            #game .pipeD {
                background: url(images/pipe1.png) top center;
                position: absolute;
            }
    
            #game .pipeU {
                background: url(images/pipe2.png) bottom center;
                position: absolute;
            }
    
            #bird {
                width: 34px;
                height: 25px;
              /*  border-radius: 10px;
                background-color: red;*/
                position: absolute;
                top: 100px;
                left: 100px;
                background: url(images/birds.png) -8px -10px no-repeat;
            }
        </style>
     
    </head>
     
    <body>
     
        <div id="game">
            <div id="bird"></div>
        </div>
    </body>
    <script type="text/javascript">
        var birdElement = document.getElementById("bird");
        var game = document.getElementById("game");
        var gameover = false;
        var g = 1;
        // var i = 0;
        var timer=null;
        var bird = {
            x: birdElement.offsetLeft,
            y: birdElement.offsetTop,
            speedX: 5,
            speedY: 0,
            start: birdElement
        };
        var sky = {
            x: 0
        };
     
    
     game.onclick=function(){
    
        setInterval(function () {
            //游戏没有结束的时候运行代码
            if (!gameover) {
    
                //整个游戏背景x轴移动的距离
                sky.x = sky.x - bird.speedX;
                game.style.backgroundPositionX = sky.x + "px";
                //小鸟下落时y轴的坐标
                bird.speedY = bird.speedY + g;
                //设置一个变量用来接收小鸟下落时y轴的坐标,用来设置小鸟下降时的速度
                var step = bird.speedY;
                bird.y = bird.y + step;
                
               
                //用一个变量来设定小鸟下落的最低高度,用来 判断游戏是否结束
                var overY = game.offsetHeight - birdElement.offsetHeight;
    
                //小鸟的y轴坐标大于最低高度,所以游戏停止
                if (bird.y > overY) {
                    bird.y = overY;
                    stop(sky.x);
                }
                //小鸟的y轴坐标小于0,说明碰到顶部边框,所以游戏结束
                if (bird.y < 0) {
                    bird.y = 0;
                    stop(sky.x);
                }
                //设置游戏开始时小鸟出现的位置
                bird.start.style.top = bird.y + "px";
                // console.log(bird.x)
            }
        }, 30);
    
        //添加键盘事件,实现键盘上下键控制小鸟
        document.onkeyup = function (e) {
            if (e.keyCode === 38) {
                bird.speedY = -10;
            }
        }
    
         
        function Pipe(positonX) {
            //管子的坐标
            this.x = positonX;
            this.upPipeY = 0;
            this.width = 52;
            this.upPipeH = random(100,275);
            this.downPipeY = this.upPipeH + 200;
            this.downPipeH = game.offsetHeight - this.downPipeY;
            // 动态添加管子
            var divUp = document.createElement("div");
            divUp.className = "pipeU";
            divUp.style.width = this.width + "px";
            divUp.style.height = this.upPipeH + "px";
            divUp.style.left = this.x + "px";
            divUp.style.top = this.upPipeY + "px";
            game.appendChild(divUp);
            var divDown = document.createElement("div");
            divDown.className = "pipeD";
            divDown.style.width = this.width + "px";
            divDown.style.height = this.downPipeH + "px";
            divDown.style.left = this.x + "px";
            divDown.style.top = this.downPipeY + "px";
            game.appendChild(divDown);
            //因为定时器会混乱this的指向问题,所以提前保存this的指向,这里的this指向调用该方法的实例
            var that = this;
            // 设置定时器让管子向后移动
            this.timer=setInterval(function () {
                //这里1控制的是管子移动的速度  数字越大 难度越高
                that.x = that.x - 5;
                //简单实现管子无缝滚动,视觉差
                if (that.x < -52) {
                    that.x = 800;
                }
                if (!gameover) {
                    divUp.style.left = that.x + "px";
                    divDown.style.left = that.x + "px";
                }
                // 设置变量,进行游戏碰撞检测,并停止游戏
                var downBoom = (bird.x + 34 > that.x) && (bird.x < that.x + 52) && (bird.y + 25 > that.downPipeY);
                var upBoom = (bird.x + 34 > that.x) && (bird.x < that.x + 52) && (bird.y < that.upPipeH);
                if (downBoom || upBoom) {
                    //gameover = true;
                    stop(sky.x);
                }
            }, 30);
        }
        //执行上面的函数方法
        var arr=[];
        for (var i = 0; i < 4; i++) {
            arr[i]=new Pipe(i * 200 + 400);
        }
        //封装一个用来停止游戏的方法,
        function stop(Sky){
            var a;
            gameover=true;
            clearInterval(timer);
            for(var i=0;i<arr.length;i++){
                clearInterval(arr[i].timer);
            }
            if(Math.abs(Sky)<=352){
                a=0;
                alert("成绩:"+a)
            }else{
                a=Math.floor((Math.abs(Sky)-300)/200+1);
                // a=Math.ceil(((Math.abs(Sky)-300))/200);
                alert("成绩:"+a)
            }
            // console.log(Sky)
        }
    }
    
    function random(a,b){
        return Math.round(Math.random()*(a-b)+b)
    }
    
        
    </script>

    效果如下

  • 相关阅读:
    Python学习笔记(10):异常
    SharePoint中RichTextBox的Required验证
    Python学习笔记(6):模块
    Python学习笔记(4):控制流
    Python学习笔记(5):函数
    解决SharePoint中GridView导出Excel按钮的问题
    Python学习笔记(8):面向对象
    如何在SharePoint中创建Custom Master Page
    main cannot be resolved or is not a field
    c# 格式化输出字符串
  • 原文地址:https://www.cnblogs.com/zhouqingfeng/p/12047306.html
Copyright © 2020-2023  润新知