当前位置:首页 > JavaScript

js实现投球

2026-01-14 14:42:28JavaScript

js实现投球

js实现投球

实现投球动画的基本思路

使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。

创建基础HTML结构

<div class="ball" id="ball"></div>
<div class="target" id="target"></div>

添加基础CSS样式

.ball {
  width: 50px;
  height: 50px;
  background-color: red;
  border-radius: 50%;
  position: absolute;
  left: 50px;
  top: 300px;
  transition: transform 0.5s ease-out;
}

.target {
  width: 100px;
  height: 100px;
  background-color: blue;
  position: absolute;
  right: 50px;
  top: 350px;
}

JavaScript抛物线运动实现

function throwBall() {
  const ball = document.getElementById('ball');
  const target = document.getElementById('target');

  const startPos = { x: 50, y: 300 };
  const endPos = { 
    x: target.offsetLeft - 50, 
    y: target.offsetTop 
  };

  const duration = 1000; // 动画持续时间(ms)
  const startTime = performance.now();

  function animate(currentTime) {
    const elapsed = currentTime - startTime;
    const progress = Math.min(elapsed / duration, 1);

    // 抛物线轨迹计算
    const x = startPos.x + (endPos.x - startPos.x) * progress;
    const y = startPos.y + (endPos.y - startPos.y) * progress 
              - 200 * Math.sin(progress * Math.PI); // 抛物线高度

    ball.style.transform = `translate(${x}px, ${y}px)`;

    if (progress < 1) {
      requestAnimationFrame(animate);
    }
  }

  requestAnimationFrame(animate);
}

// 调用投球函数
throwBall();

添加旋转效果增强真实感

function throwBall() {
  // ...之前的代码...

  function animate(currentTime) {
    // ...之前的计算...

    // 添加旋转效果
    const rotation = progress * 720; // 旋转两圈
    ball.style.transform = `translate(${x}px, ${y}px) rotate(${rotation}deg)`;

    // ...剩余代码...
  }
}

碰撞检测与回弹效果

function throwBall() {
  // ...之前的代码...

  function animate(currentTime) {
    // ...之前的计算...

    // 碰撞检测
    if (progress >= 1) {
      // 简单回弹效果
      ball.style.transition = 'transform 0.3s ease-out';
      setTimeout(() => {
        ball.style.transform = `translate(${endPos.x}px, ${endPos.y + 20}px)`;
        setTimeout(() => {
          ball.style.transform = `translate(${endPos.x}px, ${endPos.y}px)`;
        }, 300);
      }, 0);
      return;
    }

    // ...剩余代码...
  }
}

使用CSS动画替代JavaScript动画

@keyframes throw {
  0% {
    transform: translate(50px, 300px) rotate(0deg);
  }
  50% {
    transform: translate(calc(50% - 25px), 100px) rotate(360deg);
  }
  100% {
    transform: translate(calc(100% - 100px), 350px) rotate(720deg);
  }
}

.ball.throwing {
  animation: throw 1s cubic-bezier(0.36, 0, 0.64, 1) forwards;
}
function throwBall() {
  const ball = document.getElementById('ball');
  ball.classList.add('throwing');

  // 动画结束后移除类
  ball.addEventListener('animationend', () => {
    ball.classList.remove('throwing');
  });
}

使用物理引擎实现更真实效果

// 使用matter.js物理引擎
const engine = Matter.Engine.create();
const world = engine.world;
const render = Matter.Render.create({
  element: document.body,
  engine: engine,
  options: {
    width: 800,
    height: 600,
    wireframes: false
  }
});

const ball = Matter.Bodies.circle(100, 300, 25);
const ground = Matter.Bodies.rectangle(400, 550, 800, 50, { isStatic: true });

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

// 投球函数
function throwBall() {
  Matter.Body.setVelocity(ball, { x: 10, y: -15 });
  Matter.Body.setAngularVelocity(ball, 0.1);
}

响应式投球控制

let isDragging = false;
let startX, startY;

document.getElementById('ball').addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX;
  startY = e.clientY;
});

document.addEventListener('mouseup', (e) => {
  if (!isDragging) return;

  const endX = e.clientX;
  const endY = e.clientY;
  const velocityX = (startX - endX) / 10;
  const velocityY = (startY - endY) / 10;

  // 使用物理引擎投球
  Matter.Body.setVelocity(ball, { x: velocityX, y: velocityY });
  Matter.Body.setAngularVelocity(ball, velocityX / 100);

  isDragging = false;
});

标签: js
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

链表实现js

链表实现js

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

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…