当前位置:首页 > 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创建动画循环,每帧清除画布并重绘球体。

js实现投球

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;
  }
}

交互控制投球

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

js实现投球

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);
}

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

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轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现百叶窗

js实现百叶窗

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

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…