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 相关文章推荐
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
Nov 18 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
用console.table()调试javascript
Sep 04 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
Sep 28 Javascript
Bootstrap前端开发案例二
Jun 17 Javascript
vue component组件使用方法详解
Jul 14 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
微信小程序如何使用globalData的方法
Jun 06 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
Feb 01 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 Javascript
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 fckeditor 调用的函数
2009/06/21 PHP
php解析xml方法实例详解
2015/05/12 PHP
PHP实现微信提现功能
2018/09/30 PHP
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
营销经理工作检讨书
2014/11/03 职场文书
汽车转让协议书
2015/01/29 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
Android实现图片九宫格
2022/06/28 Java/Android