test_wall_defeat_debug.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /**
  2. * 墙体血量为0失败场景调试测试
  3. * 模拟实际游戏中墙体血量为0的情况,检查GameEnd动画是否正常触发
  4. */
  5. // 模拟事件系统
  6. class MockEventBus {
  7. constructor() {
  8. this.listeners = new Map();
  9. this.eventLog = [];
  10. }
  11. on(event, callback, context) {
  12. if (!this.listeners.has(event)) {
  13. this.listeners.set(event, []);
  14. }
  15. this.listeners.get(event).push({ callback, context });
  16. console.log(`[EventBus] 注册事件监听器: ${event}`);
  17. }
  18. emit(event, ...args) {
  19. console.log(`[EventBus] 触发事件: ${event}`);
  20. this.eventLog.push({ event, timestamp: Date.now(), args });
  21. if (this.listeners.has(event)) {
  22. const listeners = this.listeners.get(event);
  23. listeners.forEach(({ callback, context }) => {
  24. try {
  25. callback.call(context, ...args);
  26. } catch (error) {
  27. console.error(`[EventBus] 事件处理错误 ${event}:`, error);
  28. }
  29. });
  30. }
  31. }
  32. getEventLog() {
  33. return this.eventLog;
  34. }
  35. }
  36. // 模拟GameEvents
  37. const GameEvents = {
  38. GAME_DEFEAT: 'GAME_DEFEAT',
  39. GAME_RESUME: 'GAME_RESUME',
  40. GAME_START: 'GAME_START'
  41. };
  42. // 模拟Wall组件
  43. class MockWall {
  44. constructor(eventBus) {
  45. this.eventBus = eventBus;
  46. this.currentHealth = 100;
  47. this.maxHealth = 100;
  48. }
  49. takeDamage(damage) {
  50. console.log(`[Wall] 受到伤害: ${damage}, 当前血量: ${this.currentHealth}`);
  51. this.currentHealth -= damage;
  52. if (this.currentHealth <= 0) {
  53. console.log('[Wall] 墙体血量为0,调用onWallDestroyed');
  54. this.onWallDestroyed();
  55. }
  56. }
  57. onWallDestroyed() {
  58. console.log('[Wall] 墙体被摧毁,触发GAME_DEFEAT事件');
  59. this.eventBus.emit(GameEvents.GAME_DEFEAT);
  60. }
  61. }
  62. // 模拟GameEnd组件
  63. class MockGameEnd {
  64. constructor(eventBus) {
  65. this.eventBus = eventBus;
  66. this.animationCount = 0;
  67. this.isVisible = false;
  68. this.setupEventListeners();
  69. }
  70. setupEventListeners() {
  71. console.log('[GameEnd] 设置事件监听器');
  72. this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
  73. this.eventBus.on(GameEvents.GAME_START, this.onGameStart, this);
  74. }
  75. onGameDefeat() {
  76. console.log('[GameEnd] 接收到GAME_DEFEAT事件');
  77. console.log('[GameEnd] 游戏失败事件处理,开始统一处理流程');
  78. // 模拟GameEnd的处理逻辑
  79. this.calculateAndShowRewards();
  80. }
  81. calculateAndShowRewards() {
  82. console.log('[GameEnd] 计算和显示奖励');
  83. this.showEndPanelWithAnimation();
  84. }
  85. showEndPanelWithAnimation() {
  86. console.log('[GameEnd] 开始显示结算面板动画');
  87. this.animationCount++;
  88. this.isVisible = true;
  89. console.log(`[GameEnd] GameEnd面板弹出动画第${this.animationCount}次执行`);
  90. }
  91. onGameStart() {
  92. console.log('[GameEnd] 收到游戏开始事件,重置奖励显示');
  93. this.animationCount = 0;
  94. this.isVisible = false;
  95. }
  96. getStatus() {
  97. return {
  98. animationCount: this.animationCount,
  99. isVisible: this.isVisible
  100. };
  101. }
  102. }
  103. // 模拟其他可能干扰的组件
  104. class MockGameManager {
  105. constructor(eventBus) {
  106. this.eventBus = eventBus;
  107. this.gameState = 'PLAYING';
  108. this.setupEventListeners();
  109. }
  110. setupEventListeners() {
  111. this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
  112. }
  113. onGameDefeat() {
  114. console.log('[GameManager] 接收到GAME_DEFEAT事件');
  115. this.gameState = 'DEFEAT';
  116. console.log('[GameManager] 游戏状态切换为DEFEAT');
  117. }
  118. }
  119. // 模拟InGameManager
  120. class MockInGameManager {
  121. constructor(eventBus) {
  122. this.eventBus = eventBus;
  123. this.currentState = 'PLAYING';
  124. this.setupEventListeners();
  125. }
  126. setupEventListeners() {
  127. this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
  128. }
  129. onGameDefeat() {
  130. console.log('[InGameManager] 接收到GAME_DEFEAT事件');
  131. this.currentState = 'DEFEAT';
  132. console.log('[InGameManager] 游戏状态切换为DEFEAT');
  133. }
  134. getCurrentState() {
  135. return this.currentState;
  136. }
  137. }
  138. // 测试函数
  139. function testWallDefeatScenario() {
  140. console.log('\n=== 墙体血量为0失败场景测试 ===');
  141. // 创建事件系统
  142. const eventBus = new MockEventBus();
  143. // 创建组件
  144. const wall = new MockWall(eventBus);
  145. const gameEnd = new MockGameEnd(eventBus);
  146. const gameManager = new MockGameManager(eventBus);
  147. const inGameManager = new MockInGameManager(eventBus);
  148. console.log('\n--- 初始状态 ---');
  149. console.log('墙体血量:', wall.currentHealth);
  150. console.log('GameEnd状态:', gameEnd.getStatus());
  151. console.log('\n--- 模拟墙体受到致命伤害 ---');
  152. wall.takeDamage(100); // 造成致命伤害
  153. console.log('\n--- 检查结果 ---');
  154. const gameEndStatus = gameEnd.getStatus();
  155. console.log('GameEnd动画执行次数:', gameEndStatus.animationCount);
  156. console.log('GameEnd是否可见:', gameEndStatus.isVisible);
  157. console.log('GameManager状态:', gameManager.gameState);
  158. console.log('InGameManager状态:', inGameManager.getCurrentState());
  159. console.log('\n--- 事件日志 ---');
  160. const eventLog = eventBus.getEventLog();
  161. eventLog.forEach((log, index) => {
  162. console.log(`${index + 1}. 事件: ${log.event}, 时间: ${new Date(log.timestamp).toLocaleTimeString()}`);
  163. });
  164. console.log('\n--- 测试结果分析 ---');
  165. if (gameEndStatus.animationCount === 1 && gameEndStatus.isVisible) {
  166. console.log('✅ 墙体血量为0成功触发GameEnd动画');
  167. } else if (gameEndStatus.animationCount === 0) {
  168. console.log('❌ 墙体血量为0未触发GameEnd动画');
  169. } else if (gameEndStatus.animationCount > 1) {
  170. console.log(`❌ GameEnd动画被重复触发${gameEndStatus.animationCount}次`);
  171. }
  172. const defeatEvents = eventLog.filter(log => log.event === GameEvents.GAME_DEFEAT);
  173. console.log(`GAME_DEFEAT事件触发次数: ${defeatEvents.length}`);
  174. const resumeEvents = eventLog.filter(log => log.event === GameEvents.GAME_RESUME);
  175. console.log(`GAME_RESUME事件触发次数: ${resumeEvents.length}`);
  176. return {
  177. success: gameEndStatus.animationCount === 1 && gameEndStatus.isVisible,
  178. animationCount: gameEndStatus.animationCount,
  179. defeatEventCount: defeatEvents.length,
  180. resumeEventCount: resumeEvents.length
  181. };
  182. }
  183. // 运行测试
  184. const result = testWallDefeatScenario();
  185. console.log('\n=== 最终测试结果 ===');
  186. console.log('测试通过:', result.success);
  187. console.log('动画执行次数:', result.animationCount);
  188. console.log('GAME_DEFEAT事件次数:', result.defeatEventCount);
  189. console.log('GAME_RESUME事件次数:', result.resumeEventCount);
  190. if (result.success) {
  191. console.log('\n🎉 墙体血量为0的失败处理流程正常工作!');
  192. } else {
  193. console.log('\n⚠️ 墙体血量为0的失败处理流程存在问题,需要进一步调试。');
  194. }