JavaScript碰撞检测原理及其实现代码


Posted in Javascript onMarch 12, 2020

本文实例为大家分享了JavaScript实现碰撞检测原的具体代码,供大家参考,具体内容如下

1.模拟碰撞

简单模拟碰撞过程,用一个可以拖拽的div2去尝试碰撞一个固定的div1(均用绝对定位)

2.碰撞检测原理

JavaScript碰撞检测原理及其实现代码

如图所示:
使得div分别有4个距离属性( L(left),T(top),R(right),B(bottom) ).
对于div1来说,画出一个九宫格,div2在除中心以为的8个格子任意移动都不会发送碰撞.

JavaScript碰撞检测原理及其实现代码

也就是说,只要满足条件:oDiv2.div2R小于oDiv1.div1L|| oDiv2.div2L大于oDiv1.div1R || oDiv2.div2B小于oDiv1.div1T|| oDiv2.div2T大于oDiv1.div1B就不会发送碰撞

3.具体测试代码

<html>
<head>
 <title></title>
 <style type="text/css">
 body{margin: 0;padding: 0;}
 #div2{height: 100px;width: 200px;background-color: orange;position: absolute;left: 0px;top:0px;z-index: 1;}
 #div1{height: 100px;width: 100px;background-color: #a6e22e;position: absolute;left: 600px;top:400px;}
 </style>
 <script type="text/javascript">
 //获取对象样式属性值
 function getObjStyle(obj,attr)
 {
  return getComputedStyle(obj)?getComputedStyle(obj)[attr]:obj.currentStyle[attr];
 }
 </script>
 <script type="text/javascript">
 window.οnlοad=function (){
  var oDiv1=document.getElementById('div1');
  var oDiv2=document.getElementById('div2');



  oDiv2.οnmοusedοwn=function (onEvent,obj){//对div1实现拖拽,并对碰撞进行检测
   obj=this;
   var ev=onEvent||event;
   var distance={};
   distance.disX=ev.clientX-obj.offsetLeft;//到左边框的距离
   distance.disY=ev.clientY-obj.offsetTop;//到上边框的距离

   //获取div1的四个值
   oDiv1.div1L=getObjStyle(oDiv1,'left');
   oDiv1.div1R=parseInt(getObjStyle(oDiv1,'left'))+parseInt(getObjStyle(oDiv1,'width'))+'px';
   oDiv1.div1T=getObjStyle(oDiv1,'top');
   oDiv1.div1B=parseInt(getObjStyle(oDiv1,'top'))+parseInt(getObjStyle(oDiv1,'height'))+'px';




   if(obj.setCapture)
    obj.setCapture();

   document.οnmοusemοve=function (onEvent){
    var ev=onEvent||event;
    obj.style.left=ev.clientX-distance.disX+'px';
    obj.style.top=ev.clientY-distance.disY+'px';

    //获取div2的四个值
    oDiv2.div2L=getObjStyle(oDiv2,'left');
    oDiv2.div2R=parseInt(getObjStyle(oDiv2,'left'))+parseInt(getObjStyle(oDiv2,'width'))+'px';
    oDiv2.div2T=getObjStyle(oDiv2,'top');
    oDiv2.div2B=parseInt(getObjStyle(oDiv2,'top'))+parseInt(getObjStyle(oDiv2,'height'))+'px';

    /*console.log('oDiv2.div2L:'+oDiv2.div2L+' oDiv2.div2R:'+oDiv2.div2R+' oDiv2.div2T:'+oDiv2.div2T+' oDiv2.div2B:'+oDiv2.div2B);*/

    //碰撞检测
    if(oDiv2.div2R<oDiv1.div1L || oDiv2.div2L>oDiv1.div1R || oDiv2.div2B<oDiv1.div1T || oDiv2.div2T>oDiv1.div1B){
     //未发送碰撞
    }else{
     //发生碰撞
     alert('发生碰撞');
    }

   }

   document.οnmοuseup=function (){
    document.οnmοuseup=document.οnmοusemοve=null;
    if(obj.setCapture)
     obj.releaseCapture();
   }
   return false;
  }
 }
 </script>
</head>
<body>
 <div id="div2">div2</div>
 <div id="div1">div1</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
写的htc的数据表格
Jan 20 Javascript
JavaScript为对象原型prototype添加属性的两种方式
Aug 01 Javascript
JQuery动画和停止动画实例代码
Mar 01 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
JS+DIV实现鼠标划过切换层效果的方法
May 25 Javascript
有关jquery与DOM节点操作方法和属性记录
Apr 15 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
Sep 17 Javascript
详解Vuejs2.0之异步跨域请求
Apr 20 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
Jan 18 Javascript
JavaScript 语句之常用 for 循环详解
Mar 29 Javascript
JavaScript实现多个物体同时运动
Mar 12 #Javascript
基于javascript实现碰撞检测
Mar 12 #Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 #jQuery
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 #Javascript
javascript实现拖拽碰撞检测
Mar 12 #Javascript
原生js实现碰撞检测
Mar 12 #Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 #Javascript
You might like
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
python基于property()函数定义属性
2020/01/22 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
小学新学期寄语
2014/04/02 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
导游词之张家口
2019/12/13 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
redis内存空间效率问题的深入探究
2021/05/17 Redis
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL