当前位置:首页 > JavaScript

js实现射箭

2026-04-07 00:42:24JavaScript

使用 Canvas 实现射箭动画

在 JavaScript 中实现射箭效果可以通过 HTML5 的 Canvas 结合动画原理来完成。以下是一个基础的实现方法:

js实现射箭

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

let arrow = {
  x: 50,
  y: canvas.height / 2,
  speed: 0,
  angle: 0,
  flying: false
};

function drawArrow() {
  ctx.save();
  ctx.translate(arrow.x, arrow.y);
  ctx.rotate(arrow.angle);

  // 绘制箭杆
  ctx.beginPath();
  ctx.moveTo(0, 0);
  ctx.lineTo(30, 0);
  ctx.strokeStyle = 'brown';
  ctx.lineWidth = 2;
  ctx.stroke();

  // 绘制箭头
  ctx.beginPath();
  ctx.moveTo(30, 0);
  ctx.lineTo(25, -5);
  ctx.lineTo(25, 5);
  ctx.closePath();
  ctx.fillStyle = 'gray';
  ctx.fill();

  ctx.restore();
}

function update() {
  if (arrow.flying) {
    arrow.x += arrow.speed * Math.cos(arrow.angle);
    arrow.y += arrow.speed * Math.sin(arrow.angle);
    arrow.speed *= 0.98; // 空气阻力

    // 边界检测
    if (arrow.x > canvas.width || arrow.y < 0 || arrow.y > canvas.height) {
      resetArrow();
    }
  }
}

function resetArrow() {
  arrow.x = 50;
  arrow.y = canvas.height / 2;
  arrow.speed = 0;
  arrow.flying = false;
}

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  update();
  drawArrow();
  requestAnimationFrame(animate);
}

// 发射箭
canvas.addEventListener('click', () => {
  if (!arrow.flying) {
    arrow.speed = 10;
    arrow.flying = true;
  }
});

animate();

添加物理效果增强真实感

为了增加真实感,可以引入重力加速度和更精确的物理计算:

js实现射箭

const gravity = 0.2;

function update() {
  if (arrow.flying) {
    arrow.x += arrow.speed * Math.cos(arrow.angle);
    arrow.y += arrow.speed * Math.sin(arrow.angle);
    arrow.speed *= 0.98;
    arrow.y += gravity; // 重力影响

    if (arrow.x > canvas.width || arrow.y < 0 || arrow.y > canvas.height) {
      resetArrow();
    }
  }
}

添加瞄准功能

允许用户调整箭的发射角度:

let mouseX = 0, mouseY = 0;

canvas.addEventListener('mousemove', (e) => {
  if (!arrow.flying) {
    mouseX = e.clientX - canvas.offsetLeft;
    mouseY = e.clientY - canvas.offsetTop;
    arrow.angle = Math.atan2(mouseY - arrow.y, mouseX - arrow.x);
  }
});

添加目标物体

在场景中添加目标可以增加交互性:

const target = {
  x: canvas.width - 100,
  y: canvas.height / 2,
  radius: 20
};

function drawTarget() {
  ctx.beginPath();
  ctx.arc(target.x, target.y, target.radius, 0, Math.PI * 2);
  ctx.fillStyle = 'red';
  ctx.fill();
}

function checkHit() {
  const dx = arrow.x - target.x;
  const dy = arrow.y - target.y;
  const distance = Math.sqrt(dx * dx + dy * dy);

  if (distance < target.radius) {
    alert('命中目标!');
    resetArrow();
  }
}

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  update();
  drawTarget();
  drawArrow();
  if (arrow.flying) checkHit();
  requestAnimationFrame(animate);
}

完整HTML结构

<!DOCTYPE html>
<html>
<head>
  <title>射箭游戏</title>
  <style>
    #gameCanvas {
      border: 1px solid black;
      background-color: #f0f0f0;
    }
  </style>
</head>
<body>
  <canvas id="gameCanvas" width="800" height="400"></canvas>
  <script>
    // 上述JavaScript代码放在这里
  </script>
</body>
</html>

这个实现提供了基本的射箭功能,包括箭的绘制、物理运动、瞄准和目标检测。可以根据需要进一步扩展,如添加多个目标、计分系统或更复杂的物理效果。

标签: js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现点击显示和隐藏

js实现点击显示和隐藏

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…