欢迎加入开源鸿蒙PC社区:
https://harmonypc.csdn.net/
atomgit仓库地址:https://atomgit.com/2401_83963238/hongmeng61fps60renwuqianxing
在这里插入图片描述

在这里插入图片描述

一、功能概述

前后移动是人物行走动画的核心交互功能,允许用户通过按钮控制人物的移动方向。本功能涉及多个状态管理和定时器协调,容易出现多种异常情况。

1.1 功能架构

┌─────────────────────────────────────────────────────────────────┐
│                    前后移动功能架构                            │
├─────────────────────────────────────────────────────────────────┤
│                                                               │
│  用户交互层                                                    │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐            │
│  │   前进按钮   │  │   后退按钮   │  │   暂停按钮   │            │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘            │
│         │                │                │                    │
│         ↓                ↓                ↓                    │
│  ┌─────────────────────────────────────────────────────┐       │
│  │              状态管理层                              │       │
│  │  - moveDirection: 'left' | 'right' | 'none'        │       │
│  │  - isWalking: boolean                              │       │
│  │  - characterX: number                              │       │
│  └─────────────────────────────────────────────────────┘       │
│         ↓                                                     │
│  ┌─────────────────────────────────────────────────────┐       │
│  │              定时器管理层                              │       │
│  │  - moveTimer: 控制水平移动 (30ms)                    │       │
│  │  - walkTimer: 控制行走姿态 (16ms)                   │       │
│  │  - groundTimer: 控制地面滚动 (20ms)                 │       │
│  │  - jumpTimer: 控制跳跃动画 (30ms)                   │       │
│  └─────────────────────────────────────────────────────┘       │
│         ↓                                                     │
│  ┌─────────────────────────────────────────────────────┐       │
│  │              UI 渲染层                                │       │
│  │  - 人物位置更新                                      │       │
│  │  - 地面滚动效果                                      │       │
│  │  - 按钮状态显示                                      │       │
│  │  - 信息面板更新                                      │       │
│  └─────────────────────────────────────────────────────┘       │
│                                                               │
└─────────────────────────────────────────────────────────────────┘

1.2 核心状态变量

状态变量 类型 说明 可能异常
moveDirection string 移动方向:‘left’ ‘right’
isWalking boolean 是否在行走 状态不同步
characterX number 人物 X 坐标 越界、NaN
isJumping boolean 是否在跳跃 状态冲突
jumpHeight number 跳跃高度 负数、NaN

二、异常类型汇总

2.1 异常分类统计

分类 异常数量 严重程度 触发场景
状态管理 4 🔴 高 初始化、切换、重置
边界处理 3 🔴 高 边界检测、循环移动
定时器同步 3 🟡 中 启动、暂停、清理
状态冲突 3 🟡 中 跳跃+移动、快速点击
性能问题 2 🟢 低 频繁操作
用户交互 2 🟢 低 按钮状态、显示同步
总计 17 - -

2.2 异常优先级排序

优先级 异常类型 影响 修复难度
P0 方向未初始化 应用崩溃
P0 边界检测错误 人物消失
P1 定时器未清理 内存泄漏
P1 状态不同步 动画异常
P2 竞态条件 状态混乱
P2 性能下降 卡顿

三、状态管理类异常

3.1 异常一:移动方向未初始化

问题描述:

moveDirection 未初始化或初始化为无效值,导致移动逻辑异常。

错误代码:

// ❌ 错误:未初始化或初始化错误
@State moveDirection: string;  // 未初始化
@State moveDirection: string = '';  // 无效值
@State moveDirection: string = 'forward';  // 拼写错误

错误表现:

  • 点击前进/后退按钮无响应
  • 人物位置不变化
  • 信息面板显示异常

解决方案:

// ✅ 正确:显式初始化并使用有效值
@State moveDirection: string = 'right';  // 默认向右移动

// ✅ 添加有效值检查
goForward(): void {
  this.moveDirection = 'right';
  this.isWalking = true;
}

goBackward(): void {
  this.moveDirection = 'left';
  this.isWalking = true;
}

stopMoving(): void {
  this.moveDirection = 'none';
  this.isWalking = false;
}

// ✅ 在定时器中添加有效性检查
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
  } else if (this.moveDirection === 'left') {
    this.characterX = this.characterX - 2;
  }
  // 无效值时不执行任何操作
}, 30);

3.2 异常二:状态不同步

问题描述:

isWalking 状态与 moveDirection 状态不一致,导致逻辑混乱。

错误代码:

// ❌ 错误:状态更新不完整
goForward(): void {
  this.moveDirection = 'right';
  // 忘记更新 isWalking
}

// ❌ 错误:部分状态更新
resetPosition(): void {
  this.characterX = 50;
  // 忘记重置 moveDirection 和 isWalking
}

错误表现:

  • 人物移动但姿态动画未播放
  • 信息面板显示与实际状态不符
  • 重置后状态混乱

解决方案:

// ✅ 正确:完整更新所有相关状态
goForward(): void {
  this.moveDirection = 'right';
  this.isWalking = true;
}

goBackward(): void {
  this.moveDirection = 'left';
  this.isWalking = true;
}

stopMoving(): void {
  this.moveDirection = 'none';
  this.isWalking = false;
}

resetPosition(): void {
  this.characterX = 50;
  this.moveDirection = 'right';
  this.isWalking = true;
  this.isJumping = false;
  this.jumpPhase = 0;
  this.jumpHeight = 0;
}

3.3 异常三:状态值越界

问题描述:

characterX 值超出合理范围,导致人物消失或渲染异常。

错误代码:

// ❌ 错误:边界检测不完整
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
    // 缺少上限检测
  } else if (this.moveDirection === 'left') {
    this.characterX = this.characterX - 2;
    // 缺少下限检测
  }
}, 30);

错误表现:

  • 人物移出屏幕后消失
  • 人物突然从屏幕另一侧出现(位置跳跃)
  • 极端情况下可能导致性能问题

解决方案:

// ✅ 正确:完整的边界检测和循环处理
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
    if (this.characterX > 900) {
      this.characterX = -50;  // 循环到左侧
    }
  } else if (this.moveDirection === 'left') {
    this.characterX = this.characterX - 2;
    if (this.characterX < -50) {
      this.characterX = 900;  // 循环到右侧
    }
  }
}, 30);

3.4 异常四:状态类型错误

问题描述:

状态变量类型错误导致运行时异常。

错误代码:

// ❌ 错误:类型不匹配
@State moveDirection: number = 1;  // 应该是 string
@State characterX: string = '50';  // 应该是 number

// ❌ 错误:类型转换错误
this.characterX = parseInt('abc');  // 返回 NaN

错误表现:

  • 应用崩溃
  • 人物位置不变化或异常
  • NaN 传播导致多处错误

解决方案:

// ✅ 正确:显式类型声明
@State moveDirection: string = 'right';
@State characterX: number = 50;

// ✅ 正确:类型安全的赋值
updatePosition(delta: number): void {
  let newValue: number = this.characterX + delta;
  
  // 检查是否为有效数字
  if (isNaN(newValue)) {
    console.warn('Invalid position value:', newValue);
    return;
  }
  
  this.characterX = newValue;
}

四、边界处理类异常

4.1 异常一:边界值设置错误

问题描述:

边界值设置不当导致人物在边界处行为异常。

错误代码:

// ❌ 错误:边界值不合理
if (this.characterX > 1000) {  // 超出屏幕宽度
  this.characterX = -50;
}

if (this.characterX < -100) {  // 超出合理范围
  this.characterX = 900;
}

错误表现:

  • 人物在边界处闪烁
  • 人物消失时间过长
  • 循环出现位置不准确

边界值计算原则:

屏幕宽度 = 900px(假设)
人物宽度 = 50px
右边界 = 屏幕宽度 - 人物宽度 = 850px
左边界 = -人物宽度 = -50px

实际设置时可以稍微扩展边界,确保平滑过渡:
右边界 = 900px(人物完全移出后再循环)
左边界 = -50px(人物完全移出后再循环)

解决方案:

// ✅ 正确:合理的边界值设置
const SCREEN_WIDTH: number = 900;
const CHARACTER_WIDTH: number = 50;

this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
    if (this.characterX > SCREEN_WIDTH) {
      this.characterX = -CHARACTER_WIDTH;
    }
  } else if (this.moveDirection === 'left') {
    this.characterX = this.characterX - 2;
    if (this.characterX < -CHARACTER_WIDTH) {
      this.characterX = SCREEN_WIDTH;
    }
  }
}, 30);

4.2 异常二:边界检测时机错误

问题描述:

边界检测时机不正确,导致人物穿越边界后才被重置。

错误代码:

// ❌ 错误:检测时机错误
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    // 先检测再更新(错误顺序)
    if (this.characterX > 900) {
      this.characterX = -50;
    }
    this.characterX = this.characterX + 2;
  }
}, 30);

错误表现:

  • 人物在边界处短暂消失
  • 循环出现时有视觉跳跃
  • 动画不流畅

解决方案:

// ✅ 正确:先更新再检测
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;  // 先更新位置
    if (this.characterX > 900) {  // 再检测边界
      this.characterX = -50;
    }
  } else if (this.moveDirection === 'left') {
    this.characterX = this.characterX - 2;  // 先更新位置
    if (this.characterX < -50) {  // 再检测边界
      this.characterX = 900;
    }
  }
}, 30);

4.3 异常三:地面滚动与人物位置不同步

问题描述:

地面滚动速度与人物移动速度不一致,导致视觉上人物与地面相对运动异常。

错误代码:

// ❌ 错误:速度不匹配
// 人物移动:每 30ms 移动 2px(约 67px/s)
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
  }
}, 30);

// 地面滚动:每 20ms 移动 1px(约 50px/s)
this.groundTimer = setInterval(() => {
  this.groundOffset = this.groundOffset + 1;
}, 20);

错误表现:

  • 人物看起来在"滑行"而不是行走
  • 地面滚动速度与人物移动不协调
  • 视觉上的速度感知不一致

解决方案:

// ✅ 正确:协调的速度设置
// 人物移动:每 30ms 移动 2px(约 67px/s)
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
  }
}, 30);

// 地面滚动:每 20ms 移动 3px(约 150px/s,比人物快)
this.groundTimer = setInterval(() => {
  this.groundOffset = this.groundOffset + 3;
  if (this.groundOffset >= 100) {
    this.groundOffset = 0;
  }
}, 20);

速度协调原则:

元素 速度关系 原因
人物 基准速度 参考速度
地面 比人物快 近景移动快,增加速度感
云朵 比人物慢 远景移动慢,增加空间感

五、定时器同步类异常

5.1 异常一:定时器未清理

问题描述:

组件销毁时定时器未清理,导致内存泄漏和状态异常。

错误代码:

// ❌ 错误:没有清理定时器
aboutToAppear(): void {
  this.moveTimer = setInterval(() => {
    // 移动逻辑
  }, 30);
  
  this.walkTimer = setInterval(() => {
    // 姿态逻辑
  }, 16);
}

// ❌ 没有 aboutToDisappear 方法

错误表现:

  • 内存泄漏(定时器持续运行)
  • 状态持续更新(即使组件已销毁)
  • 多个页面切换后性能下降

解决方案:

// ✅ 正确:完整的生命周期管理
aboutToAppear(): void {
  this.startAllAnimations();
}

aboutToDisappear(): void {
  this.stopAllAnimations();
}

startAllAnimations(): void {
  this.moveTimer = setInterval(() => {
    // 移动逻辑
  }, 30);
  
  this.walkTimer = setInterval(() => {
    // 姿态逻辑
  }, 16);
}

stopAllAnimations(): void {
  if (this.moveTimer > 0) {
    clearInterval(this.moveTimer);
    this.moveTimer = 0;
  }
  if (this.walkTimer > 0) {
    clearInterval(this.walkTimer);
    this.walkTimer = 0;
  }
  // 清理其他定时器...
}

