| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- /**
- * 墙体血量为0失败场景调试测试
- * 模拟实际游戏中墙体血量为0的情况,检查GameEnd动画是否正常触发
- */
- // 模拟事件系统
- class MockEventBus {
- constructor() {
- this.listeners = new Map();
- this.eventLog = [];
- }
-
- on(event, callback, context) {
- if (!this.listeners.has(event)) {
- this.listeners.set(event, []);
- }
- this.listeners.get(event).push({ callback, context });
- console.log(`[EventBus] 注册事件监听器: ${event}`);
- }
-
- emit(event, ...args) {
- console.log(`[EventBus] 触发事件: ${event}`);
- this.eventLog.push({ event, timestamp: Date.now(), args });
-
- if (this.listeners.has(event)) {
- const listeners = this.listeners.get(event);
- listeners.forEach(({ callback, context }) => {
- try {
- callback.call(context, ...args);
- } catch (error) {
- console.error(`[EventBus] 事件处理错误 ${event}:`, error);
- }
- });
- }
- }
-
- getEventLog() {
- return this.eventLog;
- }
- }
- // 模拟GameEvents
- const GameEvents = {
- GAME_DEFEAT: 'GAME_DEFEAT',
- GAME_RESUME: 'GAME_RESUME',
- GAME_START: 'GAME_START'
- };
- // 模拟Wall组件
- class MockWall {
- constructor(eventBus) {
- this.eventBus = eventBus;
- this.currentHealth = 100;
- this.maxHealth = 100;
- }
-
- takeDamage(damage) {
- console.log(`[Wall] 受到伤害: ${damage}, 当前血量: ${this.currentHealth}`);
- this.currentHealth -= damage;
-
- if (this.currentHealth <= 0) {
- console.log('[Wall] 墙体血量为0,调用onWallDestroyed');
- this.onWallDestroyed();
- }
- }
-
- onWallDestroyed() {
- console.log('[Wall] 墙体被摧毁,触发GAME_DEFEAT事件');
- this.eventBus.emit(GameEvents.GAME_DEFEAT);
- }
- }
- // 模拟GameEnd组件
- class MockGameEnd {
- constructor(eventBus) {
- this.eventBus = eventBus;
- this.animationCount = 0;
- this.isVisible = false;
- this.setupEventListeners();
- }
-
- setupEventListeners() {
- console.log('[GameEnd] 设置事件监听器');
- this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
- this.eventBus.on(GameEvents.GAME_START, this.onGameStart, this);
- }
-
- onGameDefeat() {
- console.log('[GameEnd] 接收到GAME_DEFEAT事件');
- console.log('[GameEnd] 游戏失败事件处理,开始统一处理流程');
-
- // 模拟GameEnd的处理逻辑
- this.calculateAndShowRewards();
- }
-
- calculateAndShowRewards() {
- console.log('[GameEnd] 计算和显示奖励');
- this.showEndPanelWithAnimation();
- }
-
- showEndPanelWithAnimation() {
- console.log('[GameEnd] 开始显示结算面板动画');
- this.animationCount++;
- this.isVisible = true;
- console.log(`[GameEnd] GameEnd面板弹出动画第${this.animationCount}次执行`);
- }
-
- onGameStart() {
- console.log('[GameEnd] 收到游戏开始事件,重置奖励显示');
- this.animationCount = 0;
- this.isVisible = false;
- }
-
- getStatus() {
- return {
- animationCount: this.animationCount,
- isVisible: this.isVisible
- };
- }
- }
- // 模拟其他可能干扰的组件
- class MockGameManager {
- constructor(eventBus) {
- this.eventBus = eventBus;
- this.gameState = 'PLAYING';
- this.setupEventListeners();
- }
-
- setupEventListeners() {
- this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
- }
-
- onGameDefeat() {
- console.log('[GameManager] 接收到GAME_DEFEAT事件');
- this.gameState = 'DEFEAT';
- console.log('[GameManager] 游戏状态切换为DEFEAT');
- }
- }
- // 模拟InGameManager
- class MockInGameManager {
- constructor(eventBus) {
- this.eventBus = eventBus;
- this.currentState = 'PLAYING';
- this.setupEventListeners();
- }
-
- setupEventListeners() {
- this.eventBus.on(GameEvents.GAME_DEFEAT, this.onGameDefeat, this);
- }
-
- onGameDefeat() {
- console.log('[InGameManager] 接收到GAME_DEFEAT事件');
- this.currentState = 'DEFEAT';
- console.log('[InGameManager] 游戏状态切换为DEFEAT');
- }
-
- getCurrentState() {
- return this.currentState;
- }
- }
- // 测试函数
- function testWallDefeatScenario() {
- console.log('\n=== 墙体血量为0失败场景测试 ===');
-
- // 创建事件系统
- const eventBus = new MockEventBus();
-
- // 创建组件
- const wall = new MockWall(eventBus);
- const gameEnd = new MockGameEnd(eventBus);
- const gameManager = new MockGameManager(eventBus);
- const inGameManager = new MockInGameManager(eventBus);
-
- console.log('\n--- 初始状态 ---');
- console.log('墙体血量:', wall.currentHealth);
- console.log('GameEnd状态:', gameEnd.getStatus());
-
- console.log('\n--- 模拟墙体受到致命伤害 ---');
- wall.takeDamage(100); // 造成致命伤害
-
- console.log('\n--- 检查结果 ---');
- const gameEndStatus = gameEnd.getStatus();
- console.log('GameEnd动画执行次数:', gameEndStatus.animationCount);
- console.log('GameEnd是否可见:', gameEndStatus.isVisible);
- console.log('GameManager状态:', gameManager.gameState);
- console.log('InGameManager状态:', inGameManager.getCurrentState());
-
- console.log('\n--- 事件日志 ---');
- const eventLog = eventBus.getEventLog();
- eventLog.forEach((log, index) => {
- console.log(`${index + 1}. 事件: ${log.event}, 时间: ${new Date(log.timestamp).toLocaleTimeString()}`);
- });
-
- console.log('\n--- 测试结果分析 ---');
- if (gameEndStatus.animationCount === 1 && gameEndStatus.isVisible) {
- console.log('✅ 墙体血量为0成功触发GameEnd动画');
- } else if (gameEndStatus.animationCount === 0) {
- console.log('❌ 墙体血量为0未触发GameEnd动画');
- } else if (gameEndStatus.animationCount > 1) {
- console.log(`❌ GameEnd动画被重复触发${gameEndStatus.animationCount}次`);
- }
-
- const defeatEvents = eventLog.filter(log => log.event === GameEvents.GAME_DEFEAT);
- console.log(`GAME_DEFEAT事件触发次数: ${defeatEvents.length}`);
-
- const resumeEvents = eventLog.filter(log => log.event === GameEvents.GAME_RESUME);
- console.log(`GAME_RESUME事件触发次数: ${resumeEvents.length}`);
-
- return {
- success: gameEndStatus.animationCount === 1 && gameEndStatus.isVisible,
- animationCount: gameEndStatus.animationCount,
- defeatEventCount: defeatEvents.length,
- resumeEventCount: resumeEvents.length
- };
- }
- // 运行测试
- const result = testWallDefeatScenario();
- console.log('\n=== 最终测试结果 ===');
- console.log('测试通过:', result.success);
- console.log('动画执行次数:', result.animationCount);
- console.log('GAME_DEFEAT事件次数:', result.defeatEventCount);
- console.log('GAME_RESUME事件次数:', result.resumeEventCount);
- if (result.success) {
- console.log('\n🎉 墙体血量为0的失败处理流程正常工作!');
- } else {
- console.log('\n⚠️ 墙体血量为0的失败处理流程存在问题,需要进一步调试。');
- }
|