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 相关文章推荐
深入理解Javascript闭包 新手版
Dec 28 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
js调试系列 初识控制台
Jun 18 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
bootstrap fileinput 上传插件的基础使用
Feb 17 Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 Javascript
vue-router 路由传参用法实例分析
Mar 06 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之XML转数组函数的详解
2013/06/07 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
Python内置模块logging用法实例分析
2018/02/12 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python_mask_array的用法
2020/02/18 Python
tensorflow常用函数API介绍
2020/04/19 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
Ejb技术面试题
2015/04/29 面试题
中学老师的自我评价
2013/11/07 职场文书
探亲假请假条
2014/04/11 职场文书
房地产开发项目建议书
2014/05/16 职场文书
2014年副班长工作总结
2014/12/10 职场文书