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 相关文章推荐
几个高效,简洁的字符处理函数
Apr 12 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
Oct 14 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
Oct 20 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
用js动态添加html元素,以及属性的简单实例
Jul 19 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
详解React Native顶|底部导航使用小技巧
Sep 14 Javascript
vue小图标favicon不显示的解决方案
Sep 19 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
Nov 02 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
Nov 14 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
django之session与分页(实例讲解)
2017/11/13 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
安全横幅标语
2014/06/09 职场文书
关于保护环境的标语
2014/06/09 职场文书
甜品店创业计划书
2014/09/21 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
张思德观后感
2015/06/09 职场文书
合理化建议书范文
2015/09/14 职场文书
个人工作决心书
2015/09/22 职场文书
2016教师国培研修感言
2015/12/08 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis