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 相关文章推荐
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
jquery判断复选框是否选中进行答题提示特效
Dec 10 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
微信小程序实现带缩略图轮播效果
Nov 04 Javascript
基于JavaScript canvas绘制贝塞尔曲线
Dec 25 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
Jul 19 Javascript
教你如何用Node实现API的转发(某音乐)
Sep 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
第十节--抽象方法和抽象类
2006/11/16 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
JS继承用法实例分析
2015/02/05 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
TensorFlow实现模型评估
2018/09/07 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
python中栈的原理及实现方法示例
2019/11/27 Python
python基于property()函数定义属性
2020/01/22 Python
python字符串的index和find的区别详解
2020/06/20 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
大学生推广普通话演讲稿
2014/09/21 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
远程教育培训心得体会
2016/01/09 职场文书
《日月潭》教学反思
2016/02/20 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL