美文网首页Web 前端开发
原生JS实现游戏动画-锅打灰太狼

原生JS实现游戏动画-锅打灰太狼

作者: 蘩蕐皆成空 | 来源:发表于2017-05-10 20:01 被阅读0次

    这篇我们要讲的是用原生JS实现游戏动画-锅打灰太狼。
    请先打开此网站http://pan.baidu.com/s/1kVFmmZd下载素材。
    依然是源码加注释讲解。
    有兴趣的朋友可以对照着把这个改成使用jQuery完成。

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title></title>
        <style media="screen">
          *{
            margin: 0;
            padding: 0;
          }
          /*游戏背板*/
          #waper{
            position: relative;
    
            width: 320px;
            height: 480px;
            margin: 0 auto;
    
            background-image: url('./images/game_bg.jpg');
            background-repeat: no-repeat;
            background-size: 100%;
          }
          /*得分*/
          #score_box{
            position: absolute;
            left: 60px;
            top:11px;
    
            font-size: 20px;
            font-weight: bold;
            color: white;
          }
          /*计时器样式*/
          #progress_box{
            position: absolute;
            left: 63px;
            top: 66px;
    
            width: 180px;
            height: 18px;
    
            background-image: url('./images/progress.png');
            background-repeat: no-repeat;
            background-size: 100% 100%;
          }
          #wolf_box img{
            position: absolute;
          }
          /*开始菜单*/
          #menu{
            position: absolute;
            left: 0;
            top: 200px;
    
            width: 320px;
    
            text-align: center;
          }
          #star,#handle,#gameOver{
            font-size: 30px;
            line-height: 50px;
            font-weight: bold;
            color: #f60;
    
            cursor: pointer;
          }
          /*结束菜单*/
          #gameOver{
            position: absolute;
            left: 0;
            top: 200px;
    
            width: 320px;
            height: 200px;
    
            text-align: center;
            display: none;
          }
        </style>
      </head>
      <body>
          <!-- 游戏界面 -->
          <!-- 游戏背板 -->
          <div id="waper">
            <!-- 游戏积分器 -->
            <div id="score_box">0</div>
            <!-- 游戏计时器 -->
            <div id="progress_box"></div>
            <!-- 狼容器 -->
            <div id="wolf_box"></div>
    
            <!-- 游戏开始菜单 -->
            <div id="menu">
                <div id="star">开始</div>
                <div id="handle">游戏介绍</div>
            </div>
            <!-- 游戏结束菜单 -->
            <div id="gameOver">游戏结束</div>
          </div>
      </body>
      <script type="text/javascript">
        // 获取到页面中所有的节点
        // 分数
        var scoreBox = document.querySelector('#score_box');
        //计时器进度条
        var progressBox = document.querySelector('#progress_box');
        //存放狼图片的容器
        var wolfBox = document.querySelector('#wolf_box');
        //游戏开始菜单
        var menu = document.querySelector('#menu');
        //开始游戏按钮
        var star = document.querySelector('#star');
        //结束游戏按钮
        var gameOver = document.querySelector('#gameOver')
        //下面的console.log是为了测试下我们的获取有没有出现问题
        // console.log(scoreBox);
        // console.log(progressBox);
        // console.log(wolfBox);
        // console.log(menu);
        // console.log(star);
        // console.log(gameOver);
    
        // 保存创建狼的定时器
        var createWolfTimer = null;
        // 狼诞生的坐标 就是在哪个洞里钻出来
        var arrPos = [
                {left:"98px",top:"115px"},
                {left:"17px",top:"160px"},
                {left:"15px",top:"220px"},
                {left:"30px",top:"293px"},
                {left:"122px",top:"273px"},
                {left:"207px",top:"295px"},
                {left:"200px",top:"211px"},
                {left:"187px",top:"141px"},
                {left:"100px",top:"185px"}
        ]
        // 开始游戏按钮的触发游戏开始
        star.onclick = function(){
          //调用开始游戏的函数
          gameStarFn()
        }
        //定义开始游戏的函数
        function gameStarFn() {
          //1、隐藏开始菜单
          menu.style.display='none'
          // 2、开启定时器
          progressFn()
          // 3、控制灰太狼的出现和消失 频率:0.8秒出现一次
          createWolfTimer = setInterval(function(){
            // 3、1 创建灰太狼并保存下来
              var wolf = createWolf();
            // 3、2让狼站起来、蹲下去
              wolf.appearTimer = setInterval(function(){
                // 让保存狼图片的下标的属性增加1
                  wolf.index++;
                // 如果下标超过5,则需要让狼下蹲操作
                if(wolf.index>=5){
                  // 执行蹲下去的操作
                  clearInterval(wolf.appearTimer);
                  // 调用让狼蹲下去的操作
                  wolf.disapper()
    
                }else{
                  // 把下一张狼的图片配置进去
                  wolf.src = './images/'+wolf.type+wolf.index+'.png';
                }
              },150)
              // 定义让狼蹲下去的方法
              wolf.disapper = function(){
                wolf.disapperTimer = setInterval(function(){
                  wolf.index--;
                  // 判断下标是否为0;
                  if(wolf.index<=0){
                    // 清理下蹲定时器
                    clearInterval(wolf.disapperTimer);
                    //清理img标签
                    // 如果盛放狼图案的标签中有子元素,则清除子元素
                    wolfBox.children.length > 0 && wolfBox.removeChild(wolf);
                  }else{
                    wolf.src='./images/'+wolf.type+wolf.index+'.png';
                  }
                },150)
              }
              //给狼添加打击事件
              beatWolf(wolf);
          },800)
        }
    
    
    
        // 定义开启定时器函数
        function progressFn(){
          // 获取到进度条的总长
          var progressLength = progressBox.offsetWidth;
          // console.log(progressLength);
          // 开启定时器,每隔0.1秒钟,修改一次进度条
          var progressTimer = setInterval(function(){
            //判断总长度是否为零,为零则清掉定时器
            if(progressLength<=0){
              clearInterval(progressTimer)
              // 结束游戏
              gameOverFn();
            }else{
              progressLength -= 1
            }
            progressBox.style.width = progressLength+'px';
          },100)
        }
        // 定义创建狼的函数
        function createWolf(){
          // 创建img标签。配置参数,拼进文档流
          var wolf = document.createElement('img')
          // 控制灰太狼和小灰灰出现的比例:8:2
          wolf.type = rand(0,100)<80? 'h' : 'x';
          // 用来保存当前灰太狼图片标号
          wolf.index = 0;
          // 给img标签设置属性
          wolf.src = './images/'+ wolf.type + wolf.index+'.png';
          // 获取狼诞生的坐标点
          var point = rand(0,9)
    
          wolf.style.left = arrPos[point].left;
          wolf.style.top = arrPos[point].top;
          // 把狼图标拼接进文档流
          wolfBox.appendChild(wolf);
          return wolf;
        }
    
        // 定义打击狼的函数
        function beatWolf(wolf){
          // 标识符  标示狼是否已经被打击
          wolf.beat = false;
          //给狼添加点击事件函数
          wolf.onclick = function(){
            // 判断是否已经打击过该狼
            if(wolf.beat){
              return;
            }
            // 如果上面的分支未执行,则标示狼未被打击,执行打击逻辑
            // 把狼的标签为已打击状态
            wolf.beat = true;
            // 计算分数
            scroing(wolf);
            // 执行被打击时的动画效果
            // 把狼站起来和蹲下去的代码清理掉
            clearInterval(wolf.appearTimer);
            clearInterval(wolf.disapperTimer);
    
            wolf.index = 5;
            wolf.beatInter = setInterval(function(){
              wolf.index++;
              // 判断图片下标是否到9
              if(wolf.index>=9){
                // 清理当前定时器
                clearInterval(wolf.beatInter);
                // 移除标签
                wolfBox.removeChild(wolf);
                return
              }
              // 修改狼被打击的效果
              wolf.src = './images/'+wolf.type+wolf.index+'.png'
            },150)
          }
        }
          //定义点击结束按钮时,让他从新来一局
          gameOver.onclick =function () {
              // 还原进度条和计分器  隐藏“游戏结束”四个字
            progressBox.style.width='180px';
            scoreBox.innerHTML=0;
            gameOver.style.display = 'none'
            //  调用开始函数
            gameStarFn()
          }
    
        // 定义积分器函数
        function scroing(wolf){
          // 获取到当前的得分
          var score  = parseInt(scoreBox.innerHTML)
          // 根据用户打击的狼类型,计算得分
          if(wolf.type=='h'){
            scoreBox.innerHTML=score+10;
          }else {
            scoreBox.innerHTML = score - 10;
          }
    
        }
        //定义游戏结束函数
        function gameOverFn(){
          //弹出游戏结束菜单
          gameOver.style.display = 'block'
          // 清理创建狼的定时器
          clearInterval(createWolfTimer);
        }
        // 定义指定范围的随机函数
        function rand(min,max){
          return parseInt(Math.random()*(max-min)+min);
        }
      </script>
    </html>
    
    

    相关文章

      网友评论

        本文标题:原生JS实现游戏动画-锅打灰太狼

        本文链接:https://www.haomeiwen.com/subject/bqogtxtx.html