首页 > 其他分享 >使用canvas画一个小球自由落体的效果

使用canvas画一个小球自由落体的效果

时间:2024-12-09 09:12:14浏览次数:3  
标签:canvas const 自由落体 小球 ctx update ballRadius

<!DOCTYPE html>
<html>
<head>
<title>自由落体</title>
<style>
  body { margin: 0; }
  canvas { display: block; }
</style>
</head>
<body>

<canvas id="myCanvas"></canvas>

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

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

let x = canvas.width / 2;
let y = 50;
let vy = 0;
const gravity = 0.5;
const ballRadius = 20;

function drawBall() {
  ctx.beginPath();
  ctx.arc(x, y, ballRadius, 0, Math.PI*2);
  ctx.fillStyle = "blue";
  ctx.fill();
  ctx.closePath();
}

function update() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  vy += gravity;
  y += vy;

  if (y + ballRadius > canvas.height) {
    y = canvas.height - ballRadius;
    vy *= -0.8; // 反弹,并损失一些能量
  }

  drawBall();

  requestAnimationFrame(update);
}

update();

</script>

</body>
</html>

代码解释:

  1. HTML 部分:

    • 创建一个 canvas 元素,用于绘制图形。
  2. CSS 部分:

    • 设置 body 的外边距为 0,使 canvas 占据整个页面。
    • 设置 canvas 为块级元素。
  3. JavaScript 部分:

    • 获取 canvas 元素和 2D 绘图上下文。
    • 设置 canvas 的宽度和高度为窗口的宽度和高度。
    • 初始化小球的 x 坐标、y 坐标、垂直速度、重力加速度和半径。
  4. drawBall() 函数:

    • 绘制小球。
  5. update() 函数:

    • 清除画布。
    • 更新小球的垂直速度和 y 坐标。
    • 处理小球与底部碰撞:
      • 当小球触底时,将其 y 坐标设置为底部边界,并反转其垂直速度,乘以一个小于 1 的系数模拟能量损失,实现反弹效果。
    • 绘制小球。
    • 使用 requestAnimationFrame 循环调用 update() 函数,实现动画效果。

运行方法:

  1. 将代码保存为 HTML 文件 (例如 falling_ball.html)。
  2. 在浏览器中打开该 HTML 文件。

关键改进和补充说明:

  • 反弹: 代码中加入了反弹效果,并模拟了能量损失,使小球反弹高度逐渐降低,更接近真实情况。
  • requestAnimationFrame: 使用 requestAnimationFramesetIntervalsetTimeout 更适合制作动画,因为它可以根据浏览器的刷新频率进行优化,提供更流畅的动画效果。
  • 参数可调整: 可以修改 gravityballRadius 等参数来调整小球的运动和外观。

这提供了一个基本的自由落体模拟。你可以根据需要进一步扩展,例如添加空气阻力、水平运动等。

标签:canvas,const,自由落体,小球,ctx,update,ballRadius
From: https://www.cnblogs.com/ai888/p/18594173

相关文章

  • html2Canvas+JsPDF在每一页上面插入内容
    有一个功能,是将html页面转成pdf下载下来,已用html2Canvas+JsPDF实现。页面上面有一个多行标题,打印的时候多页只会在第一页有,客户想要每一页都有。解决方法:打印的时候,可以看做打印的区域不动,页面纸往上移,继续打印下面部分。我的想法是,每次页面纸往上移的时候,可以少移一部分,让上......
  • canvas 里面的 clearRect 的方法论
    ‌在Canvas中清除内容可以使用clearRect方法。https://turfjs.fenxianglu.cn/docs/next/api/bbox......
  • vue3+ts实现一个canvas画笔绘图功能,并导出相关的切片
    1<template>2<el-dialog:model-value="addDialog"width="648"@close="closeDialog":lock-scroll="true"3:close-on-click-modal="false">4<template#header="......
  • 通过Canvas获得视频某一帧
        原生js的video标签并没有直接获得某一个时间视频内容的功能,但我们可以结合画布canvas来提取视频内容。这样也能用于获得视频封面等等功能        <template><div><!--视频文件上传输入框--><videoref="videoEle"src="视频链接"@canpla......
  • UNIAPP小程序内Canvas下雪特效,解决蓝色雪花问题
      在小程序的开发中,如何为用户带来与众不同的体验一直是开发者关注的焦点。尤其是在冬季,给小程序加入一个浪漫的下雪特效,不仅能增强用户的互动体验,还能提升整体的应用氛围。今天,我们将介绍如何利用UNIAPP和Canvas技术,在小程序中实现一个炫酷的下雪特效。效果图......
  • canvas实现场景移动效果
    实现步骤1.中心圆形与随机圆形在Canvas中心绘制一个固定圆形。在画布其他地方随机生成5个圆形,记录每个圆形的初始位置。2.鼠标点击事件获取鼠标点击坐标,并计算与中心圆形之间的距离和角度。3.圆形反向移动5个随机圆形根据中心点为参考,向反方向移动。使用Math.at......
  • canvas根据鼠标点击平滑移动案例
    1.圆形绘制在画布中心绘制一个圆形,并初始化圆形的坐标和半径。2.鼠标点击事件为Canvas添加鼠标点击事件,记录点击的目标坐标。3.移动逻辑使用Math.atan2计算从圆心到点击位置的角度。通过三角函数(Math.cos和Math.sin)逐帧更新圆的坐标,使其沿直线平滑移动。4.动画......
  • 在esp32上实现一个重力小球
    在单片机上模拟重力小球硬件主控:esp32屏幕:ILI9341重力传感器:MPU6050软件屏幕驱动:#include<TFT_eSPI.h>MPU6050驱动:#include<MPU6050_tockn.h>要求可以实现屏幕上的小球跟随实际重力运行,并且具有释放回收区域,可以通过按键实现小球的增加与减少;程序设计使用链表新建小......
  • 使用canvas制作一个印章
    <!DOCTYPEhtml><html><head><title>Canvas印章</title><style>body{font-family:sans-serif;}#canvas{border:1pxsolid#ccc;}</style></head><body><h1>Canvas印章</h1><can......
  • 如何使用html5实现雪花效果?通过canvas实现雪花飘动效果案例分享!
    不知道各位小伙伴们是否有见过雪花,没有见到过的小伙伴们今天小编就来和大家讲讲有关于:“如何使用html5实现雪花效果?”这个问题的相关内容分享!一、canvas是什么?HTML5<canvas>元素用于图形的绘制,通过脚本(通常是JavaScript)来完成.<canvas>标签只是图形容器,您必须使用脚......