js实现跳一跳小游戏


Posted in Javascript onJuly 31, 2020

本文实例为大家分享了js实现跳一跳小游戏的具体代码,供大家参考,具体内容如下

效果

js实现跳一跳小游戏

流程分析

1、鼠标按下开始蓄力
2、鼠标松开,根据鼠标按下的时间让小球运动相应的距离
3、判断小球落点是否在平台内
4、如果在平台范围内,产生下一个平台,分数加10.如果不在游戏结束,判断分数是否大于历史最高分,更新历史最高分。

动画效果

5、鼠标按下小球所在平台要有蓄力效果,鼠标松开后慢慢恢复,
6、小球在空中的运动曲线要平滑
7、小球和平台要有3D效果

注意事项

8、运动涉及到计算器和延时器,要注意清除定时器以免扰乱动画效果
9、鼠标按下和松开为一个完整的流程,在小球运动完之前不能重复触发
10、确保小球运动的时间与鼠标按下的时间相关联

布局

<div class="wrap">
  <h3 class="tit">鼠标按下蓄力,松开鼠标小球开始运动</h3>
  <h1>分数:</h1>
  <h2>历史最高:</h2>
  <div class="con"></div>
  <div class="blc1"></div>
</div>

样式

* {
   margin: 0;
   padding: 0;
  }

  .wrap {
   height: 500px;
   position: relative;
   overflow: hidden;
  }

  .con {
   background-color: hotpink;
   /*左边的没有背景色,右边的加了背景色*/
   background-image: radial-gradient(10px at 4px 4px,
     rgba(0, 0, 0, 0),
     rgba(2, 2, 2, 1));
   width: 20px;
   height: 20px;
   border-radius: 50%;
   position: absolute;
   left: 30px;
   bottom: 30px;
   z-index: 2;
  }

  .blc1 {
   box-shadow: 10px 10px 7px #000;
   border-radius: 30%;
   width: 40px;
   height: 40px;
   background-color: midnightblue;
   position: absolute;
   left: 20px;
   bottom: 20px;
  }

  .tit {
   text-align: center;
  }

js

