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 相关文章推荐
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 Javascript
JavaScript表格常用操作方法汇总
Apr 15 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
如何更好的编写js async函数
May 13 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
es6函数之箭头函数用法实例详解
Apr 25 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
JavaScript实现贪吃蛇游戏
Jun 16 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
ElementUI radio组件选中小改造
2019/08/12 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
python实现list由于numpy array的转换
2018/04/04 Python
Windows下安装Scrapy
2018/10/17 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
后勤副校长自我鉴定
2013/10/13 职场文书
模具数控专业自荐信
2014/01/27 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
Spring整合Mybatis的全过程
2021/06/28 Java/Android
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers