Vanilla JS Div 碰撞检测

2023-11-29

我的以下实现可以在jsfiddle.net

我有四个div。我的目标是使它们可以在页面上拖动,但不允许它们彼此重叠。每个都可以使用 mousemove 侦听器在页面上拖动。

container.addEventListener('mousemove',mouseMove);
  function mouseMove(e) {
    if (!mouseDown) {return;}
    let coords=e.target.getBoundingClientRect();
    let movX=e.movementX;
    let movY=e.movementY;
    if (!collision(movX,movY,e.target.classList[1],coords)){
      e.target.style.left=`${coords.left+movX}px`;
      e.target.style.top=`${coords.top+movY}px`;
    }
  }

严格来说,我的碰撞检测功能有效。我将“碰撞”事件输出到 div,这样当您拖动它时,您就可以在小提琴中看到它。但是,您仍然可以将 div 拖到另一个上面。

当你试图将它们拉开时,它们会有点“粘”,如果你继续推它们,它们就会重叠。此时,碰撞检测在真/假之间快速摇摆,所以我猜测这里可能发生了一些奇怪的事情,但我无法弄清楚。

我认为一个问题可能是碰撞检测仅在边界相等时输出碰撞。也就是说,一旦发生碰撞并且一个元素位于另一个元素内部,它就会返回 false。

但是,我看不到我的 mousemove e.movementX 和 e.movementY 事件如何能够通过碰撞测试并移动 div。


您将让对象与不止 1 个碰撞。脚本将为您提供所有碰撞。但我想接受/移动它或不接受它的逻辑取决于你想要实现的目标。借自相交

script:

function mouseMove(e) {
  if (!mouseDown) {
    return;
  }
  let coords = e.target.getBoundingClientRect();
  let movX = e.movementX;
  let movY = e.movementY;

  collision(movX, movY, e.target.classList[1], coords) //check all collisions. Item can collide with more than one polygon.

  e.target.style.left = `${coords.left+movX}px`;
  e.target.style.top = `${coords.top+movY}px`;
  /* if (!) {

  }*/
}

function collision(newX, newY, movingPart, movingRect) {
  let takenPositions = []; //array of arrays of rects' L, R, Top, Bottom coords
  let newCoords = {
    id: movingPart,
    width: 100,
    height: 100,
    x: movingRect.left + newX,
    y: movingRect.top + newY
  };

  let collision = false;
  let collisions = []; //store collisions. 
  divs.forEach((d) => {
    if (d.classList[1] !== movingPart) { // a thing can't collide with itself
      let c = d.getBoundingClientRect();
      takenPositions.push({
        id: d.classList[1],
        width: 100,
        height: 100,
         x: c.left,//updated this part x,y are undefined :|
         y: c.top //and updated this
      });
    }
  });

  takenPositions.forEach((p) => {
    var tw = p.width;
    var th = p.height;
    var rw = newCoords.width;
    var rh = newCoords.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
      collision = false;
    } else {
      var tx = p.x;
      var ty = p.y;
      var rx = newCoords.x;
      var ry = newCoords.y;
      rw += rx;
      rh += ry;
      tw += tx;
      th += ty;
      collision = ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry));
      collisions.push({
        parentId: newCoords.id,
        destId: p.id,
        collision: collision
      });
    }
  });
  let info = document.querySelector('div.info');
  info.innerHTML = "";
  collisions.forEach(function(element) {
    info.innerHTML += `${element.parentId} collision with ${element.destId} is ${element.collision}.  <br/>`;
  });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vanilla JS Div 碰撞检测 的相关文章

