JS实现小球的弹性碰撞效果

JS实现小球的弹性碰撞效果是一项比较基础的前端交互效果,而且很实用。以下是实现该效果的几个步骤:

步骤一:绘制小球

在 HTML 中添加一个 canvas 元素,然后在 JS 中使用 Canvas API 绘制小球。例如:

<canvas id="canvas" width="500" height="500"></canvas>

<script>
  const canvas = document.getElementById('canvas');
  const context = canvas.getContext('2d');

  const ball = {
    x: 50,
    y: 50,
    r: 20,
    vx: 5,
    vy: 2
  };

  function drawBall() {
    context.beginPath();
    context.arc(ball.x, ball.y, ball.r, 0, Math.PI * 2);
    context.closePath();
    context.fill();
  }

  function draw() {
    context.clearRect(0, 0, canvas.width, canvas.height);
    drawBall();
    ball.x += ball.vx;
    ball.y += ball.vy;
    requestAnimationFrame(draw);
  }

  draw();
</script>

ball 是一个球的对象,包含了球的位置、半径和速度。drawBall() 函数用来绘制小球,draw() 函数用来不停地绘制小球和更新小球的状态。

步骤二:添加碰撞检测

在小球的运动过程中,我们需要检测小球是否与墙壁发生碰撞。如果小球碰到了墙壁,我们需要把小球的速度取反,以实现弹性碰撞效果。例如:

function checkCollision() {
  if(ball.x + ball.vx > canvas.width - ball.r || ball.x + ball.vx < ball.r) {
    ball.vx = -ball.vx;
  }
  if(ball.y + ball.vy > canvas.height - ball.r || ball.y + ball.vy < ball.r) {
    ball.vy = -ball.vy;
  }
}

function draw() { 
  // ...
  checkCollision();
  ball.x += ball.vx;
  ball.y += ball.vy;
  requestAnimationFrame(draw);
}

checkCollision() 函数用来检测球体是否与边界相交,并修改球的速度以实现弹性碰撞效果。在这个函数中,我们首先判断小球是否触碰到了右边界或左边界,如果是,则将小球的速度 x 分量取反。接着,我们检测小球是否碰到了下边界或上边界,如果是,则将小球的速度 y 分量取反。

步骤三:添加障碍物

除了墙壁,我们还可以添加一些障碍物,用来增加小球的碰撞效果。例如,我们可以在 canvas 中添加一个矩形,并检测小球是否与矩形相交。如果小球触碰到了该矩形,我们也需要将小球的速度取反以实现弹性碰撞。以下是示例代码:

const obstacle = {
  x: 150,
  y: 200,
  width: 100,
  height: 100
};

function drawObstacle() {
  context.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
}

function checkCollisionWithObstacle() {
  if (ball.x + ball.r > obstacle.x &&
      ball.x - ball.r < obstacle.x + obstacle.width &&
      ball.y + ball.r > obstacle.y &&
      ball.y - ball.r < obstacle.y + obstacle.height) {
    // 检测到碰撞
    const disX = Math.abs(ball.x - obstacle.x - obstacle.width/2);
    const disY = Math.abs(ball.y - obstacle.y - obstacle.height/2);

    if(disX <= (obstacle.width/2 + ball.r) && disY <= (obstacle.height/2 + ball.r)) {
      if(disX > disY) {
        ball.vx = -ball.vx;
      } else {
        ball.vy = -ball.vy;
      }
    }
  }
}

function draw() { 
  // ...
  drawObstacle();
  checkCollisionWithObstacle();
  checkCollision();
  ball.x += ball.vx;
  ball.y += ball.vy;
  requestAnimationFrame(draw);
}

在此示例中,在画布上绘制了一个矩形障碍物,并添加了 checkCollisionWithObstacle() 函数来检测小球是否与矩形相交。如果小球与障碍物相交,我们需要找出两者之间的距离,以便确定小球相对于障碍物的位置。然后,根据球体与障碍物相交时的位置不同,我们将小球的速度 x 或 y 分量取反,实现弹性碰撞效果。

