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 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
JS打开图片另存为对话框实现代码
Dec 26 Javascript
jquery实现控制表格行高亮实例
Jun 05 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
Aug 18 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
基于Bootstrap重置输入框内容按钮插件
May 12 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 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
谈一谈收音机的高放电路
2021/03/02 无线电
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
第五节 克隆 [5]
2006/10/09 PHP
模仿OSO的论坛(二)
2006/10/09 PHP
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php把session写入数据库示例
2014/02/26 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
Python 中 Meta Classes详解
2016/02/13 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
python进阶之自定义可迭代的类
2019/08/20 Python
如何学习Python time模块
2020/06/03 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
父母寄语大全
2014/04/12 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
保险公司演讲稿
2014/09/02 职场文书
统计员岗位职责
2015/02/11 职场文书
天那边观后感
2015/06/09 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
如何利用golang运用mysql数据库
2022/03/13 Golang
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL