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

这篇我们要讲的是用原生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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,463评论 25 707
  • 学习路线图引言: 黑马程序员作为一个平台,历经十年,免费公布了十几万小时真实课堂视频提供给IT自学者。但通过反馈,...
    rosekissyou阅读 5,474评论 8 216
  • 我一直是个女神。 初中,高中,大学.... “你好淑女喔”“真是个文静的姑娘”“好温柔啊”....我大方地接受了所...
    花词阅读 358评论 0 0
  • ——祥锐 201708012 笑盈盈掩去悲形,劝户外啼莺。 离歌别曲酣处,缓抒断肠声。 牵...
    祥鋭阅读 435评论 4 26