当前位置:首页 > JavaScript

js实现投篮

2026-04-06 10:22:35JavaScript

JavaScript 实现投篮动画

使用 HTML5 Canvas 和 JavaScript 可以创建一个简单的投篮动画。以下是一个基础实现示例,模拟篮球的抛物线运动及篮筐碰撞检测。

js实现投篮

初始化 Canvas 和基本参数

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
let ball = { x: 50, y: 300, radius: 15, vx: 5, vy: -10 };
const hoop = { x: 400, y: 150, width: 60, height: 5 };
let gravity = 0.2;
let isShooting = false;

绘制篮球和篮筐

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

function drawHoop() {
    ctx.fillStyle = 'black';
    ctx.fillRect(hoop.x, hoop.y, hoop.width, hoop.height);
}

更新篮球位置(抛物线运动)

function updateBall() {
    ball.vy += gravity; // 重力加速度
    ball.x += ball.vx;
    ball.y += ball.vy;

    // 碰撞检测:篮筐
    if (
        ball.x + ball.radius > hoop.x &&
        ball.x - ball.radius < hoop.x + hoop.width &&
        ball.y + ball.radius > hoop.y &&
        ball.y - ball.radius < hoop.y + hoop.height
    ) {
        ball.vy *= -0.6; // 反弹
        ball.vx *= 0.9;  // 摩擦力
    }

    // 边界检测
    if (ball.y + ball.radius > canvas.height) {
        ball.y = canvas.height - ball.radius;
        ball.vy *= -0.5; // 地面反弹
    }
}

动画循环

function gameLoop() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    drawHoop();
    drawBall();
    if (isShooting) updateBall();
    requestAnimationFrame(gameLoop);
}
gameLoop();

触发投篮

document.addEventListener('click', () => {
    isShooting = true;
    ball = { x: 50, y: 300, radius: 15, vx: 5, vy: -10 }; // 重置初始速度
});

HTML 结构

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

增强功能建议

  1. 调整投篮力度:通过鼠标拖动距离计算初始速度。

    js实现投篮

    let startPos = null;
    canvas.addEventListener('mousedown', (e) => {
        startPos = { x: e.clientX, y: e.clientY };
    });
    canvas.addEventListener('mouseup', (e) => {
        if (startPos) {
            const dx = e.clientX - startPos.x;
            const dy = e.clientY - startPos.y;
            ball.vx = dx * 0.1;
            ball.vy = dy * 0.1;
            isShooting = true;
        }
    });
  2. 添加篮球纹理:在 drawBall() 中使用 drawImage 加载篮球图片替代简单圆形。

  3. 得分系统:检测篮球穿过篮筐中心时增加分数。

完整代码可参考 CodePen 示例

标签: js
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

链表实现js

链表实现js

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