5.2 异常二:定时器频率不一致

问题描述:

不同定时器频率不一致导致动画不同步。

错误代码:

// ❌ 错误:频率差异过大
// 姿态更新:16ms(60fps)
this.walkTimer = setInterval(() => {
  this.walkPhase = this.walkPhase + 1;
}, 16);

// 位置更新:100ms(10fps)
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
  }
}, 100);

错误表现:

  • 姿态动画与位置移动不同步
  • 人物看起来在"抽搐"而不是平滑行走
  • 视觉效果不自然

解决方案:

// ✅ 正确:协调的频率设置
// 姿态更新:16ms(60fps)- 需要高精度
this.walkTimer = setInterval(() => {
  if (this.isWalking) {
    this.walkPhase = this.walkPhase + 1;
    // 更新姿态参数...
  }
}, 16);

// 位置更新:30ms(33fps)- 中等精度
this.moveTimer = setInterval(() => {
  if (this.moveDirection === 'right') {
    this.characterX = this.characterX + 2;
  }
}, 30);

// 地面滚动:20ms(50fps)- 中等精度
this.groundTimer = setInterval(() => {
  this.groundOffset = this.groundOffset + 3;
}, 20);

5.3 异常三:定时器启动顺序错误

问题描述:

定时器启动顺序不当导致初始状态异常。

错误代码:

// ❌ 错误:启动顺序不合理
startAllAnimations(): void {
  // 先启动移动定时器
  this.moveTimer = setInterval(() => {
    if (this.moveDirection === 'right') {
      this.characterX = this.characterX + 2;
    }
  }, 30);
  
  // 后启动姿态定时器
  this.walkTimer = setInterval(() => {
    if (this.isWalking) {
      this.walkPhase = this.walkPhase + 1;
    }
  }, 16);
}

问题分析:

虽然启动顺序不影响最终结果,但逻辑上应该先启动姿态定时器,再启动移动定时器,因为姿态是人物行走的基础。

解决方案:

// ✅ 正确:合理的启动顺序
startAllAnimations(): void {
  // 先启动姿态定时器(基础动画)
  this.walkTimer = setInterval(() => {
    if (this.isWalking) {
      this.walkPhase = this.walkPhase + 1;
      // 更新姿态参数...
    }
  }, 16);
  
  // 再启动移动定时器(位置更新)
  this.moveTimer = setInterval(() => {
    if (this.moveDirection === 'right') {
      this.characterX = this.characterX + 2;
    }
  }, 30);
  
  // 最后启动场景定时器(环境渲染)
  this.groundTimer = setInterval(() => {
    this.groundOffset = this.groundOffset + 3;
  }, 20);
  
  this.cloudTimer = setInterval(() => {
    // 云朵移动逻辑
  }, 50);
}

六、状态冲突类异常

6.1 异常一:跳跃与移动的状态冲突

问题描述:

跳跃时移动状态不一致,导致人物在空中移动异常。

错误代码:

// ❌ 错误:跳跃时没有保持移动状态
jump(): void {
  if (!this.isJumping) {
    this.isJumping = true;
    this.jumpPhase = 0;
    // 没有设置 isWalking,导致姿态动画停止
  }
}

错误表现:

  • 跳跃时人物姿态冻结
  • 人物在空中保持静止姿态
  • 视觉效果不自然

解决方案:

// ✅ 正确:跳跃时保持行走状态
jump(): void {
  if (!this.isJumping) {
    this.isJumping = true;
    this.jumpPhase = 0;
    this.isWalking = true;  // 保持姿态动画
  }
}

// ✅ 跳跃定时器中保持移动
this.jumpTimer = setInterval(() => {
  if (this.isJumping) {
    this.jumpPhase = this.jumpPhase + 1;
    this.jumpHeight = Math.sin(this.jumpPhase * Math.PI / 180) * 80;
    
    // 跳跃时继续移动
    if (this.moveDirection === 'right') {
      this.characterX = this.characterX + 2;
    } else if (this.moveDirection === 'left') {
      this.characterX = this.characterX - 2;
    }
    
    if (this.jumpPhase >= 180) {
      this.isJumping = false;
      this.jumpPhase = 0;
      this.jumpHeight = 0;
    }
  }
}, 30);