完成上述步骤后,你就可以得到一个具有弹性碰撞效果的小球了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现小球的弹性碰撞效果 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • vue+element-plus上传图片及回显问题及数量限制

    让我详细讲解一下“vue+element-plus上传图片及回显问题及数量限制”的完整攻略。 1. 准备工作 在开始写代码之前,需要先准备好以下工具和库: vue.js:一个流行的 JavaScript 框架,用于构建前端应用程序。 element-plus:一个基于 Element UI 的 Vue 3 组件库,提供了丰富的 UI 组件和样式。 axios…

    css 2023年6月9日
    00
  • XSS绕过技术 XSS插入绕过一些方式总结

    XSS(Cross-Site Scripting,跨站脚本攻击)是指恶意攻击者在目标网站注入恶意脚本,使得用户在访问该网站时被攻击者控制。XSS攻击是目前最常见的Web安全问题之一,攻击者通过XSS攻击可以窃取用户的敏感信息,如账号密码、Cookie等,或者利用XSS攻击进行其它恶意行为。为了防止XSS攻击,web开发中应该采用严格的输入过滤和输出转义等措施…

    css 2023年6月9日
    00
  • 采用CSS定位属性实现Html中DIV层叠与悬浮

    要实现HTML中DIV层叠与悬浮,需要使用CSS定位属性。这里有两种常用的方法: 方法一:使用position属性 为父元素设置 position: relative;,这可以使子元素相对于父元素定位。 对要悬浮的子元素,设置 position: absolute;,这会使元素从文档流中脱离,可以自由地定位。 使用 top 或 bottom 和 left 或…

    css 2023年6月9日
    00
  • css控制元素高度实现自底向上和自顶向下的方法

    CSS控制元素高度是我们在设计网页布局时常常需要考虑的问题。本文将详细介绍如何实现“自底向上”和“自顶向下”的高度控制方法。 自底向上 自底向上的高度控制是指元素的高度从底部开始计算。最常用的方法是通过设置元素的height属性与position属性结合。步骤如下: 将元素的position属性设置为relative或absolute,作用是使后续设置的高度…

    css 2023年6月9日
    00
  • 淘宝店铺导航装修怎么编辑?淘宝新旺铺导航CSS代码使用修改技巧

    淘宝店铺导航装修怎么编辑? 淘宝店铺导航是指在淘宝店铺首页上方的导航栏,可以帮助买家快速找到自己需要的商品。淘宝店铺导航可以通过装修来进行编辑,包括添加、删除、修改导航栏的链接和样式等。本攻略将详细讲解淘宝店铺导航装修的编辑方法,包括基本原理、使用方法和示例说明。 1. 基本原理 淘宝店铺导航的编辑需要使用淘宝店铺装修工具。在淘宝店铺装修工具中,可以通过添加…

    css 2023年5月18日
    00
  • base64图片在各种浏览器的兼容性处理

    base64图片是通过将图片数据转换成base64编码字符串的方式,来实现在网页上展示图片的技术。但是由于不同浏览器的实现方式和支持程度不同,可能导致在某些浏览器中无法正常地显示base64图片,并且这也会影响网页的兼容性和用户体验。 针对这个问题,我们可以采用如下策略来处理base64图片的兼容性问题: 1. 使用CSS sprite技术 CSS Spri…

    css 2023年6月13日
    00
  • js判断移动端横竖屏视口检测实现的几种方法

    下面是关于 “js判断移动端横竖屏视口检测实现的几种方法” 的完整攻略: 方法一:通过window.orientation属性判断屏幕方向 我们可以通过 window.orientation 属性获取设备的方向,然后判断设备是否处于横屏或竖屏状态,以此来实现移动端横竖屏视口检测。 举个例子,我们可以这样编写代码: function checkOrientat…

    css 2023年6月9日
    00
  • CSS对浏览器的兼容性技巧总结

    CSS对浏览器的兼容性技巧总结 在Web开发中,不同的浏览器对CSS的支持程度不同,因此需要开发者采用一些技巧来保证CSS在不同浏览器中的兼容性。本攻略将详细讲解CSS对浏览器的兼容性技巧,包括CSS Hack、CSS Reset、CSS Prefix、CSS Polyfill等。 1. CSS Hack CSS Hack是一种通过针对不同浏览器的特定CSS…

    css 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部