jQuery实现的分子运动小球碰撞效果


Posted in Javascript onJanuary 27, 2016

本文实例讲述了jQuery实现的分子运动小球碰撞效果。分享给大家供大家参考,具体如下:

先看效果图吧,因为小球是运动状态的,不好截图,这里就先大体画了一下路线,表示大体意思吧,如果想看真实的效果,自己粘贴下去运行:

jQuery实现的分子运动小球碰撞效果

小球有点小哟,嘿嘿,没有对细节进行详细的处理,如果像让它完美一点,自己处理下吧!这里是模拟的理想状态下的,没有摩擦力与组里的分子碰撞运动,高科技哟~~~~~~mu~a
代码也没有整理,如果有心的话,把它整理成面向对象形式的吧!

代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script src="jquery-1.7.1.min.js" type="text/javascript"></script>
  <script type="text/javascript" >
    var dim_half_past_PI = dimAngle(Math.PI / 2); // Math.PI/2的约数
    var lastAngle = dimAngle(Math.PI/8); // 发射角度(0-dimAngle(Math.PI))
    var v = 120; //飞行速度【>0】
    var lastPosition = {}; // 最后一次碰撞坐标
    var lastTime = ""; // 最后一次碰撞时间
    var lastDirection = "top"; // 开始发射方向(top,bottom,left,right)
    var horizen = 1; // 水品方向的积数
    var vertical = 1; // 竖直方向的积数
    var box = {};
    function dimAngle(angle) {
      var tempAngle = angle + "";
      return parseFloat(tempAngle.substring(0, 6));
    }
    function getWillDirection(position, box) {
      var direction = lastDirection;
      if (position.x < box.left) {
        direction = "right";
      }
      if (position.x > box.right) { 
        direction = "left"
      }
      if (position.y < box.top) {
        direction = "bottom";
      }
      if (position.y > box.bottom) {
        direction = "top";
      }
      return direction;
    }
    function getScale(direction, angle) { 
      switch(direction){
        case "top":
          vertical = -1;
          if (angle < dim_half_past_PI) {
            horizen = 1;
          }
          if (angle > dim_half_past_PI) {
            horizen = -1;
          }
          if (angle == dim_half_past_PI) {
            horizen = 0;
          }
          break;
        case "left":
          horizen = -1;
          if (angle > dim_half_past_PI) {
            vertical = 1;
          }
          if (angle < dim_half_past_PI) {
            vertical = -1;
          }
          if (angle == dim_half_past_PI) {
            vertical = 0;
          }
          break;
        case "bottom":
          vertical = 1;
          if(angle > dim_half_past_PI) {
            horizen = 1;
          }
          if(angle < dim_half_past_PI) {
            horizen = -1;
          }
          if(angle == dim_half_past_PI) {
            horizen = 0;
          }
          break;
        case "right":
          horizen = 1;
          if (angle > dim_half_past_PI) {
            vertical = -1;
          }
          if (angle < dim_half_past_PI) {
            vertical = 1;
          }
          if (angle == dim_half_past_PI) {
            vertical = 0;
          }
          break;
      }
    }
    function getOutAngle(inAngle) {
      if (inAngle == dim_half_past_PI || inAngle == 0) {
        return inAngle;
      } else {
        return dim_half_past_PI - inAngle;
      }
    }
    function setPosition(obj, position) {
      obj.css({ "left": position.x +"px", "top": position.y +"px"});
    }
    function run(obj) {
      var vx = Math.cos(lastAngle) * v;
      var vy = Math.sin(lastAngle) * v;
      var runTime = (new Date().getTime() - lastTime) / 1000;
      getScale(lastDirection, lastAngle);
      var sx = vx * runTime * horizen;
      var sy = vy * runTime * vertical;
      var position = {
        x: lastPosition.x + sx,
        y: lastPosition.y + sy
      };
      setPosition(obj, position);
      var currentDirection = getWillDirection(position, box);
      console.log(currentDirection +":"+lastDirection+":"+vertical+":"+horizen+":"+lastAngle+":"+dim_half_past_PI);
      // 如果没有发生碰撞
      if (currentDirection != lastDirection) {
        // 如果发生了碰撞
        lastDirection = currentDirection;
        lastPosition = position;
        lastTime = new Date().getTime();
        lastAngle = getOutAngle(lastAngle);
      }
      setTimeout(function () {
        run(obj);
      }, 30);
    }
    $(document).ready(function () {
      var boxer = $("#box");
      var x = parseInt(boxer.offset().left);
      var y = parseInt(boxer.offset().top);
      box = {
        left: x,
        top: y,
        right: x + boxer.width(),
        bottom: y + boxer.height()
      };
      var runner = $("#runner");
      lastTime = new Date().getTime();
      lastPosition = {
        x: x,
        y: y + boxer.height()
      };
      run(runner);
    });
  </script>
  <style type="text/css" >
  body { margin:0; padding:0; }
  #box { margin:0 auto; width:500px; height:500px; border:3px solid #DDDDDD; border-radius:4px; -wekit-border-radius:4px; -moz-border-radius:4px;}
  #runner { width:10px; height:10px; font-size:10px; color:black; padding:0; position:absolute; left:100px; top:480px;}
  </style>
</head>
<body>
<div id="box">
<div id="runner">●</div>
</div>
</body>
</html>

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

Javascript 相关文章推荐
js控制div及网页相关属性的代码
Dec 19 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
JS中的Replace方法使用经验分享
May 20 Javascript
js如何实现点击标签文字,文字在文本框出现
Aug 05 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
详解vue嵌套路由-query传递参数
May 23 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
node.js实现带进度条的多文件上传
Mar 27 Javascript
JS实现躲避粒子小游戏
Jun 18 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
Jan 27 #Javascript
不用一句js代码初始化组件
Jan 27 #Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
Jan 27 #Javascript
封装属于自己的JS组件
Jan 27 #Javascript
js+css绘制颜色动态变化的圈中圈效果
Jan 27 #Javascript
Bootstrap树形控件使用方法详解
Jan 27 #Javascript
window.onerror()的用法与实例分析
Jan 27 #Javascript
You might like
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Python 自动化表单提交实例代码
2017/06/08 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
Python 占位符的使用方法详解
2019/07/10 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
django跳转页面传参的实现
2020/09/17 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
如何理解委托
2012/01/06 面试题
初中生学习生活的自我评价
2013/11/20 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
员工安全生产承诺书
2014/05/22 职场文书
消防工作实施方案
2014/06/09 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
检讨书怎么写
2015/01/23 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS