当前位置:首页 > JavaScript

js实现投篮动作

2026-03-16 02:22:42JavaScript

实现投篮动作的基本思路

在JavaScript中实现投篮动作可以通过物理引擎模拟或手动计算抛物线轨迹。以下是两种常见方法:

使用Canvas绘制抛物线动画

通过Canvas绘制篮球的抛物线运动,需要计算篮球的位置随时间变化的轨迹:

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
let x = 50, y = canvas.height - 50;
let vx = 5, vy = -15; // 初始速度
const gravity = 0.2;

function drawBall() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.beginPath();
    ctx.arc(x, y, 20, 0, Math.PI * 2);
    ctx.fillStyle = 'orange';
    ctx.fill();

    // 更新位置
    x += vx;
    y += vy;
    vy += gravity;

    // 边界检测
    if (y > canvas.height - 20) {
        y = canvas.height - 20;
        vy *= -0.7; // 弹性系数
    }

    requestAnimationFrame(drawBall);
}

drawBall();

使用物理引擎(如Matter.js)

对于更复杂的物理效果,可以使用物理引擎库:

js实现投篮动作

const Engine = Matter.Engine,
      Render = Matter.Render,
      World = Matter.World,
      Bodies = Matter.Bodies;

const engine = Engine.create();
const render = Render.create({
    element: document.body,
    engine: engine,
    options: { width: 800, height: 600 }
});

// 创建篮球和篮筐
const ball = Bodies.circle(100, 500, 20, { 
    restitution: 0.8,
    render: { fillStyle: 'orange' }
});
const hoop = Bodies.rectangle(700, 300, 100, 10, { 
    isStatic: true,
    angle: Math.PI * 0.1
});

World.add(engine.world, [ball, hoop]);
Engine.run(engine);
Render.run(render);

// 投篮动作
function shoot() {
    Matter.Body.setVelocity(ball, { x: 15, y: -20 });
}

添加用户交互控制

可以通过鼠标或键盘事件触发投篮动作:

// 鼠标点击投篮
canvas.addEventListener('click', (e) => {
    const power = calculatePower(e.clientX, e.clientY);
    vx = power.x;
    vy = power.y;
});

function calculatePower(clickX, clickY) {
    const dx = clickX - x;
    const dy = clickY - y;
    const distance = Math.sqrt(dx * dx + dy * dy);
    return {
        x: dx / distance * 10,
        y: dy / distance * 10
    };
}

优化投篮物理模型

更精确的投篮模型应考虑出手角度和初速度:

js实现投篮动作

$$ x(t) = v_0 \cdot \cos(\theta) \cdot t \ y(t) = v_0 \cdot \sin(\theta) \cdot t - \frac{1}{2}gt^2 $$

实现代码:

function projectileMotion(v0, angle) {
    const radians = angle * Math.PI / 180;
    const vx = v0 * Math.cos(radians);
    const vy = v0 * Math.sin(radians);

    return { vx, vy };
}

添加碰撞检测

检测篮球与篮筐的碰撞:

function checkCollision() {
    const distance = Math.sqrt(
        Math.pow(ball.x - hoop.x, 2) + 
        Math.pow(ball.y - hoop.y, 2)
    );
    return distance < (ball.radius + hoop.width/2);
}

这些方法可以根据实际需求组合使用,创建出更逼真的投篮模拟效果。

标签: 动作js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现复制到剪贴板

js实现复制到剪贴板

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

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…