当前位置:首页 > JavaScript

js实现重力

2026-04-06 23:15:29JavaScript

JavaScript 实现重力效果

在 JavaScript 中实现重力效果通常用于游戏开发或动画场景,涉及物体下落、弹跳等物理模拟。以下是核心实现方法:

基础重力模拟

定义重力加速度常量(通常为正值,向下方向),并应用于物体的垂直速度:

const gravity = 0.5; // 重力加速度值
let velocityY = 0;   // 初始垂直速度
let positionY = 0;   // 初始垂直位置

function applyGravity() {
    velocityY += gravity;      // 速度受重力影响增加
    positionY += velocityY;   // 更新位置
}

边界检测与反弹

添加地面碰撞检测,实现物体触地反弹(能量损失模拟):

js实现重力

const groundHeight = 400; // 地面高度
const bounceFactor = 0.7; // 反弹系数(0-1)

function checkBoundary() {
    if (positionY > groundHeight) {
        positionY = groundHeight;
        velocityY = -velocityY * bounceFactor; // 反弹时速度反向并衰减
    }
}

完整动画循环

通过 requestAnimationFrame 实现连续动画帧:

function animate() {
    applyGravity();
    checkBoundary();
    // 更新物体渲染位置(例如DOM元素或Canvas绘制)
    object.style.top = `${positionY}px`; 
    requestAnimationFrame(animate);
}
animate();

高级优化技巧

  • 时间补偿:根据帧间隔时间(deltaTime)调整计算,避免帧率波动导致速度异常:

    js实现重力

    let lastTime = 0;
    function animate(currentTime) {
        const deltaTime = (currentTime - lastTime) / 1000; // 转换为秒
        velocityY += gravity * deltaTime;
        lastTime = currentTime;
        requestAnimationFrame(animate);
    }
  • 空气阻力:添加速度衰减模拟更真实的下落:

    const airResistance = 0.99;
    velocityY *= airResistance; // 每帧速度衰减

实际应用示例(Canvas)

在 Canvas 中绘制受重力影响的小球:

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
let ball = { x: 100, y: 50, radius: 20, vx: 2, vy: 0 };

function draw() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ball.vy += gravity;
    ball.y += ball.vy;

    // 底部碰撞检测
    if (ball.y + ball.radius > canvas.height) {
        ball.y = canvas.height - ball.radius;
        ball.vy *= -bounceFactor;
    }

    ctx.beginPath();
    ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);
    ctx.fill();
    requestAnimationFrame(draw);
}
draw();

通过调整参数如 gravitybounceFactor 和初始速度,可以模拟不同材质的物体运动特性。

标签: 重力js
分享给朋友:

相关文章

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…