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 相关文章推荐
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 Javascript
JavaScript常用的弹出广告及背投广告实现方法
Feb 06 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
ECharts仪表盘实例代码(附源码下载)
Feb 18 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
微信小程序 swiper组件详解及实例代码
Oct 25 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
jQuery length 和 size()区别总结
Apr 26 jQuery
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 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实现mysql数据库连接操作及用户管理
2015/11/08 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
JavaScript Accessor实现说明
2010/12/06 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
jquery禁用右键示例
2014/04/28 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
大学生职业生涯规划范文
2013/12/31 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
六五普法规划实施方案
2014/03/21 职场文书
商铺租赁意向书
2014/04/01 职场文书
工作岗位说明书模板
2014/05/09 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
java设计模式--三种工厂模式详解
2021/07/21 Java/Android
分享7个 Python 实战项目练习
2022/03/03 Python