僵尸血量显示异常修复说明.md 3.8 KB

僵尸血量显示异常修复说明

问题描述

僵尸短时间被多个植物击中后,血量显示出现异常,包括:

  • 血条动画错乱
  • 血量数值显示不准确
  • 多个动画同时播放导致视觉混乱

问题原因分析

1. 动画冲突问题

HPBarAnimation.ts 中,当敌人短时间内多次受伤时:

  • 每次调用 playDamageAnimation() 都会创建新的 tween 动画
  • 多个动画同时运行,互相干扰
  • 没有机制停止之前的动画,导致动画状态混乱

2. 血量计算精度问题

EnemyInstance.ts 中:

  • 直接进行血量减法运算,可能产生浮点数精度问题
  • 没有对血量边界进行严格检查
  • 血量显示时没有进行整数化处理

3. 并发调用保护不足

  • 缺少对重复伤害的有效过滤
  • 没有对无效伤害值的检查

修复方案

1. 修复动画冲突 (HPBarAnimation.ts)

添加动画状态管理

private currentTween: any = null; // 当前正在运行的动画

修改 playDamageAnimation 方法

private playDamageAnimation(newProgress: number) {
    // 停止当前正在运行的动画,避免动画冲突
    if (this.currentTween) {
        this.currentTween.stop();
        this.currentTween = null;
    }
    
    // ... 其他代码
    
    // 保存动画引用
    this.currentTween = tween({ progress: originalProgress })
        // ... 动画配置
        .start();
}

添加资源清理

onDestroy() {
    // 清理正在运行的动画,防止内存泄漏
    if (this.currentTween) {
        this.currentTween.stop();
        this.currentTween = null;
    }
}

2. 修复血量计算 (EnemyInstance.ts)

改进 takeDamage 方法

takeDamage(damage: number, isCritical: boolean = false) {
    // 确保伤害值为正数
    if (damage <= 0) {
        console.warn(`[EnemyInstance] 无效的伤害值: ${damage}`);
        return;
    }
    
    // 计算新的血量,确保不会低于0
    const newHealth = Math.max(0, this.health - damage);
    const actualDamage = this.health - newHealth;
    this.health = newHealth;
    
    // ... 其他代码
}

改进 updateHealthDisplay 方法

updateHealthDisplay() {
    // 确保血量值在有效范围内
    this.health = Math.max(0, Math.min(this.maxHealth, this.health));
    
    const healthProgress = this.maxHealth > 0 ? this.health / this.maxHealth : 0;
    
    // 显示整数血量值
    label.string = Math.ceil(this.health).toString();
}

修复效果

1. 动画表现改善

  • ✅ 消除了多个血条动画同时播放的问题
  • ✅ 血条动画现在会正确地停止之前的动画再开始新的
  • ✅ 动画状态管理更加可靠

2. 血量显示准确性

  • ✅ 血量计算更加精确,避免浮点数问题
  • ✅ 血量显示始终为整数
  • ✅ 血量值严格限制在有效范围内

3. 性能优化

  • ✅ 避免了无效的动画创建
  • ✅ 正确清理动画资源,防止内存泄漏
  • ✅ 添加了输入验证,提高代码健壮性

测试方法

使用提供的测试脚本 test_enemy_health_fix.js

  1. 在游戏中生成敌人
  2. 在控制台运行测试函数:

    testMultipleDamage();
    
  3. 观察敌人血量显示是否正常

  4. 检查血条动画是否流畅

相关文件

  • assets/scripts/Animations/HPBarAnimation.ts - 血条动画组件
  • assets/scripts/CombatSystem/EnemyInstance.ts - 敌人实例组件
  • test_enemy_health_fix.js - 测试脚本

注意事项

  1. 修复后需要重新编译项目
  2. 建议在不同类型的敌人上测试修复效果
  3. 如果仍有问题,请检查控制台日志获取更多调试信息

版本信息

  • 修复日期: 2024年
  • 影响组件: HPBarAnimation, EnemyInstance
  • 兼容性: Cocos Creator 3.x