随机推荐

  • 下载html源android?

    我正在尝试下载网站源代码并将其显示在文本框中 但我似乎收到错误并且无法弄清楚 s public void getHtml throws ClientProtocolException IOException HttpClient httpC
  • 单击开始按钮时的 JavaScript 倒计时器,显示小时、分钟和秒

    我想在单击按钮时创建小时 分钟和秒的倒计时器 这是我到目前为止的代码 HTMLcode div class colomn style margin right 20px div
  • 是否可以制作一个调用 jdbc 的 Java JNI?

    我是 jni 的新手 并且非常困惑是否可以使用 jni 来实现我需要完成的任务 我想制作一个java api 它将使用jdbc来更新数据库 但是这个特定的api将从C 程序中调用 所以我想我可能应该编写通过 jdbc 访问数据库的 jni
  • libgdx 在受伤时改变精灵颜色

    我正在使用 libgdx 制作一个小平台游戏 我想让敌人在玩家用武器伤害他们时以红色闪烁 我已经尝试更改精灵颜色和精灵批次颜色但没有成功 它仅将新颜色与纹理之一融为一体 sprite setColor Color RED spriteBat
  • React PDF + Vite 实现错误:Uncaught SyntaxError

    我正在尝试在使用 Vite 创建的 React 项目中使用 React PDF 库 我在渲染 PDF 组件时遇到问题 并且错误非常奇怪 有人可以帮助我吗 Error Uncaught SyntaxError The requested mo
  • 如何使用 Kotlin 协程最大限度地减少 Web 服务调用次数?

    在我的 Android Kotlin 项目中 我在协程中调用 Web 服务 myWebservice只是一个管理 Web 服务调用的自定义类 fun searchForItems userInput String CoroutineScop
  • 如何在react js中将类型数据缓冲区转换为图像

    您好 我接下来有图像类型缓冲区 该数据是一张图像 如何将缓冲区数据转换为图像 当我向 api 发出请求时 它会显示以下数据 任何建议 后端是用node js续集MYSQL制作的 以及 React js 中的前端 我有下一个例子 https
  • 如何调试 w3wp clr.dll 错误

    我的客户在两台生产服务器上安装了 ASP NET 应用程序 与 NLB 平衡 但这无关紧要 两台服务器每 3 4 小时就会崩溃一次 并出现以下事件查看器记录的错误 错误应用程序名称 w3wp exe 版本 7 5 7601 17514 时间
  • C++11:memory_order_relaxed 和 memory_order_consume 之间的区别

    我现在正在学习C 11内存顺序模型并想了解之间的区别memory order relaxed and memory order consume 具体来说 我正在寻找一个无法替代的简单示例memory order consume with m
  • 如何在Python3中像printf一样打印?

    在 Python 2 中我使用 print a d b d f x n g x n 我试过了 print a d b d f x n g x n 在Python2中 print是一个引入语句的关键字 print Hi 在Python3中 p
  • Android中如何同步两个scrollview?

    我有两个水平的scrollview 并希望将它们始终保持在相同的位置 距离 如果用户滚动其中一个 则需要以编程方式滚动另一个 挑战在于 将会发生无限循环 一个将提出另一个 另一个将首先提出 如何设置状态 指示用户启动的滚动仍在进行中 那么其
  • 错误:HHH000299:无法完成架构更新 java.lang.NullPointerException

    我在以下环境中有一个网络应用程序 JPA 2 0 春季3 2 2 MySQL 5 6 11 休眠 4 2 0 CR1 阿帕奇汤姆猫 7 0 35 到目前为止我的配置application context xml文件如下
  • 如何从 github 存储库安装打字稿定义

    如何为像 aurelia validatejs 这样的库安装 typescript defs 就像我所做的那样npm install aurelia validatejs save将其添加到package json and node mod
  • NHibernate - 映射字符串外键

    我继承的旧数据库包含以下表格 Teams TeamId INT PRIMARY KEY Name VARCHAR 30 Players PlayerId INT PRIMARY KEY Team VARCHAR 30 Players 表中的
  • 为什么我的代码在c++中无限循环。我的代码需要反复提示用户

    我的代码需要反复提示用户输入整数 当用户不再想继续输入数字时 输出用户输入的所有正数之和 然后输出用户输入的所有负数之和 这是我到目前为止所拥有的 include
  • 允许将 T* 与 char* 别名。反过来也允许吗?

    Note 该问题已被重命名并减少 以使其更加集中和可读 大多数评论都是指旧文本 根据标准 不同类型的对象不能共享相同的内存位置 所以这是不合法的 std array
  • nhibernate 查询所有实现接口的对象

    例如 如果您有一个 Apple IWhatever 和一个 Orange IWhatever 并且您想找到它们 因为它们都是 IWhatever 那么您需要在 NHibernate 中做什么 它是否完全依赖于 HQL 和条件查询 还是您还必
  • 修改查询字符串而不重新加载页面

    我正在创建一个照片库 并且希望能够在浏览照片时更改查询字符串和标题 我正在寻找的行为经常出现在连续 无限页面的某些实现中 当您向下滚动查询字符串时 会不断增加页码 http x com page 4 等等 理论上这应该很简单 但我想要一些在
  • 将图像字节数据流解码为 JPEG

    我正在努力成功地将 JPEG 图像从字节解码回 JPEG 我从 MJPG 字节流的编码帧开始 我想对其进行解码以便使用 OpenCV 进行操作 我是 Python numpy opencv 等方面的新手 我现在将帧 JPG 数据放在文本文件
  • Vanilla JS Div 碰撞检测

    我的以下实现可以在jsfiddle net 我有四个div 我的目标是使它们可以在页面上拖动 但不允许它们彼此重叠 每个都可以使用 mousemove 侦听器在页面上拖动 container addEventListener mousemo