| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /**
- * GameEnd调试补丁
- * 将以下代码添加到GameEnd.ts中对应的方法里,用于诊断墙体血量为0时动画不显示的问题
- */
- // ===== 在GameEnd.ts的start()方法中添加 =====
- console.log('[GameEnd] 🔧 调试信息 - 组件初始化:');
- console.log(' - animationDuration:', this.animationDuration);
- console.log(' - 节点名称:', this.node?.name);
- console.log(' - 节点激活状态:', this.node?.active);
- console.log(' - 节点层级索引:', this.node?.getSiblingIndex());
- if (this.node?.parent) {
- console.log(' - 父节点子节点数量:', this.node.parent.children.length);
- console.log(' - Canvas子节点列表:');
- this.node.parent.children.forEach((child, index) => {
- console.log(` ${index}: ${child.name} (active: ${child.active}, siblingIndex: ${child.getSiblingIndex()})`);
- });
- }
- // ===== 在GameEnd.ts的setupEventListeners()方法中添加 =====
- console.log('[GameEnd] 🎯 调试信息 - 事件监听器注册:');
- console.log(' - EventBus实例:', eventBus);
- console.log(' - 当前组件实例:', this);
- console.log(' - GAME_DEFEAT事件监听器已注册');
- // ===== 在GameEnd.ts的onGameDefeat()方法开始处添加 =====
- console.log('\n🚨 [GameEnd] GAME_DEFEAT事件触发 - 详细调试信息:');
- console.log(' - 触发时间:', new Date().toLocaleTimeString());
- console.log(' - hasProcessedGameEnd:', this.hasProcessedGameEnd);
- console.log(' - 节点激活状态:', this.node?.active);
- console.log(' - 节点层级索引:', this.node?.getSiblingIndex());
- console.log(' - animationDuration:', this.animationDuration);
- // 检查UIOpacity组件
- const uiOpacity = this.node?.getComponent(UIOpacity);
- console.log(' - UIOpacity组件存在:', !!uiOpacity);
- if (uiOpacity) {
- console.log(' - 当前透明度:', uiOpacity.opacity);
- }
- // 检查节点缩放
- if (this.node) {
- console.log(' - 当前缩放:', this.node.scale);
- console.log(' - 当前位置:', this.node.position);
- }
- // 检查是否被其他UI遮挡
- if (this.node?.parent) {
- const higherLevelPanels = this.node.parent.children.filter(child =>
- child.getSiblingIndex() > this.node.getSiblingIndex() && child.active && child !== this.node
- );
- if (higherLevelPanels.length > 0) {
- console.log(' - ⚠️ 发现更高层级的激活面板:');
- higherLevelPanels.forEach(panel => {
- console.log(` - ${panel.name} (siblingIndex: ${panel.getSiblingIndex()})`);
- });
- } else {
- console.log(' - ✅ 没有更高层级的面板遮挡');
- }
- }
- // ===== 在GameEnd.ts的showEndPanelWithAnimation()方法开始处添加 =====
- console.log('[GameEnd] 🎬 showEndPanelWithAnimation调试:');
- console.log(' - 方法被调用时间:', new Date().toLocaleTimeString());
- console.log(' - 节点激活状态:', this.node?.active);
- console.log(' - animationDuration:', this.animationDuration);
- // ===== 在GameEnd.ts的playShowAnimation()方法开始处添加 =====
- console.log('[GameEnd] 🎭 playShowAnimation调试:');
- console.log(' - 动画开始时间:', new Date().toLocaleTimeString());
- console.log(' - 节点存在:', !!this.node);
- if (this.node) {
- console.log(' - 动画前节点状态:');
- console.log(' - 激活:', this.node.active);
- console.log(' - 缩放:', this.node.scale);
- console.log(' - 位置:', this.node.position);
-
- const uiOpacity = this.node.getComponent(UIOpacity);
- console.log(' - UIOpacity存在:', !!uiOpacity);
- if (uiOpacity) {
- console.log(' - 透明度:', uiOpacity.opacity);
- }
- }
- // ===== 在tween动画的.call()回调中添加 =====
- // 替换原有的缩放动画为:
- tween(this.node)
- .to(this.animationDuration, {
- scale: new Vec3(1, 1, 1)
- }, {
- easing: 'backOut'
- })
- .call(() => {
- console.log('[GameEnd] ✨ 缩放动画完成 - 详细状态:');
- console.log(' - 完成时间:', new Date().toLocaleTimeString());
- console.log(' - 节点激活:', this.node?.active);
- console.log(' - 最终缩放:', this.node?.scale);
- console.log(' - 最终位置:', this.node?.position);
-
- const uiOpacity = this.node?.getComponent(UIOpacity);
- if (uiOpacity) {
- console.log(' - 最终透明度:', uiOpacity.opacity);
- }
-
- // 检查节点是否真的可见
- if (this.node) {
- const isVisible = this.node.active &&
- this.node.scale.x > 0.1 &&
- this.node.scale.y > 0.1 &&
- (uiOpacity?.opacity || 0) > 10;
- console.log(' - 计算可见性:', isVisible);
- }
- })
- .start();
- // 替换原有的透明度动画为:
- tween(uiOpacity)
- .to(this.animationDuration, {
- opacity: 255
- })
- .call(() => {
- console.log('[GameEnd] ✨ 透明度动画完成:');
- console.log(' - 完成时间:', new Date().toLocaleTimeString());
- console.log(' - 最终透明度:', uiOpacity?.opacity);
- })
- .start();
- // ===== 在Wall.ts的onWallDestroyed()方法中添加 =====
- console.log('\n🧱 [Wall] 墙体被摧毁调试信息:');
- console.log(' - 摧毁时间:', new Date().toLocaleTimeString());
- console.log(' - 当前血量:', this.currentHealth);
- console.log(' - EventBus实例:', eventBus);
- console.log(' - 即将触发GAME_DEFEAT事件');
- // 在触发事件后添加:
- eventBus.emit(GameEvents.GAME_DEFEAT);
- console.log(' - ✅ GAME_DEFEAT事件已触发');
- // ===== 强制显示测试代码(添加到onGameDefeat方法中,用于快速验证) =====
- // 在onGameDefeat方法的最后添加这段强制显示代码:
- console.log('[GameEnd] 🧪 强制显示测试:');
- if (this.node) {
- // 强制设置节点状态
- this.node.active = true;
- this.node.setScale(1, 1, 1);
- this.node.setPosition(0, 0, 0);
-
- const uiOpacity = this.node.getComponent(UIOpacity);
- if (uiOpacity) {
- uiOpacity.opacity = 255;
- }
-
- console.log(' - 强制显示完成,节点状态:');
- console.log(' - 激活:', this.node.active);
- console.log(' - 缩放:', this.node.scale);
- console.log(' - 位置:', this.node.position);
- console.log(' - 透明度:', uiOpacity?.opacity);
-
- // 延迟检查是否真的显示了
- setTimeout(() => {
- console.log('[GameEnd] 🔍 强制显示后延迟检查:');
- console.log(' - 节点仍然激活:', this.node?.active);
- console.log(' - 缩放保持:', this.node?.scale);
- console.log(' - 透明度保持:', this.node?.getComponent(UIOpacity)?.opacity);
- }, 100);
- }
- // ===== 使用说明 =====
- /*
- 使用步骤:
- 1. 将上述对应的代码片段添加到GameEnd.ts和Wall.ts的相应方法中
- 2. 在Cocos Creator中重新编译项目
- 3. 运行游戏并让墙体血量归零
- 4. 查看控制台输出,重点关注:
- - GAME_DEFEAT事件是否被触发
- - GameEnd组件是否接收到事件
- - showEndPanelWithAnimation是否被调用
- - 动画是否正确执行
- - 强制显示测试是否有效
- 如果强制显示有效,说明问题在动画系统;
- 如果强制显示无效,说明问题在节点配置或UI层级。
- 常见问题排查:
- 1. animationDuration为0 → 动画不执行
- 2. 节点被其他UI遮挡 → 检查siblingIndex
- 3. UIOpacity组件缺失 → 透明度控制失效
- 4. EventBus实例不一致 → 事件监听失效
- 5. 节点在运行时被其他脚本修改 → 检查其他组件
- */
|