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 相关文章推荐
EasyUI 中 MenuButton 的使用方法
Jul 14 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
IE中图片的onload事件无效问题和解决方法
Jun 06 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
JS结合bootstrap实现基本的增删改查功能
Jul 22 Javascript
Zabbix添加Node.js监控的方法
Oct 20 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
Angular2利用组件与指令实现图片轮播组件
Mar 27 Javascript
jQuery返回定位插件详解
May 15 jQuery
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
详解使用vuex进行菜单管理
Dec 21 Javascript
Vue form表单动态添加组件实战案例
Sep 02 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 clearstatcache()函数详解
2010/03/02 PHP
PHP count()函数讲解
2019/02/03 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
python实现word 2007文档转换为pdf文件
2018/03/15 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Python中的类与类型示例详解
2019/07/10 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python程序暂停的正常处理方法
2019/11/07 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
技校生自我鉴定范文
2013/09/26 职场文书
三年级学生评语
2014/04/23 职场文书
经典团队口号
2014/06/06 职场文书
出国签证在职证明
2014/09/20 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
转正申请报告格式
2015/05/15 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers