当前位置:首页 > JavaScript

js实现投球

2026-02-28 20:00:47JavaScript

实现投球动画的步骤

使用Canvas绘制球体 创建一个Canvas元素,通过arc()方法绘制圆形球体。设置填充颜色和描边样式,使球体具有立体感。

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

function drawBall(x, y, radius) {
  ctx.beginPath();
  ctx.arc(x, y, radius, 0, Math.PI * 2);
  ctx.fillStyle = 'red';
  ctx.fill();
  ctx.closePath();
}

定义球的运动轨迹 使用抛物线公式模拟投球轨迹。水平方向匀速运动,垂直方向受重力加速度影响。

let ball = {
  x: 50,
  y: canvas.height - 30,
  radius: 10,
  dx: 5,  // 水平速度
  dy: -15, // 初始垂直速度
  gravity: 0.4
};

function updateBallPosition() {
  ball.x += ball.dx;
  ball.y += ball.dy;
  ball.dy += ball.gravity; // 重力影响
}

动画循环实现 通过requestAnimationFrame创建动画循环,每帧清除画布并重绘球体。

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  drawBall(ball.x, ball.y, ball.radius);
  updateBallPosition();

  if (ball.y + ball.radius < canvas.height) {
    requestAnimationFrame(animate);
  }
}

animate();

添加碰撞检测

边界碰撞检测 当球碰到画布底部时,模拟反弹效果,通过减少垂直速度实现能量损失。

function checkCollision() {
  // 底部碰撞
  if (ball.y + ball.radius > canvas.height) {
    ball.y = canvas.height - ball.radius;
    ball.dy = -ball.dy * 0.7; // 反弹系数
  }

  // 右侧碰撞
  if (ball.x + ball.radius > canvas.width) {
    ball.x = canvas.width - ball.radius;
    ball.dx = -ball.dx * 0.7;
  }
}

交互控制投球

鼠标/触摸事件监听 通过事件监听获取投球起始点,计算投掷力度和角度。

let isDragging = false;
let startPos = {};

canvas.addEventListener('mousedown', (e) => {
  isDragging = true;
  startPos = { x: e.clientX, y: e.clientY };
});

canvas.addEventListener('mouseup', (e) => {
  if (isDragging) {
    const endPos = { x: e.clientX, y: e.clientY };
    const dx = (endPos.x - startPos.x) / 10;
    const dy = (endPos.y - startPos.y) / 10;

    ball.x = startPos.x;
    ball.y = startPos.y;
    ball.dx = dx;
    ball.dy = dy;

    animate();
    isDragging = false;
  }
});

性能优化建议

使用双缓冲技术 创建离屏Canvas进行预渲染,减少画面闪烁。

节流动画帧率 通过时间戳控制帧率,避免过度消耗资源。

let lastTime = 0;
function animate(timestamp) {
  if (timestamp - lastTime > 16) { // ~60fps
    // 更新和绘制逻辑
    lastTime = timestamp;
  }
  requestAnimationFrame(animate);
}

添加运动衰减 随时间减少球体速度,最终停止运动,避免无限反弹。

js实现投球

function applyFriction() {
  ball.dx *= 0.99;
  if (Math.abs(ball.dx) < 0.1) ball.dx = 0;
  if (Math.abs(ball.dy) < 0.1) ball.dy = 0;
}

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现跳转

js实现跳转

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

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…