当前位置:首页 > JavaScript

js实现宝剑

2026-03-13 19:57:32JavaScript

使用JavaScript实现宝剑效果

在JavaScript中实现宝剑效果可以通过Canvas绘图或CSS动画结合交互事件完成。以下是两种常见方法:

Canvas绘制动态宝剑

js实现宝剑

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

function drawSword() {
  // 剑柄
  ctx.fillStyle = '#8B4513';
  ctx.fillRect(100, 50, 20, 100);

  // 护手
  ctx.fillStyle = '#C0C0C0';
  ctx.beginPath();
  ctx.moveTo(90, 70);
  ctx.lineTo(130, 70);
  ctx.lineTo(130, 80);
  ctx.lineTo(90, 80);
  ctx.closePath();
  ctx.fill();

  // 剑身
  ctx.fillStyle = '#E6E6FA';
  ctx.beginPath();
  ctx.moveTo(110, 50);
  ctx.lineTo(115, 10);
  ctx.lineTo(105, 10);
  ctx.closePath();
  ctx.fill();
}

// 添加鼠标跟随效果
canvas.addEventListener('mousemove', (e) => {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.save();
  ctx.translate(e.offsetX, e.offsetY);
  drawSword();
  ctx.restore();
});

CSS动画宝剑效果

<div class="sword">
  <div class="blade"></div>
  <div class="hilt"></div>
  <div class="guard"></div>
</div>

<style>
.sword {
  position: relative;
  width: 200px;
  height: 400px;
}

.blade {
  position: absolute;
  width: 20px;
  height: 300px;
  background: linear-gradient(to right, #ddd, #fff);
  border-radius: 5px;
  top: 0;
  left: 90px;
  box-shadow: 0 0 10px rgba(255,255,255,0.8);
  animation: glow 2s infinite alternate;
}

@keyframes glow {
  from { box-shadow: 0 0 5px #fff; }
  to { box-shadow: 0 0 20px #fff; }
}
</style>

实现宝剑物理效果

为宝剑添加碰撞检测和物理特性:

js实现宝剑

class Sword {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.angle = 0;
    this.length = 150;
  }

  update(targetX, targetY) {
    const dx = targetX - this.x;
    const dy = targetY - this.y;
    this.angle = Math.atan2(dy, dx);
  }

  draw(ctx) {
    ctx.save();
    ctx.translate(this.x, this.y);
    ctx.rotate(this.angle);

    // 绘制剑身
    ctx.fillStyle = 'silver';
    ctx.fillRect(0, -5, this.length, 10);

    // 绘制剑柄
    ctx.fillStyle = 'brown';
    ctx.fillRect(-20, -8, 20, 16);
    ctx.restore();
  }
}

实现宝剑攻击效果

添加攻击动画和命中检测:

let isAttacking = false;

function attack() {
  if(isAttacking) return;

  isAttacking = true;
  const swordElement = document.querySelector('.sword');
  swordElement.style.transition = 'transform 0.2s';
  swordElement.style.transform = 'rotate(60deg)';

  setTimeout(() => {
    swordElement.style.transform = 'rotate(0deg)';
    isAttacking = false;
  }, 200);

  // 检测命中
  checkHit();
}

document.addEventListener('keydown', (e) => {
  if(e.key === ' ') attack();
});

优化性能的技巧

使用requestAnimationFrame进行动画循环:

function gameLoop() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  sword.update(mouseX, mouseY);
  sword.draw(ctx);
  requestAnimationFrame(gameLoop);
}

gameLoop();

考虑使用WebGL或Three.js实现3D宝剑效果,这对性能要求较高的场景更合适。

标签: 宝剑js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

链表实现js

链表实现js

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

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…