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 相关文章推荐
js获取select选中的option的text示例代码
Dec 19 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 Javascript
jQuery实现带有洗牌效果的动画分页实例
Aug 31 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
javascript作用域链与执行环境详解
Mar 25 Javascript
vue 配置多页面应用的示例代码
Oct 22 Javascript
如何用RxJS实现Redux Form
Dec 29 Javascript
JavaScript格式化json和xml的方法示例
Jan 22 Javascript
vue中组件的3种使用方式详解
Mar 23 Javascript
node.js监听文件变化的实现方法
Apr 17 Javascript
彻底揭秘keep-alive原理(小结)
May 05 Javascript
教你一步步实现一个简易promise
Nov 02 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
一个php作的文本留言本的例子(二)
2006/10/09 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
jquery随意添加移除html的实现代码
2011/06/21 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python列表切片用法示例
2017/04/19 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Python调用Windows命令打印文件
2020/02/07 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
《草虫的村落》教学反思
2014/02/16 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
解决xampp安装后Apache无法启动
2022/03/21 Servers
JavaScript实现简单的音乐播放器
2022/08/14 Javascript