当前位置:首页 > 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 可简化复杂碰撞检测:

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实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <d…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div…