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 相关文章推荐
使用TextRange获取输入框中光标的位
Oct 14 Javascript
Jquery 弹出层插件实现代码
Oct 24 Javascript
js setTimeout 参数传递使用介绍
Aug 13 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
Nov 10 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
js定时器实现倒计时效果
Nov 05 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
Sep 24 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
Vue中keep-alive 实现后退不刷新并保持滚动位置
Mar 17 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 分页分组类
2009/12/10 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
Python变量作用范围实例分析
2015/07/07 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Django如何配置mysql数据库
2018/05/04 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
基于FME使用Python过程图解
2020/05/13 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
大学秋游活动方案
2014/02/11 职场文书
利群广告词
2014/03/20 职场文书
大学生村官演讲稿
2014/04/25 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
三八妇女节标语
2014/10/09 职场文书
银行给客户的感谢信
2015/01/23 职场文书
安全知识竞赛主持词
2015/06/30 职场文书