原生JS实现的碰撞检测功能示例


Posted in Javascript onMay 18, 2018

本文实例讲述了原生JS实现的碰撞检测功能。分享给大家供大家参考,具体如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>3water.com JS碰撞检测</title>
<style>
div{width:100px;
  height:100px;
}
#box{background:red; position:absolute; }
#box1{background:green;position:absolute;top:300px; left:300px;}
</style>
<script>
//两个碰撞的盒子。是建立在一个不动的基础上。所以可以根据不动的盒子求出四个方向的left和top值。然后再判断其是否碰撞,且碰撞的过程随时改变其层级,(原需 var 8个变量,现在只需4个变量)
function collText(obj,left,top,obj1){
      var l1=obj.offsetLeft-obj.offsetWidth;
      var t1=obj.offsetTop-obj.offsetHeight;
      var r1=obj.offsetLeft+obj.offsetWidth;
      var b1=obj.offsetTop+obj.offsetHeight;
      if(left<l1||top<t1||left>r1||top>b1){
        obj.style.zIndex=3;
        obj1.style.zIndex=1;
        return true;
      }else{
        obj.style.zIndex=1;
        obj1.style.zIndex=3;
        return false;
      }
};
window.onload=function(){
  var oBox=document.getElementById('box');
  var oBox1=document.getElementById('box1');
  oBox.onmousedown=function(ev){
    var oEvent= ev  ||  event;
    var disX=oEvent.clientX-oBox.offsetLeft;
    var disY=oEvent.clientY-oBox.offsetTop;
    document.onmousemove=function(ev){
      var oEvent= ev ||  event;
      var l=oEvent.clientX-disX;
      var t=oEvent.clientY-disY;
      oBox.style.left=l+'px'  ;
      oBox.style.top=t+'px'  ;
      if(collText(oBox1,l,t,oBox)){
        oBox1.style.background='green';
      }else{
        oBox1.style.background='yellow';
      }
    };
    document.onmouseup=function(){
      document.onmousemove=null;
      document.onmouseup=null;
      oBox.reseaseCapture&&oBox.reseaseCapture();
    };
    oBox.setCapture&&oBox.setCapture();
    return false;
  }
  oBox1.onmousedown=function(ev){
    var oEvent= ev ||  event;
    var disX1=oEvent.clientX-oBox1.offsetLeft;
    var disY1=oEvent.clientY-oBox1.offsetTop;
    document.onmousemove=function(ev){
      var oEvent= ev ||  event;
      var le=oEvent.clientX-disX1;
      var to=oEvent.clientY-disY1;
      oBox1.style.left=le+'px'  ;
      oBox1.style.top=to+'px'  ;
      if(collText(oBox,le,to,oBox1)){
        oBox.style.background='red';
      }else{
        oBox.style.background='#000';
      }
    };
    document.onmouseup=function(){
      document.onmousemove=null;
      document.onmouseup=null;
      oBox1.reseaseCapture&&oBox1.reseaseCapture();
    }
    oBox1.setCapture&&oBox1.setCapture();
    return false;
  }
}
</script>
</head>
<body>
<div id="box"></div>
<div id="box1"></div>
</body>
</html>

这里使用在线HTML/CSS/JavaScript运行工具http://tools.3water.com/code/HtmlJsRun测试运行效果如下(碰撞判定时颜色改变):

 原生JS实现的碰撞检测功能示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中null与undefined分析
Jul 25 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
Sep 05 Javascript
js动态设置div的值下例子
Oct 29 Javascript
javascript将浮点数转换成整数的三个方法
Jun 23 Javascript
浅谈JavaScript的全局变量与局部变量
Jun 10 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 jQuery
使用vue for时为什么要key【推荐】
Jul 11 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 #Javascript
vue.js使用3DES加密的方法示例
May 18 #Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 #Javascript
JS实现调用本地摄像头功能示例
May 18 #Javascript
React全家桶环境搭建过程详解
May 18 #Javascript
vue单页开发父子组件传值思路详解
May 18 #Javascript
Node.js Buffer用法解读
May 18 #Javascript
You might like
Linux中为php配置伪静态
2014/12/17 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
php注册登录系统简化版
2020/12/28 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python内存管理分析
2015/04/08 Python
浅谈Python单向链表的实现
2015/12/24 Python
django批量导入xml数据
2016/10/16 Python
Python入门之后再看点什么好?
2018/03/05 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
管理学专业个人求职信范文
2013/09/21 职场文书
专科毕业生学习生活的自我评价
2013/10/26 职场文书
八项规定整改方案
2014/02/21 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
教室布置标语
2014/06/26 职场文书
安全目标责任书
2014/07/22 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
结婚典礼主持词
2015/06/29 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android