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

Vue.js战斗应用问题:确认框覆盖重置函数致日志异常

解决Vue.js战斗游戏中快速点击攻击导致的日志残留问题

这种快速点击引发的状态异常我之前做类似游戏项目时也踩过坑,核心问题出在快速点击产生的重复异步任务没有被正确中断,咱们来一步步解决:

可能的原因

  • 快速点击攻击按钮时,多次触发的攻击事件会被加入浏览器的异步任务队列。当怪物血量归0弹出确认弹窗时,队列里可能还残留着未执行的攻击任务;等你确认重置后,这些残留任务依然会执行,往日志数组里多插一条记录。
  • 重置游戏的逻辑没有在弹窗触发时立即阻断后续攻击操作,导致状态重置不彻底。

具体解决方案

1. 给攻击按钮添加防抖处理

用防抖限制短时间内重复触发攻击事件,避免任务队列堆积。以Vue组件为例:

import _ from 'lodash'; // 也可以自己实现简单防抖逻辑

export default {
  data() {
    return {
      playerHealth: 100,
      monsterHealth: 100,
      logs: [],
      attack: null
    };
  },
  created() {
    // 初始化带防抖的攻击函数
    this.attack = _.debounce(() => {
      // 执行攻击逻辑
      const damage = Math.floor(Math.random() * 10) + 1;
      this.monsterHealth -= damage;
      this.logs.unshift({ 
        text: `玩家对怪物造成了${damage}点伤害`, 
        isPlayer: true 
      });

      // 检查怪物是否死亡,触发重置流程
      if (this.monsterHealth <= 0) {
        // 立即取消后续可能的防抖任务
        this.attack.cancel();
        if (confirm('你赢了!是否重新开始游戏?')) {
          this.resetGame();
        }
      }
    }, 300); // 300ms内只允许触发一次攻击
  },
  methods: {
    resetGame() {
      // 重置所有状态前,确保取消所有待执行的攻击任务
      this.attack.cancel();
      this.playerHealth = 100;
      this.monsterHealth = 100;
      // 强制清空日志数组
      this.logs = [];
    }
  }
}

2. 弹窗触发时禁用攻击按钮

在弹窗显示期间,直接禁用攻击按钮,从根源上阻止后续点击:

<button @click="attack" :disabled="monsterHealth <= 0">攻击</button>

这样当怪物血量归0时,按钮立刻禁用,不会再接收新的点击事件,也就不会产生残留任务。

3. 重置时强制清空日志与任务队列

在resetGame方法里,除了重置血量,一定要确保日志数组被彻底清空,同时取消所有待执行的防抖任务,避免残留逻辑干扰新游戏状态。

总结

核心思路就是阻断快速点击产生的重复异步任务,通过防抖、禁用按钮、取消待执行任务这几个手段配合,就能彻底解决日志残留和游戏无法完全重置的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:24:58