6.2 异常二:快速点击按钮的竞态条件

问题描述:

快速连续点击多个按钮导致状态混乱。

错误场景:

用户操作序列:
1. 点击"前进"按钮 → moveDirection = 'right'
2. 快速点击"后退"按钮 → moveDirection = 'left'
3. 快速点击"暂停"按钮 → moveDirection = 'none'

错误表现:

  • 状态值可能是任意一个按钮设置的值
  • 最终状态取决于定时器执行时机
  • 可能出现状态"抖动"

解决方案:

// ✅ 正确:使用状态锁防止竞态条件
@State isProcessing: boolean = false;  // 状态锁

goForward(): void {
  if (this.isProcessing) {
    return;  // 正在处理中,忽略请求
  }
  this.isProcessing = true;
  
  this.moveDirection = 'right';
  this.isWalking = true;
  
  // 短暂延迟后释放锁
  setTimeout(() => {
    this.isProcessing = false;
  }, 50);
}

goBackward(): void {
  if (this.isProcessing) {
    return;
  }
  this.isProcessing = true;
  
  this.moveDirection = 'left';
  this.isWalking = true;
  
  setTimeout(() => {
    this.isProcessing = false;
  }, 50);
}

stopMoving(): void {
  if (this.isProcessing) {
    return;
  }
  this.isProcessing = true;
  
  this.moveDirection = 'none';
  this.isWalking = false;
  
  setTimeout(() => {
    this.isProcessing = false;
  }, 50);
}

6.3 异常三:重置时状态不一致

问题描述:

重置操作没有完整重置所有相关状态。

错误代码:

// ❌ 错误:重置不完整
resetPosition(): void {
  this.characterX = 50;
  // 忘记重置跳跃状态
}

错误表现:

  • 重置后人物继续跳跃
  • 重置后移动方向错误
  • 状态显示与实际不符

解决方案:

// ✅ 正确:完整重置所有状态
resetPosition(): void {
  this.characterX = 50;
  this.moveDirection = 'right';
  this.isWalking = true;
  this.isJumping = false;
  this.jumpPhase = 0;
  this.jumpHeight = 0;
  this.walkPhase = 0;
  this.leftLegAngle = 0;
  this.rightLegAngle = 0;
  this.leftArmAngle = 0;
  this.rightArmAngle = 0;
  this.bodyBob = 0;
  this.groundOffset = 0;
}

七、性能问题类异常

7.1 异常一:频繁方向切换导致性能下降

问题描述:

快速频繁地切换移动方向导致不必要的状态更新和重绘。

错误代码:

// ❌ 错误:没有防抖处理
goForward(): void {
  this.moveDirection = 'right';
  this.isWalking = true;
}

goBackward(): void {
  this.moveDirection = 'left';
  this.isWalking = true;
}

错误表现:

  • 频繁的状态更新导致重绘
  • CPU 占用率升高
  • 动画出现卡顿

解决方案:

// ✅ 正确:添加防抖处理
private debounceTimer: number = 0;

goForward(): void {
  if (this.debounceTimer > 0) {
    clearTimeout(this.debounceTimer);
  }
  
  this.debounceTimer = setTimeout(() => {
    this.moveDirection = 'right';
    this.isWalking = true;
    this.debounceTimer = 0;
  }, 100);  // 100ms 防抖
}

goBackward(): void {
  if (this.debounceTimer > 0) {
    clearTimeout(this.debounceTimer);
  }
  
  this.debounceTimer = setTimeout(() => {
    this.moveDirection = 'left';
    this.isWalking = true;
    this.debounceTimer = 0;
  }, 100);
}

7.2 异常二:状态更新过于频繁

问题描述:

状态更新频率过高导致性能问题。

错误代码:

