当前位置:首页 > 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)

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

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

优化投篮物理模型

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

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

添加碰撞检测

检测篮球与篮筐的碰撞:

js实现投篮动作

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
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现点击显示和隐藏

js实现点击显示和隐藏

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

js实现百叶窗

js实现百叶窗

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