function randomInt(min, max) { //产生[min,max]范围内的整数
   return Math.round(Math.random() * (max - min)) + min;
  }

  function randomColor() { //产生随机的颜色
   var map = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];
   var str = '#';
   for (var i = 0; i < 6; i++) {
    var index = randomInt(0, 15);
    str += map[index];
   }
   return str;
  }
  var wrap = document.querySelector('.wrap');
  var con = document.querySelector('.con');
  var oldtime = 0; //记录鼠标按下的时间
  var timer2 = null; //小球平抛运动定时器
  var timer3 = null; //鼠标按下变形定时器
  var num = 0; //游戏成绩
  var mouseD = false; //记录鼠标是否按下
  var mouseUp = true; //记录鼠标是否松开
  var h1 = document.querySelector('h1');
  var h2 = document.querySelector('h2');
  var max = localStorage.getItem('max');
  var div = document.createElement('div'); //创建下一个平台
  h2.innerText = '历史最高:' + localStorage.getItem('max'); //从浏览器数据库获取最高分
  div.style.left = 35 + randomInt(30, 60) + 'px'; //初始化平台距离左边的值
  var div_sex = randomInt(30, 70); //初始化平台大小,范围
  div.style.bottom = 40 - div_sex / 2 + 'px'; //平台距离底部为小球底部减去平台
  div.style.height = div_sex + 'px';
  div.style.width = div_sex + 'px';
  div.className = 'blc1'; //添加初始化样式
  div.style.backgroundColor = randomColor(); //随机颜色
  wrap.appendChild(div); //存入平台
  document.onmousedown = function () { //监听页面点击事件
   if (!mouseD) { //如果鼠标按下没有抬起
    var blc = document.querySelectorAll('.blc1'); //获取所有平台
    oldtime = Date.now(); //记录鼠标按下的时间
    var target = blc[blc.length - 2]; //小球所在的平台
    var down_c = 10; //平台最大下沉距离
    var left = target.offsetLeft; //记录鼠标按下后下沉效果之前平台的left值
    var bottom = 40 - target.offsetHeight / 2; //记录鼠标按下后下沉效果之前平台的bottom值
    var con_l = con.offsetLeft; //记录鼠标按下后下沉效果之前小球的left值
    var con_b = 30; //记录鼠标按下后下沉效果之前小球的bottom值
    timer3 = setInterval(() => { //下沉效果定时器
     down_c -= 0.03; //每一次变化0.03px
     if (down_c <= 0) { //最小值为0
      down_c = 0.03;
     }
     target.style.boxShadow = down_c + 'px ' + down_c + 'px ' + down_c +
     'px #000'; //边框阴影向里缩,实现3D效果
     target.style.left = left + 10 - down_c + 'px';
     target.style.bottom = bottom + -10 + down_c + 'px';
     con.style.left = con_l + 10 - down_c + 'px';
     con.style.bottom = con_b - 10 + down_c + 'px'; //小球和平台一起向右下角移动,配合阴影达到3D效果
    }, 1);
    mouseD = true; //鼠标已经按下
    mouseUp = false; //鼠标即将松开
   }
  }
  document.onmouseup = function () {
   if (!mouseUp) { //如果没有触发mousedown事件不会执行以下代码
    mouseUp = true; //锁定事件,小球运动结束前不能执行以下代码
    clearInterval(timer3); //清除下沉动画
    var timer4 = null; //上升动画
    var blc = document.querySelectorAll('.blc1'); //获取所有平台
    var target = blc[blc.length - 2]; //同下沉动画
    var left = target.offsetLeft;
    var down_time = 0;
    var down_c = 0;
    var click_time = Date.now() - oldtime; //鼠标按下的时间
    var bottom = 40 - target.offsetHeight / 2 - (click_time * 0.03 > 10 ? 10 : click_time *
    0.03); //原来的bottom-下沉的距离,最大为10
    timer4 = setInterval(() => { //恢复原来的状态
     down_time++;
     if (down_time > click_time) {
      clearInterval(timer4);
     }
     down_c += 0.03;
     if (down_c >= 10) {
      down_c = 10;
     }
     target.style.boxShadow = down_c + 'px ' + down_c + 'px ' + down_c + 'px #000';
     target.style.left = left - down_c + 'px';
     target.style.bottom = bottom + down_c + 'px';
    }, 1);
    var clicktime = (Date.now() - oldtime) * 1.5; //小球运动时间为鼠标按下的1.5倍,减少蓄力时间
    var time2 = 0; //小球跳一跳计时器
    var y = 30; //小球初始bottom值
    var x = con.offsetLeft; //小球初始left值
    clearTimeout(tout); //清除延时器
    timer2 = setInterval(() => { //小球弹跳计时器
     time2 += 20;
     y = 30 + clicktime / 50 * Math.sin(time2 * Math.PI /
     clicktime); //将总的时间分成180份通过sin(0,180)从0到0的特性完成一个圆滑的抛物线
     con.style.left = x + time2 / 20 + 'px';
     con.style.bottom = y + 'px';
    }, 20);
    var tout = setTimeout(function () { //控制小球运动的时间与鼠标按下的时间*1.5相等,控制小球运动的时间
     clearInterval(timer2); //结束小球运动
     x = con.offsetLeft; //获取运动结束后小球的left值
     var blc = document.querySelectorAll('.blc1'); //获取所有的平台
     if (con.offsetLeft >= wrap.lastElementChild.offsetLeft && con.offsetLeft <= wrap
      .lastElementChild.offsetLeft + wrap.lastElementChild.offsetHeight - 10
      ) { //判断小球是否位于平台里面
      num += 10; //每跳一次加10分
      h1.innerText = '分数:' + num; //动态展示分数
      //生成下一个平台
      var div_sex2 = randomInt(40, 60);
      var newdiv = document.createElement('div');
      newdiv.style.bottom = 40 - div_sex2 / 2 + 'px';
      newdiv.style.height = div_sex2 + 'px';
      newdiv.style.width = div_sex2 + 'px';
      newdiv.style.left = x + randomInt(80, 120) + 'px';
      newdiv.style.backgroundColor = randomColor();
      newdiv.className = 'blc1';
      wrap.appendChild(newdiv);
     } else {
      alert('游戏结束,分数:' + num);
      max = max > num ? max : num;
      localStorage.setItem('max', max) //更新最高分
      location.reload(); //刷新当前页面
     }
     wrap.scrollLeft = wrap.scrollWidth; //控制滚动条位于最右边
     mouseD = false; //完成一次事件,重新开启
     mouseUp = true; //
    }, clicktime)
   }
  }

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
DOM 脚本编程中的兄弟节点
Oct 31 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
javascript自动给文本url地址增加链接的方法分享
Jan 20 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
利用Javascript实现BMI计算器
Aug 16 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
Mar 29 jQuery
bootstrap基本配置_动力节点Java学院整理
Jul 14 Javascript
ECMAScript6变量的解构赋值实例详解
Sep 19 Javascript
vue-better-scroll 的使用实例代码详解
Dec 03 Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
js实现翻牌小游戏
Jul 31 #Javascript
Vue 请求传公共参数的操作
Jul 31 #Javascript
vue2.0 解决抽取公用js的问题
Jul 31 #Javascript
vue实现公共方法抽离
Jul 31 #Javascript
js实现无缝轮播图插件封装
Jul 31 #Javascript
原生js滑动轮播封装
Jul 31 #Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 #Javascript
You might like
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
详解Python 切片语法
2019/06/10 Python
用python写测试数据文件过程解析
2019/09/25 Python
python实现打砖块游戏
2020/02/25 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
大学生入党思想汇报
2014/01/14 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
迎新生晚会主持词
2015/06/30 职场文书