// ❌ 错误:所有定时器都使用最高频率
this.walkTimer = setInterval(() => { /* 姿态 */ }, 16);
this.moveTimer = setInterval(() => { /* 移动 */ }, 16);
this.groundTimer = setInterval(() => { /* 地面 */ }, 16);
this.cloudTimer = setInterval(() => { /* 云朵 */ }, 16);

错误表现:

  • CPU 占用率过高
  • 电池消耗快
  • 可能导致发热

解决方案:

// ✅ 正确:根据需求设置不同频率
// 姿态动画:16ms(60fps)- 需要平滑
this.walkTimer = setInterval(() => { /* 姿态 */ }, 16);

// 位置移动:30ms(33fps)- 中等精度
this.moveTimer = setInterval(() => { /* 移动 */ }, 30);

// 地面滚动:20ms(50fps)- 中等精度
this.groundTimer = setInterval(() => { /* 地面 */ }, 20);

// 云朵移动:50ms(20fps)- 低精度即可
this.cloudTimer = setInterval(() => { /* 云朵 */ }, 50);

八、用户交互类异常

8.1 异常一:按钮状态显示与实际不符

问题描述:

按钮的视觉状态与实际状态不一致。

错误代码:

// ❌ 错误:按钮状态没有根据方向更新
Button('◀ 后退')
  .backgroundColor('rgba(255,255,255,0.15)')
  .fontColor('#ffffff');

Button('前进 ▶')
  .backgroundColor('rgba(255,255,255,0.15)')
  .fontColor('#ffffff');

错误表现:

  • 用户无法直观看到当前移动方向
  • 按钮始终显示相同状态
  • 操作反馈不明确

解决方案:

// ✅ 正确:按钮状态根据方向动态更新
Button('◀ 后退')
  .width(100)
  .height(45)
  .backgroundColor(this.moveDirection === 'left' ? 'rgba(34,197,94,0.3)' : 'rgba(255,255,255,0.15)')
  .fontColor(this.moveDirection === 'left' ? '#22c55e' : '#ffffff')
  .borderRadius(22)
  .border({ width: 1, color: this.moveDirection === 'left' ? '#22c55e' : 'rgba(255,255,255,0.3)' });

Button('前进 ▶')
  .width(100)
  .height(45)
  .backgroundColor(this.moveDirection === 'right' ? 'rgba(34,197,94,0.3)' : 'rgba(255,255,255,0.15)')
  .fontColor(this.moveDirection === 'right' ? '#22c55e' : '#ffffff')
  .borderRadius(22)
  .border({ width: 1, color: this.moveDirection === 'right' ? '#22c55e' : 'rgba(255,255,255,0.3)' });

8.2 异常二:跳跃按钮状态管理

问题描述:

跳跃按钮在跳跃过程中仍可点击,导致重复触发。

错误代码:

// ❌ 错误:没有禁用跳跃按钮
Button('🦘 跳跃')
  .onClick(() => {
    this.jump();
  });

错误表现:

  • 跳跃过程中点击按钮会再次触发跳跃
  • 跳跃高度异常
  • 状态混乱

解决方案:

// ✅ 正确:跳跃过程中禁用按钮
Button(this.isJumping ? '⏳ 跳跃中...' : '🦘 跳跃')
  .width(140)
  .height(45)
  .backgroundColor(this.isJumping ? 'rgba(168,85,247,0.3)' : 'rgba(168,85,247,0.2)')
  .fontColor(this.isJumping ? '#a855f7' : '#ffffff')
  .borderRadius(22)
  .border({ width: 1, color: this.isJumping ? '#a855f7' : 'rgba(168,85,247,0.5)' })
  .enabled(!this.isJumping)  // 跳跃中禁用按钮
  .onClick(() => {
    this.jump();
  });

九、异常处理最佳实践

9.1 状态管理最佳实践

Do’s(应该做):

// ✅ 显式初始化所有状态
@State moveDirection: string = 'right';
@State characterX: number = 50;

// ✅ 完整更新状态
goForward(): void {
  this.moveDirection = 'right';
  this.isWalking = true;
}

