Web 前端开发

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

2017-05-10  本文已影响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>

上一篇下一篇

猜你喜欢

热点阅读