当前位置:首页 > JavaScript

js实现碰撞

2026-03-01 02:01:09JavaScript

JavaScript 实现碰撞检测

矩形碰撞检测

矩形碰撞是最基础的检测方法,通过比较两个矩形的位置和尺寸判断是否重叠。

function checkRectCollision(rect1, rect2) {
  return (
    rect1.x < rect2.x + rect2.width &&
    rect1.x + rect1.width > rect2.x &&
    rect1.y < rect2.y + rect2.height &&
    rect1.y + rect1.height > rect2.y
  );
}

圆形碰撞检测

圆形碰撞通过计算圆心距离与半径之和的关系实现。

function checkCircleCollision(circle1, circle2) {
  const dx = circle1.x - circle2.x;
  const dy = circle1.y - circle2.y;
  const distance = Math.sqrt(dx * dx + dy * dy);
  return distance < circle1.radius + circle2.radius;
}

像素级碰撞检测

对于不规则形状,可通过 canvas 的 getImageData 检测像素透明度。

function checkPixelCollision(obj1, obj2) {
  const ctx = document.createElement('canvas').getContext('2d');
  ctx.drawImage(obj1.image, 0, 0);
  const data1 = ctx.getImageData(0, 0, obj1.width, obj1.height).data;

  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
  ctx.drawImage(obj2.image, 0, 0);
  const data2 = ctx.getImageData(0, 0, obj2.width, obj2.height).data;

  for (let i = 0; i < data1.length; i += 4) {
    if (data1[i + 3] > 0 && data2[i + 3] > 0) {
      return true;
    }
  }
  return false;
}

分离轴定理(SAT)

适用于凸多边形的高级碰撞检测算法。

function checkSATCollision(poly1, poly2) {
  const axes = [...getAxes(poly1), ...getAxes(poly2)];
  for (const axis of axes) {
    const proj1 = projectPolygon(poly1, axis);
    const proj2 = projectPolygon(poly2, axis);
    if (proj1.max < proj2.min || proj2.max < proj1.min) {
      return false;
    }
  }
  return true;
}

物理引擎集成

使用现成库如 Matter.js 可简化复杂碰撞检测:

js实现碰撞

const engine = Matter.Engine.create();
const boxA = Matter.Bodies.rectangle(200, 200, 80, 80);
const boxB = Matter.Bodies.rectangle(210, 210, 80, 80);
Matter.Engine.update(engine);
const collisions = Matter.Query.collides(boxA, [boxB]);

性能优化技巧

  • 使用空间分区(如四叉树)减少检测次数
  • 先进行粗略的包围盒检测再精细检测
  • 对静态物体缓存碰撞检测结果
  • 使用 Web Workers 进行离屏计算

标签: js
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…