// ✅ 添加有效性检查
if (this.moveDirection === 'right' || this.moveDirection === 'left') {
  // 执行移动逻辑
}

// ✅ 使用常量定义边界值
const SCREEN_WIDTH: number = 900;
const CHARACTER_WIDTH: number = 50;

Don’ts(不应该做):

// ❌ 不初始化状态
@State moveDirection: string;

// ❌ 部分更新状态
goForward(): void {
  this.moveDirection = 'right';
  // 忘记更新 isWalking
}

// ❌ 硬编码边界值
if (this.characterX > 900) {  // 魔数
  this.characterX = -50;
}

9.2 定时器管理最佳实践

Do’s(应该做):

// ✅ 在生命周期中管理定时器
aboutToAppear(): void {
  this.startAllAnimations();
}

aboutToDisappear(): void {
  this.stopAllAnimations();
}

// ✅ 清理时检查定时器是否存在
if (this.moveTimer > 0) {
  clearInterval(this.moveTimer);
  this.moveTimer = 0;
}

// ✅ 根据需求设置频率
setInterval(() => {}, 16);  // 姿态:高精度
setInterval(() => {}, 30);  // 移动:中等精度
setInterval(() => {}, 50);  // 云朵:低精度

Don’ts(不应该做):

// ❌ 不清理定时器
// 没有 aboutToDisappear 方法

// ❌ 所有定时器使用相同频率
setInterval(() => {}, 16);  // 所有都用 16ms

// ❌ 不检查定时器状态
clearInterval(this.moveTimer);  // 可能为 undefined

9.3 错误处理最佳实践

Do’s(应该做):

// ✅ 添加日志记录
console.info('Moving forward, direction:', this.moveDirection);

// ✅ 检查数值有效性
if (isNaN(this.characterX)) {
  console.warn('Invalid position:', this.characterX);
  this.characterX = 50;  // 重置为默认值
}

// ✅ 使用状态锁防止竞态条件
if (this.isProcessing) {
  return;
}

Don’ts(不应该做):

// ❌ 不记录错误信息
// 没有日志

// ❌ 不检查状态
this.characterX = parseInt('invalid');  // 可能返回 NaN

// ❌ 不处理异常情况
try {
  // 可能出错的代码
} catch (err) {
  // 空的 catch 块
}

十、总结

10.1 异常汇总表

异常类型 数量 严重程度 修复优先级
状态管理 4 🔴 高 P0
边界处理 3 🔴 高 P0
定时器同步 3 🟡 中 P1
状态冲突 3 🟡 中 P1
性能问题 2 🟢 低 P2
用户交互 2 🟢 低 P2
总计 17 - -

10.2 核心修复策略

  1. 状态初始化:所有状态变量必须显式初始化
  2. 状态完整性:更新状态时确保所有相关状态同步更新
  3. 边界检测:添加完整的边界检测和循环处理
  4. 生命周期管理:在组件销毁时清理所有定时器
  5. 频率协调:根据需求设置不同的定时器频率
  6. 竞态处理:添加防抖和状态锁防止竞态条件
  7. 错误处理:添加日志记录和异常检测

10.3 测试建议

功能测试:

测试项 测试方法 预期结果
前进功能 点击前进按钮 人物向右移动
后退功能 点击后退按钮 人物向左移动
暂停功能 点击暂停按钮 人物停止移动
跳跃功能 点击跳跃按钮 人物跳起并落地
边界循环 等待人物移出屏幕 人物从另一侧出现

异常测试:

测试项 测试方法 预期结果
快速切换方向 快速点击前进/后退按钮 状态稳定,没有抖动
连续跳跃 跳跃过程中点击跳跃按钮 按钮禁用,不重复触发
页面切换 切换到其他页面再返回 状态正确,没有异常
重置功能 点击重置按钮 所有状态恢复初始值

版本:v1.0
更新时间:2026年6月14日
适用版本:HarmonyOS 6.1 / ArkTS 2.0+
相关文件:CharacterWalking.ets

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