js 实现碰撞检测的示例


Posted in Javascript onOctober 28, 2020

碰撞检测

目录

  • 代码实例
  • 与简易拖拽的差异
  • 下载源码链接 

代码实例

<div id="box" style="background: #334;width: 100px;height: 100px;position: absolute;cursor: move;z-index: 999;"></div>
<div id="box2" style="background: green;width: 100px;height: 100px;position: absolute;top: 200px;left: 500px;"></div>

(function () {
	var dragging = false
	var boxX, boxY, mouseX, mouseY, offsetX, offsetY
	var box = document.getElementById('box')
	var box2 = document.getElementById('box2')
	var box2X, box2Y

	// 鼠标按下的动作
	box.onmousedown = down
	// 鼠标的移动动作
	document.onmousemove = move
	// 释放鼠标的动作
	document.onmouseup = up

	// 鼠标按下后的函数,e为事件对象
	function down(e) {
		dragging = true
		
		// 获取元素所在的坐标
		boxX = box.offsetLeft
		boxY = box.offsetTop

		// 获取元素box2所在的坐标
		box2X = box2.offsetLeft
		box2Y = box2.offsetTop

		// 获取鼠标所在的坐标
		mouseX = parseInt(getMouseXY(e).x)
		mouseY = parseInt(getMouseXY(e).y)

		// 鼠标相对元素左和上边缘的坐标
		offsetX = mouseX - boxX
		offsetY = mouseY - boxY
	}

	// 鼠标移动调用的函数
	function move(e){
		if (dragging) {
			// 获取移动后的元素的坐标
			var x = getMouseXY(e).x - offsetX
			var y = getMouseXY(e).y - offsetY

			// 计算可移动位置的大小, 保证元素不会超过可移动范围
			var width = document.documentElement.clientWidth - box.offsetWidth
			var height = document.documentElement.clientHeight - box.offsetHeight

			// min方法保证不会超过右边界,max保证不会超过左边界
			x = Math.min(Math.max(0, x), width)
			y = Math.min(Math.max(0, y), height)

			// 给元素及时定位
			box.style.left = x + 'px'
			box.style.top = y + 'px'

			// 碰撞检测
			// x坐标值的范围判断,y坐标值的范围判断
			var judge_x = (x >= box2X - box2.offsetWidth) && (x <= box2X + box2.offsetWidth)
			var judge_y = (y >= box2Y - box2.offsetHeight) && (y <= box2Y + box2.offsetHeight)
			if (judge_x && judge_y) {
				console.log("碰撞到")
			}
		}
	}

	// 释放鼠标的函数
	function up(e){
		dragging = false
	}

	// 函数用于获取鼠标的位置
	function getMouseXY(e){
		var x = 0, y = 0
		e = e || window.event
		
		if (e.pageX) {
			x = e.pageX
			y = e.pageY
		} else {
			x = e.clientX + document.body.scrollLeft - document.body.clientLeft
			y = e.clientY + document.body.scrollTop - document.body.clientTop
		}
		return {
			x: x,
			y: y
		}
	}
})()

与简易拖拽的差异

碰撞检测

// 碰撞检测
// x坐标值的范围判断,y坐标值的范围判断
var judge_x = (x >= box2X - box2.offsetWidth) && (x <= box2X + box2.offsetWidth)
var judge_y = (y >= box2Y - box2.offsetHeight) && (y <= box2Y + box2.offsetHeight)
if (judge_x && judge_y) {
	console.log("碰撞到")
}

下载源码链接

星辉的Github

以上就是js 实现碰撞检测的示例的详细内容,更多关于js 碰撞检测的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jquery 插件学习(六)
Aug 06 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
Nov 12 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
封装了jQuery的Ajax请求全局配置
Feb 05 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
AngularJS教程之环境设置
Aug 16 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
如何自动化部署项目?折腾服务器之旅~
Apr 16 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
Sep 06 Javascript
Vue v-model组件封装(类似弹窗组件)
Jan 08 Javascript
vue路由分文件拆分管理详解
Aug 13 Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 #Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 #Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 #Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 #Javascript
js实现详情页放大镜效果
Oct 28 #Javascript
用js实现放大镜效果
Oct 28 #Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 #Javascript
You might like
jquery 指南/入门基础
2007/11/30 Javascript
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
vue使用recorder.js实现录音功能
2019/11/22 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
python 使用get_argument获取url query参数
2017/04/28 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python的Tqdm模块的使用
2018/01/10 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
创新型城市实施方案
2014/03/06 职场文书
庆祝儿童节标语
2014/10/09 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python