JavaScript实现重力下落与弹性效果的方法分析


Posted in Javascript onDecember 20, 2017

本文实例讲述了JavaScript实现重力下落与弹性效果的方法。分享给大家供大家参考,具体如下:

这里利用JS语言在Html页面中实现重力作用下落地后弹起的效果,如下所示:

JavaScript实现重力下落与弹性效果的方法分析

在此例中主要涉及以下几个问题:

1.给球体一个释放初速度,如何实现越向下运动且在接触边缘之前,竖直方向上的速度speedY越大的效果?
答案:可以在计时器中,每及时一次,竖直方向上的速度speedY自增一个固定值来实现,下面代码中speedY += 6;就是实现这个效果。

2.球体接触地面(此例中指浏览器下边缘)后,如何实现速度反向效果?
答案:接触地面后,将方向速度置为当前速度的反方向即可,代码if (iW >= w||iW <= 0){speedX = -speedX;}if中条件表示如果超出运动范围,实现水平方向接触边缘后运动方向相反,代码if (iH >= h||iH <= 0){speedY = -speedY;}则表示Y方向接触边缘后速度变反。

3.球体接触地面反弹后,如何实现再次上升的高度低于上一次高度的效果?
答案:在接触地面后,速度变为负值,计时器开始执行下一个间隔,立即执行了speedY += 6,弹起速度立刻减小了6,其大小相对接触地面前一瞬间小,因此球体不会弹跳到原来的高度。

4.如何实现球体竖直方向上的速度绝对值越来越小直至逼近于0的效果?
答案:事实上,仅利用speedY += 6;此例中竖直方向上速度speedY不可能达到0,因为在该函数设置好了初速度的前提下,某一次落地速度不可能为6(通过后来打印速度每次执行结果可以确定),所以下一次执行不可能为0,那么究竟是怎样实现落到地面静止的效果的呢?实际上,当把speedY增加值设置为6时,当球体某一次落地瞬间它的速度是1,2,3,4,5中的任何一个值是,经加上6后反弹瞬时速度分别为-5,-4,-3,-2,-1,经过一个计时器周期(此例中为30毫秒),速度再加6立刻变为1,2,3,4,5,下一次速度变为-5,-4,-3,-2,-1......,由于speedY += 6在计时器的头处,因此最终结果将总是在加6之前,停留在-5,-4,-3,-2,-1.中的任何一个数值,且计时器始终处于动态,最终球体显示在底部。

5.当球体释放后,也具备有个横向速度speedX,如何使横向速度也逐渐减小值0?
答案:此例中不需要考虑x方向的碰撞,因此每次计时可将speedX乘以一个小于1的数,最终的speedX值将无限趋近于0,显示为静止。
当拖动窗口时如何实现不出现滚动条的效果?
答案:拖动后浏览器窗口后,对球体设置新的运动范围即可。

实现代码及解析如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>弹性运动</title>
    <style type="text/css">
      #div {
        width: 100px;
        height: 100px;
        background: green;
        position: absolute;
        border-radius: 50%;
      }
    </style>
  </head>
  <body>
    <script type="text/javascript">
      //window.onload表示等页面标签内容加载完之后再加载window.onload里面的内容
      window.onload = function(){
        //分别设置div在x和y方向的的初速度
        var speedX = 2;
        var speedY = 3;
        //获取div标签
        var div = document.getElementById("div");
        //获取按钮
        var btn = document.getElementById("btn");
        //定义点击事件
        btn.onclick = function(){
          startMove();
        };
        //定义一个空的定时器,防止上次事件定时器的返回值叠加
        var timer = null;
        //定义点击事件函数
        function startMove(){
          //内部清空计时器,防止上次返回值叠加
          clearInterval(timer);
          //设置计时器
          timer = setInterval(function(){
            //竖直方向上反向运动时速度为负值,为了达到反弹逐渐速度逐渐减小的效果,可以在向下碰撞后速度加上一个正值
            speedY += 6;
            //分别获取div距离左边距和上边距的动态距离
            var iW = div.offsetLeft + speedX;
            var iH = div.offsetTop + speedY;
            //获取div水平方向运动的最大距离,即不包含边框的浏览器窗口的宽度clientWidth减去div的宽度
            var w = document.documentElement.clientWidth - div.offsetWidth;
            //获取div垂直方向运动的最大距离
            var h = document.documentElement.clientHeight - div.offsetHeight;
            //当动态宽度达到div最大运动宽度范围时,立刻转换速度为反方向负值,同时把w的值负值给iw,因为w是可视窗口范围,当w缩小时,iw保存的还是上一次窗口条件下的距离左边距的距离
            if (iW >= w||iW <= 0){speedX = -speedX;iW = w;}
            //当动态高度达到div最大运动高度范围时,立刻转向速度,同时将x方向速度乘以0.8,使之速度逐渐减小
if (iH >= h||iH <= 0){speedY = -speedY;iH = h;speedX *= 0.95;}
            //由于div.style.left和div.style.top还储存这上一次或第一次的计时后的值,此次计时后应把新的值储存起来,使div出现动态效果
            div.style.left = iW + "px";
            div.style.top = iH + "px";
            console.log(speedX);
          },30);
        }
      }
    </script>
    <input type="button" name="btn" id="btn" value="开始运动" />
    <div id="div"></div>
  </body>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
Apr 12 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
May 08 Javascript
关于jQuery的inArray 方法介绍
Oct 08 Javascript
JavaScript实现网页上的浮动广告的简单方法
Jun 14 Javascript
js和as的稳定传值问题解决
Jul 14 Javascript
js 获取radio按钮值的实例
Aug 17 Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
浅析JS获取url中的参数实例代码
Jun 14 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
JavaScript事件冒泡机制原理实例解析
Jan 14 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 #Javascript
vue.js $refs和$emit 父子组件交互的方法
Dec 20 #Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
Dec 20 #jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 #Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 #Javascript
详解vue mixins和extends的巧妙用法
Dec 20 #Javascript
canvas轨迹回放功能实现
Dec 20 #Javascript
You might like
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
导游欢迎词范文
2015/01/23 职场文书
学校捐款活动总结
2015/05/09 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
亮剑观后感600字
2015/06/05 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android