You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript开发网页棋盘游戏 火柴人朝向移动方向问题求助

火柴人角色移动朝向及动画异常修复方案

问题根因

  • 眼睛嘴巴朝向与移动方向相反:左右方向移动逻辑中,五官的right定位值设置颠倒,导致显示朝向和移动方向反向
  • 手臂异常摆动:每次触发方向键时直接覆盖animation属性,未清除原有动画状态,导致动画帧跳变;且仅修改了单只手臂的动画规则,另一只手臂仍沿用原方向动画,出现动作冲突

修复代码

JavaScript 代码

// 提前获取所需DOM元素
const arms = document.querySelectorAll('.arm');
const moveBy = 75; // 可保留你原有的步长值
const icon = document.querySelector('.stickman');
const eye = document.querySelector('.eye');
const mouth = document.querySelector('.mouth');

window.addEventListener("keyup", (e) => {
  // 切换动画前先重置所有手臂动画,触发重绘避免跳变
  arms.forEach(arm => {
    arm.style.animation = 'none';
  });
  // 强制重绘清除动画缓存
  void arms[0].offsetWidth;

  switch (e.key) {
    case "ArrowLeft":
      update();
      icon.style.left = parseInt(icon.style.left || 0) - moveBy + "px";
      // 互换原左右方向的五官定位值,修正朝向
      eye.style.right = "25%";
      mouth.style.right = "0%";
      arms.forEach(arm => {
        arm.style.animation = "walk-arm2 1s infinite";
      });
      // 通过类控制伪元素动画,避免直接操作伪元素样式
      icon.classList.add('facing-left');
      icon.classList.remove('facing-right');
      break;
    case "ArrowRight":
      update();
      icon.style.left = parseInt(icon.style.left || 0) + moveBy + "px";
      eye.style.right = "65%";
      mouth.style.right = "40%";
      arms.forEach(arm => {
        arm.style.animation = "walk-arm 1s infinite";
      });
      icon.classList.add('facing-right');
      icon.classList.remove('facing-left');
      break;
    case "ArrowUp":
      update();
      icon.style.top = parseInt(icon.style.top || 0) - moveBy + "px";
      // 可自行补充上下方向的朝向逻辑,比如设置五官居中
      break;
    case "ArrowDown":
      update();
      icon.style.top = parseInt(icon.style.top || 0) + moveBy + "px";
      // 可自行补充上下方向的朝向逻辑
  }
  verifyAllPositions();
});

// 合并冗余的位置校验函数,减少重复代码
function verifyAllPositions() {
  const checkPoints = [
    {left: "650px", top: "50px"},
    {left: "375px", top: "325px"},
    {left: "700px", top: "600px"},
    {left: "875px", top: "75px"}
  ];
  const currentLeft = icon.style.left;
  const currentTop = icon.style.top;
  const isMatch = checkPoints.some(point => point.left === currentLeft && point.top === currentTop);
  if (isMatch) {
    const rn = Math.floor(Math.random() * 45) + 1;
    console.log(rn);
    document.querySelector("#modal" + rn).classList.add("show");
  }
}

function openShop() {
  // 原有逻辑保留即可
}

CSS 补充代码(控制手臂伪元素动画)

/* 向左朝向时的手臂伪元素动画 */
.stickman.facing-left .arm::after {
  animation: walk-arm-after2 1s infinite;
}
/* 向右朝向时的手臂伪元素动画 */
.stickman.facing-right .arm::after {
  animation: walk-arm-after 1s infinite;
}

HTML 代码无需调整

优化建议

  • 可将朝向逻辑统一封装为单独函数,后续拓展上下朝向时更易维护
  • 建议将移动事件改为监听keydown配合防抖逻辑,操作响应会更流畅
  • 可以给火柴人添加静止状态,松开方向键时停止走路动画,提升使用体验

内容的提问来源于stack exchange,提问作者DIMITRI PORTILLA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 07:24:04