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 相关文章推荐
Javascript日期对象的dateAdd与dateDiff方法
Nov 18 Javascript
javascript fullscreen全屏实现代码
Apr 09 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
简单选项卡 js和jquery制作方法分享
Feb 26 Javascript
JavaScript Array对象扩展indexOf()方法
May 09 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
Vue 2.x教程之基础API
Mar 06 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
Vue CLI3中使用compass normalize的方法
May 30 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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中使用全局变量的几种方法
2013/06/24 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
详解Python中的分支和循环结构
2020/02/11 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
电话销售经理岗位职责
2013/12/07 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
如何写观后感
2015/06/19 职场文书
《雷雨》教学反思
2016/02/20 职场文书
小学记事作文之200字
2019/08/06 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python